diff --git a/.github/workflows/master_build.yml b/.github/workflows/master_build.yml
index ee6ef88d0e..685c5c9524 100644
--- a/.github/workflows/master_build.yml
+++ b/.github/workflows/master_build.yml
@@ -35,7 +35,7 @@ jobs:
include:
- os: ubuntu-18.04
build_type: full
- apt-dependencies: mesa-common-dev libegl1 libglvnd-dev libdouble-conversion1 libpulse0
+ apt-dependencies: mesa-common-dev libegl1 libglvnd-dev libdouble-conversion1 libpulse0 libsnappy1v5 libwebpdemux2 libwebpmux3
fail-fast: false
runs-on: ${{matrix.os}}
steps:
@@ -50,6 +50,7 @@ jobs:
echo "UPLOAD_PREFIX=master" >> $GITHUB_ENV
echo ::set-output name=github_sha_short::`echo $GIT_COMMIT | cut -c1-7`
echo "JOB_NAME=build (${{matrix.os}}, ${{matrix.build_type}})" >> $GITHUB_ENV
+ echo "APP_TARGET_NAME=$APP_NAME" >> $GITHUB_ENV
# Linux build variables
if [[ "${{ matrix.os }}" = "ubuntu-"* ]]; then
echo "PYTHON_EXEC=python3" >> $GITHUB_ENV
@@ -65,6 +66,7 @@ jobs:
echo "INSTALLER_EXT=dmg" >> $GITHUB_ENV
echo "CMAKE_EXTRA=-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED=OFF -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -G Xcode" >> $GITHUB_ENV
echo "::set-output name=symbols_archive::${BUILD_NUMBER}-${{ matrix.build_type }}-mac-symbols.zip"
+ echo "APP_TARGET_NAME=Vircadia" >> $GITHUB_ENV
fi
# Windows build variables
if [ "${{ matrix.os }}" = "windows-latest" ]; then
@@ -126,7 +128,7 @@ jobs:
- name: Build application
working-directory: ${{runner.workspace}}/build
shell: bash
- run: cmake --build . --config $BUILD_TYPE --target $APP_NAME $CMAKE_BUILD_EXTRA
+ run: cmake --build . --config $BUILD_TYPE --target $APP_TARGET_NAME $CMAKE_BUILD_EXTRA
- name: Build domain server
working-directory: ${{runner.workspace}}/build
shell: bash
diff --git a/.github/workflows/pr_build.yml b/.github/workflows/pr_build.yml
index 9d6984b5b2..606209725b 100644
--- a/.github/workflows/pr_build.yml
+++ b/.github/workflows/pr_build.yml
@@ -36,9 +36,11 @@ jobs:
build_type: full
- os: macOS-latest
build_type: full
+ - os: macOS-latest
+ build_type: client
- os: ubuntu-18.04
build_type: full
- apt-dependencies: mesa-common-dev libegl1 libglvnd-dev libdouble-conversion1 libpulse0
+ apt-dependencies: mesa-common-dev libegl1 libglvnd-dev libdouble-conversion1 libpulse0 libsnappy1v5 libwebpdemux2 libwebpmux3
- os: ubuntu-18.04
build_type: android
apt-dependencies: mesa-common-dev libegl1 libglvnd-dev libdouble-conversion1 libpulse0
@@ -52,25 +54,39 @@ jobs:
run: |
echo ::set-output name=github_sha_short::`echo $GIT_COMMIT | cut -c1-7`
echo "JOB_NAME=build (${{matrix.os}}, ${{matrix.build_type}})" >> $GITHUB_ENV
+ echo "APP_TARGET_NAME=$APP_NAME" >> $GITHUB_ENV
# Linux build variables
if [[ "${{ matrix.os }}" = "ubuntu-"* ]]; then
echo "PYTHON_EXEC=python3" >> $GITHUB_ENV
echo "INSTALLER_EXT=*" >> $GITHUB_ENV
echo "CMAKE_BUILD_EXTRA=-- -j3" >> $GITHUB_ENV
- echo "CMAKE_EXTRA=-DBUILD_TOOLS:BOOLEAN=FALSE -DHIFI_PYTHON_EXEC:FILEPATH=$(which python3)" >> $GITHUB_ENV
+ if [ "${{ matrix.build_type }}" = "full" ]; then
+ echo "CMAKE_EXTRA=-DBUILD_TOOLS:BOOLEAN=FALSE -DHIFI_PYTHON_EXEC:FILEPATH=$(which python3)" >> $GITHUB_ENV
+ else
+ echo "CMAKE_EXTRA=-DCLIENT_ONLY=1 -DBUILD_TOOLS:BOOLEAN=FALSE -DHIFI_PYTHON_EXEC:FILEPATH=$(which python3)" >> $GITHUB_ENV
+ fi
fi
# Mac build variables
if [ "${{ matrix.os }}" = "macOS-latest" ]; then
echo "PYTHON_EXEC=python3" >> $GITHUB_ENV
echo "INSTALLER_EXT=dmg" >> $GITHUB_ENV
- echo "CMAKE_EXTRA=-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED=OFF -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -G Xcode" >> $GITHUB_ENV
+ if [ "${{ matrix.build_type }}" = "full" ]; then
+ echo "CMAKE_EXTRA=-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED=OFF -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -G Xcode" >> $GITHUB_ENV
+ else
+ echo "CMAKE_EXTRA=-DCLIENT_ONLY=1 -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED=OFF -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -G Xcode" >> $GITHUB_ENV
+ fi
+ echo "APP_TARGET_NAME=Vircadia" >> $GITHUB_ENV
fi
# Windows build variables
if [ "${{ matrix.os }}" = "windows-latest" ]; then
echo "PYTHON_EXEC=python" >> $GITHUB_ENV
echo "INSTALLER_EXT=exe" >> $GITHUB_ENV
- echo "CMAKE_EXTRA=-A x64" >> $GITHUB_ENV
+ if [ "${{ matrix.build_type }}" = "full" ]; then
+ echo "CMAKE_EXTRA=-A x64" >> $GITHUB_ENV
+ else
+ echo "CMAKE_EXTRA=-A x64 -DCLIENT_ONLY=1" >> $GITHUB_ENV
+ fi
fi
# Android + Quest build variables
if [[ "${{ matrix.build_type }}" == "android" ]]; then
@@ -86,9 +102,13 @@ jobs:
echo "${{ steps.buildenv1.outputs.symbols_archive }}"
echo "GIT_COMMIT_SHORT=${{ steps.buildenv1.outputs.github_sha_short }}" >> $GITHUB_ENV
if [[ "${{ matrix.build_type }}" != "android" ]]; then
- echo "ARTIFACT_PATTERN=Vircadia-PR${{ github.event.number }}-*.$INSTALLER_EXT" >> $GITHUB_ENV
- # Build type variables
- echo "INSTALLER=Vircadia-$RELEASE_NUMBER-$GIT_COMMIT_SHORT.$INSTALLER_EXT" >> $GITHUB_ENV
+ if [ "${{ matrix.build_type }}" = "full" ]; then
+ echo "ARTIFACT_PATTERN=Vircadia-PR${{ github.event.number }}-*.$INSTALLER_EXT" >> $GITHUB_ENV
+ echo "INSTALLER=Vircadia-$RELEASE_NUMBER-$GIT_COMMIT_SHORT.$INSTALLER_EXT" >> $GITHUB_ENV
+ else
+ echo "ARTIFACT_PATTERN=Vircadia-Interface-PR${{ github.event.number }}-*.$INSTALLER_EXT" >> $GITHUB_ENV
+ echo "INSTALLER=Vircadia-Interface-$RELEASE_NUMBER-$GIT_COMMIT_SHORT.$INSTALLER_EXT" >> $GITHUB_ENV
+ fi
else
echo "ARTIFACT_PATTERN=*.$INSTALLER_EXT" >> $GITHUB_ENV
fi
@@ -124,7 +144,7 @@ jobs:
if: matrix.build_type == 'full' || matrix.build_type == 'client'
working-directory: ${{runner.workspace}}/build
shell: bash
- run: cmake --build . --config $BUILD_TYPE --target $APP_NAME $CMAKE_BUILD_EXTRA
+ run: cmake --build . --config $BUILD_TYPE --target $APP_TARGET_NAME $CMAKE_BUILD_EXTRA
- name: Build Domain Server
if: matrix.build_type == 'full'
working-directory: ${{runner.workspace}}/build
@@ -136,7 +156,7 @@ jobs:
shell: bash
run: cmake --build . --config $BUILD_TYPE --target assignment-client $CMAKE_BUILD_EXTRA
- name: Build Console
- if: matrix.build_type == 'full'
+ if: matrix.build_type == 'full' || matrix.os == 'windows-latest'
working-directory: ${{runner.workspace}}/build
shell: bash
run: cmake --build . --config $BUILD_TYPE --target packaged-server-console $CMAKE_BUILD_EXTRA
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000000..c8cdef6d56
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "vircadia-web"]
+ path = vircadia-web
+ url = ../vircadia-web.git
\ No newline at end of file
diff --git a/BUILD.md b/BUILD.md
index c3bebb749b..82da773f08 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -1,76 +1,100 @@
# General Build Information
-*Last Updated on December 21, 2020*
+*Last Updated on March 8, 2021*
-### OS Specific Build Guides
+## OS Specific Build Guides
* [Build Windows](BUILD_WIN.md) - complete instructions for Windows.
* [Build Linux](BUILD_LINUX.md) - additional instructions for Linux.
* [Build OSX](BUILD_OSX.md) - additional instructions for OS X.
* [Build Android](BUILD_ANDROID.md) - additional instructions for Android.
-### Dependencies
-- [git](https://git-scm.com/downloads): >= 1.6
-- [CMake](https://cmake.org/download/): 3.9
+## Dependencies
+- [git](https://git-scm.com/downloads): >= 1.6
+- [CMake](https://cmake.org/download/): 3.9 (or greater up to 3.18.x)
- [Python](https://www.python.org/downloads/): 3.6 or higher
- [Node.JS](https://nodejs.org/en/): >= 12.13.1 LTS
- Used to build the Screen Sharing executable.
-### CMake External Project Dependencies
+## CMake External Project Dependencies
These dependencies need not be installed manually. They are automatically downloaded on the platforms where they are required.
-- [Bullet Physics Engine](https://github.com/bulletphysics/bullet3/releases): 2.83
-- [glm](https://glm.g-truc.net/0.9.8/index.html): 0.9.8
-- [Oculus SDK](https://developer.oculus.com/downloads/): 1.11 (Windows) / 0.5 (Mac)
-- [OpenVR](https://github.com/ValveSoftware/openvr): 1.11.11 (Windows, Linux)
-- [Polyvox](http://www.volumesoffun.com/): 0.2.1
-- [QuaZip](https://sourceforge.net/projects/quazip/files/quazip/): 0.7.3
-- [SDL2](https://www.libsdl.org/download-2.0.php): 2.0.3
-- [Intel Threading Building Blocks](https://www.threadingbuildingblocks.org/): 4.3
-- [vcpkg](https://github.com/hifi-archive/vcpkg):
-- [VHACD](https://github.com/virneo/v-hacd)
-- [zlib](http://www.zlib.net/): 1.28 (Win32 only)
-- [nvtt](https://github.com/hifi-archive/nvidia-texture-tools): 2.1.1 (customized)
+- [Bullet Physics Engine](https://github.com/bulletphysics/bullet3/releases): 2.83
+- [glm](https://glm.g-truc.net/0.9.8/index.html): 0.9.8
+- [Oculus SDK](https://developer.oculus.com/downloads/): 1.11 (Windows) / 0.5 (Mac)
+- [OpenVR](https://github.com/ValveSoftware/openvr): 1.11.11 (Windows, Linux)
+- [Polyvox](http://www.volumesoffun.com/): 0.2.1
+- [QuaZip](https://sourceforge.net/projects/quazip/files/quazip/): 0.7.3
+- [SDL2](https://www.libsdl.org/download-2.0.php): 2.0.3
+- [Intel Threading Building Blocks](https://www.threadingbuildingblocks.org/): 4.3
+- [vcpkg](https://github.com/hifi-archive/vcpkg):
+- [VHACD](https://github.com/virneo/v-hacd)
+- [zlib](http://www.zlib.net/): 1.28 (Win32 only)
+- [nvtt](https://github.com/hifi-archive/nvidia-texture-tools): 2.1.1 (customized)
The above dependencies will be downloaded, built, linked and included automatically by CMake where we require them. The CMakeLists files that handle grabbing each of the following external dependencies can be found in the [cmake/externals folder](cmake/externals). The resulting downloads, source files and binaries will be placed in the `build/ext` folder in each of the subfolders for each external project.
These are not placed in your normal build tree when doing an out of source build so that they do not need to be re-downloaded and re-compiled every time the CMake build folder is cleared. Should you want to force a re-download and re-compile of a specific external, you can simply remove that directory from the appropriate subfolder in `build/ext`. Should you want to force a re-download and re-compile of all externals, just remove the `build/ext` folder.
-#### CMake
+### CMake
Vircadia uses CMake to generate build files and project files for your platform.
-#### Qt
+### Qt
-CMake will download Qt 5.12.3 using vcpkg.
+CMake will download Qt 5.15.2 using vcpkg.
-To override this (i.e. use an installed Qt configuration - you will need to set a QT_CMAKE_PREFIX_PATH environment variable pointing to your Qt **lib/cmake** folder.
-This can either be entered directly into your shell session before you build or in your shell profile (e.g.: ~/.bash_profile, ~/.bashrc, ~/.zshrc - this depends on your shell and environment). The path it needs to be set to will depend on where and how Qt5 was installed. e.g.
+To override this - i.e., use an installed Qt configuration - you need to set a QT_CMAKE_PREFIX_PATH environment variable pointing to your Qt **lib/cmake** folder.
+This can either be entered directly into your shell session before you build or in your shell profile (e.g.: ~/.bash_profile, ~/.bashrc, ~/.zshrc - this depends on your shell and environment). The path it needs to be set to will depend on where and how Qt5 was installed.
+For example, under Linux:
```bash
-export QT_CMAKE_PREFIX_PATH=/usr/local/Qt5.12.3/gcc_64/lib/cmake
-export QT_CMAKE_PREFIX_PATH=/usr/local/qt/5.12.3/clang_64/lib/cmake/
-export QT_CMAKE_PREFIX_PATH=/usr/local/Cellar/qt5/5.12.3/lib/cmake
+export QT_CMAKE_PREFIX_PATH=/usr/local/Qt5.15.2/gcc_64/lib/cmake
+export QT_CMAKE_PREFIX_PATH=/usr/local/qt/5.15.2/clang_64/lib/cmake/
+export QT_CMAKE_PREFIX_PATH=/usr/local/Cellar/qt5/5.15.2/lib/cmake
export QT_CMAKE_PREFIX_PATH=/usr/local/opt/qt5/lib/cmake
```
-#### VCPKG
+For example, under Windows:
+
+ set QT_CMAKE_PREFIX_PATH=C:\Qt\5.15.2\msvc2019_64\lib\cmake
+
+For example, under OSX:
+
+ export QT_CMAKE_PREFIX_PATH=/usr/local/Cellar/qt5/5.15.2/lib/cmake
+
+Note: You only need the following components checked under Qt 5.15.2 (select the "Custom Installation" option):
+"MSVC 2019 64-bit", "Qt WebEngine", and "Qt Script (Deprecated)".
+
+Note: Installing the sources is optional but recommended if you have room for them (~3GB). You may also want the Qt debug
+information files (~7GB).
+
+Note: Installing Qt Creator is optional but recommended if you will be editing QML files.
+
+### VCPKG
Vircadia uses vcpkg to download and build dependencies.
You do not need to install vcpkg.
Building the dependencies can be lengthy and the resulting files will be stored in your OS temp directory.
-However, those files can potentially get cleaned up by the OS, so in order to avoid this and having to redo the lengthy build step, you can set the following environment variable:
+However, those files can potentially get cleaned up by the OS, so in order to avoid this and having to redo the lengthy build step, you can set an environment variable.
+
+Linux:
```bash
export HIFI_VCPKG_BASE=/path/to/directory
```
+Windows:
+```bash
+set HIFI_VCPKG_BASE=/path/to/directory
+```
+
Where `/path/to/directory` is the path to a directory where you wish the build files to get stored.
-#### Generating Build Files
+### Generating Build Files
-##### Possible Environment Variables
+#### Possible Environment Variables
```text
// The URL to post the dump to.
@@ -109,7 +133,7 @@ USE_STABLE_GLOBAL_SERVICES=1
BUILD_GLOBAL_SERVICES=STABLE
```
-##### Generate Files
+#### Generate Files
Create a build directory in the root of your checkout and then run the CMake build from there. This will keep the rest of the directory clean.
@@ -121,7 +145,7 @@ cmake ..
If CMake gives you the same error message repeatedly after the build fails, try removing `CMakeCache.txt`.
-##### Generating a release/debug only vcpkg build
+#### Generating a release/debug only vcpkg build
In order to generate a release or debug only vcpkg package, you could use the use the `VCPKG_BUILD_TYPE` define in your CMake generate command. Building a release only vcpkg can drastically decrease the total build time.
@@ -133,7 +157,7 @@ For debug only vcpkg:
`cmake .. -DVCPKG_BUILD_TYPE=debug`
-#### Variables
+### Variables
Any variables that need to be set for CMake to find dependencies can be set as ENV variables in your shell profile, or passed directly to CMake with a `-D` flag appended to the `cmake ..` command.
@@ -143,7 +167,7 @@ For example, to pass the QT_CMAKE_PREFIX_PATH variable (if not using the vcpkg'e
cmake .. -DQT_CMAKE_PREFIX_PATH=/usr/local/qt/5.12.3/lib/cmake
```
-#### Finding Dependencies
+### Finding Dependencies
The following applies for dependencies we do not grab via CMake ExternalProject (OpenSSL is an example), or for dependencies you have opted not to grab as a CMake ExternalProject (via -DUSE_LOCAL_$NAME=0). The list of dependencies we grab by default as external projects can be found in [the CMake External Project Dependencies section](#cmake-external-project-dependencies).
@@ -155,9 +179,9 @@ In the examples below the variable $NAME would be replaced by the name of the de
* $NAME_ROOT_DIR - set this variable in your ENV
* HIFI_LIB_DIR - set this variable in your ENV to your Vircadia lib folder, should contain a folder '$name'
-### Optional Components
+## Optional Components
-#### Build Options
+### Build Options
The following build options can be used when running CMake
@@ -168,12 +192,12 @@ The following build options can be used when running CMake
* CLIENT_ONLY // Will package only the Interface
* SERVER_ONLY // Will package only the Server
-#### Developer Build Options
+### Developer Build Options
* USE_GLES
* DISABLE_UI
-#### Devices
+### Devices
You can support external input/output devices such as Leap Motion, MIDI, and more by adding each individual SDK in the visible building path. Refer to the readme file available in each device folder in [interface/external/](interface/external) for the detailed explanation of the requirements to use the device.
-
+
diff --git a/BUILD_OSX.md b/BUILD_OSX.md
index 9bf1985409..d9c7f0ee0f 100644
--- a/BUILD_OSX.md
+++ b/BUILD_OSX.md
@@ -1,10 +1,10 @@
# Build OSX
-*Last Updated on August 26, 2020*
+*Last Updated on January 16, 2021*
Please read the [general build guide](BUILD.md) for information on dependencies required for all platforms. Only macOS specific instructions are found in this document.
-### Homebrew
+## Homebrew
[Homebrew](https://brew.sh/) is an excellent package manager for macOS. It makes install of some Vircadia dependencies very simple.
@@ -12,12 +12,14 @@ Please read the [general build guide](BUILD.md) for information on dependencies
brew install cmake openssl npm
```
-### Python 3
+Note: cmake versions > 3.18.x have known problems building Vircadia, so alternatively you can download cmake 3.18.4 (or earlier versions) from [Github](https://github.com/Kitware/CMake/releases).
+
+## Python 3
Download an install Python 3.6.6 or higher from [here](https://www.python.org/downloads/).
Execute the `Update Shell Profile.command` script that is provided with the installer.
-### OSX SDK
+## OSX SDK
You will need version `10.12` of the OSX SDK for building, otherwise you may have crashing or other unintended issues due to the deprecation of OpenGL on OSX. You can get that SDK from [here](https://github.com/phracker/MacOSX-SDKs). You must copy it in to your Xcode SDK directory, e.g.
@@ -25,14 +27,14 @@ You will need version `10.12` of the OSX SDK for building, otherwise you may hav
cp -rp ~/Downloads/MacOSX10.12.sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
```
-### OpenSSL
+## OpenSSL
Assuming you've installed OpenSSL using the homebrew instructions above, you'll need to set OPENSSL_ROOT_DIR so CMake can find your installations.
For OpenSSL installed via homebrew, set OPENSSL_ROOT_DIR via
`export OPENSSL_ROOT_DIR=/usr/local/opt/openssl`
or by appending `-DOPENSSL_ROOT_DIR=/usr/local/opt/openssl` to `cmake`
-### Xcode
+## Xcode
You can ask CMake to generate Xcode project files instead of Unix Makefiles using the `-G Xcode` parameter after CMake. You will need to select the Xcode installation in the terminal first if you have not done so already.
@@ -48,14 +50,14 @@ After running CMake, you will have the make files or Xcode project file necessar
If the build completes successfully, you will have built targets for all components located in the `build/${target_name}/Debug` directories.
-### make
+## make
If you build with make rather than Xcode, you can append `-j4` for assigning more threads. The number indicates the number of threads, e.g. 4.
To package the installation, you can simply run `make package` afterwards.
-### FAQ
+## FAQ
1. **Problem:** Running the scheme `interface.app` from Xcode causes a crash for Interface related to `libgl`
- 1. **Cause:** The target `gl` generates a binary called `libgl`. A macOS `libGL.framework` item gets loaded instead by Xcode.
+ 1. **Cause:** The target `gl` generates a binary called `libgl`. A macOS `libGL.framework` item gets loaded instead by Xcode.
1. **Solution:** In the Xcode target settings for `libgl`, set the version to 1.0.0
diff --git a/BUILD_WIN.md b/BUILD_WIN.md
index 96f570981a..f7e5cebc46 100644
--- a/BUILD_WIN.md
+++ b/BUILD_WIN.md
@@ -1,40 +1,35 @@
# Build Windows
-*Last Updated on May 17, 2020*
+*Last Updated on 15 Apr 2021*
-This is a stand-alone guide for creating your first Vircadia build for Windows 64-bit.
+This is a stand-alone guide for creating your first Vircadia build for Windows 64-bit.
-Note: We are now using Visual Studio 2017 or 2019 and Qt 5.12.3.
-If you are upgrading from previous versions, do a clean uninstall of those versions before going through this guide.
+Note: We are now using Visual Studio 2019 and Qt 5.15.2.
+If you are upgrading from previous versions, do a clean uninstall of those versions before going through this guide.
**Note: The prerequisites will require about 10 GB of space on your drive. You will also need a system with at least 8GB of main memory.**
-### Step 1. Visual Studio & Python 3.x
+## Step 1. Visual Studio & Python 3.x
-If you don’t have Community or Professional edition of Visual Studio, download [Visual Studio Community 2019](https://visualstudio.microsoft.com/vs/). If you have Visual Studio 2017, you are not required to download Visual Studio 2019.
+If you don't have Community or Professional edition of Visual Studio 2019, download [Visual Studio Community 2019](https://visualstudio.microsoft.com/vs/). If you have Visual Studio 2017, you need to download Visual Studio 2019.
-When selecting components, check "Desktop development with C++".
+When selecting components, check "Desktop development with C++".
If you do not already have a Python 3.x development environment installed and want to install it with Visual Studio, check "Python Development". If you already have Visual Studio installed and need to add Python, open the "Add or remove programs" control panel and find the "Microsoft Visual Studio Installer". Select it and click "Modify". In the installer, select "Modify" again, then check "Python Development" and allow the installer to apply the changes.
-On the right on the Summary toolbar, select the following components based on your Visual Studio version.
+### Visual Studio 2019
-#### If you're installing Visual Studio 2017
-
-* Windows 8.1 SDK and UCRT SDK
-* VC++ 2015.3 v14.00 (v140) toolset for desktop
-
-#### If you're installing Visual Studio 2019
+On the right on the Summary toolbar, select the following components.
* MSVC v142 - VS 2019 C++ X64/x86 build tools
* MSVC v141 - VS 2017 C++ x64/x86 build tools
* MSVC v140 - VS 2015 C++ build tools (v14.00)
-### Step 1a. Alternate Python
+## Step 1a. Alternate Python
If you do not wish to use the Python installation bundled with Visual Studio, you can download the installer from [here](https://www.python.org/downloads/). Ensure that you get version 3.6.6 or higher.
-### Step 2. Python Dependencies
+## Step 2. Python Dependencies
In an administrator command-line that can access Python's pip you will need to run the following command:
@@ -42,52 +37,68 @@ In an administrator command-line that can access Python's pip you will need to r
If you do not use an administrator command-line, you will get errors.
-### Step 3. Installing CMake
+## Step 3. Installing CMake
-Download and install the latest version of CMake 3.15.
+Download and install the latest version of CMake 3.15.
* Note that earlier versions of CMake will work, but there is a specific bug related to the interaction of Visual Studio 2019 and CMake versions prior to 3.15 that will cause Visual Studio to rebuild far more than it needs to on every build
Download the file named win64-x64 Installer from the [CMake Website](https://cmake.org/download/). You can access the installer on this [3.15 Version page](https://cmake.org/files/v3.15/). During installation, make sure to check "Add CMake to system PATH for all users" when prompted.
-### Step 4. Node.JS and NPM
+## Step 4. Node.JS and NPM
Install version 10.15.0 LTS (or greater) of [Node.JS and NPM]().
-### Step 5. Create VCPKG environment variable
+## Step 5. (Optional) Install Qt
+
+If you would like to compile Qt instead of using the precompiled package provided during CMake, you can do so now. Install version 5.12.3 of [Qt](), as well as the following packages:
+* Qt 5.15.2
+* MSVC 2019 64-bit
+* Qt WebEngine
+* Qt Script (Deprecated)
+
+For convenience, you may also want the "Qt Debug Information" and "Sources" packages.
+
+You'll need to create the environment variable that CMake uses to find your system's Qt install.
+
+To create this variable:
+* Navigate to 'Edit the System Environment Variables' through the Start menu.
+* Click on 'Environment Variables'
+* Select 'New'
+* Set "Variable name" to `QT_CMAKE_PREFIX_PATH`
+* Set "Variable value" to `%QT_INSTALL_DIR%\5.15.2\msvc2019_64\lib\cmake`, where `%QT_INSTALL_DIR%` is the directory you specified for Qt's installation. The default is `C:\Qt`.
+
+## Step 6. Create VCPKG environment variable
In the next step, you will use CMake to build Vircadia. By default, the CMake process builds dependency files in Windows' `%TEMP%` directory, which is periodically cleared by the operating system. To prevent you from having to re-build the dependencies in the event that Windows clears that directory, we recommend that you create a `HIFI_VCPKG_BASE` environment variable linked to a directory somewhere on your machine. That directory will contain all dependency files until you manually remove them.
To create this variable:
-* Naviagte to 'Edit the System Environment Variables' Through the start menu.
+* Navigate to 'Edit the System Environment Variables' Through the Start menu.
* Click on 'Environment Variables'
-* Select 'New'
+* Select 'New'
* Set "Variable name" to `HIFI_VCPKG_BASE`
* Set "Variable value" to any directory that you have control over.
-Additionally, if you have Visual Studio 2019 installed and _only_ Visual Studio 2019 (i.e. you do not have Visual Studio 2017 installed) you must add an additional environment variable `HIFI_VCPKG_BOOTSTRAP` that will fix a bug in our `vcpkg` pre-build step.
+Additionally, if you have Visual Studio 2019 installed and _only_ Visual Studio 2019 (i.e., you do not have Visual Studio 2017 installed) you must add an additional environment variable `HIFI_VCPKG_BOOTSTRAP` that will fix a bug in our `vcpkg` pre-build step.
To create this variable:
-* Naviagte to 'Edit the System Environment Variables' Through the start menu.
+* Navigate to 'Edit the System Environment Variables' through the Start menu.
* Click on 'Environment Variables'
-* Select 'New'
+* Select 'New'
* Set "Variable name" to `HIFI_VCPKG_BOOTSTRAP`
* Set "Variable value" to `1`
-### Step 6. Running CMake to Generate Build Files
+## Step 7. Running CMake to Generate Build Files
-Run Command Prompt from Start and run the following commands:
-`cd "%VIRCADIA_DIR%"`
-`mkdir build`
-`cd build`
+Run Command Prompt from Start and run the following commands:
+`cd "%VIRCADIA_DIR%"`
+`mkdir build`
+`cd build`
-#### If you're using Visual Studio 2017,
-Run `cmake .. -G "Visual Studio 15 Win64"`.
-
-#### If you're using Visual Studio 2019,
+### Visual Studio 2019
Run `cmake .. -G "Visual Studio 16 2019" -A x64`.
Where `%VIRCADIA_DIR%` is the directory for the Vircadia repository.
-### Step 7. Making a Build
+## Step 8. Making a Build
Open `%VIRCADIA_DIR%\build\vircadia.sln` using Visual Studio.
@@ -95,7 +106,7 @@ Change the Solution Configuration (menu ribbon under the menu bar, next to the g
Run from the menu bar `Build > Build Solution`.
-### Step 8. Testing Interface
+## Step 9. Testing Interface
Create another environment variable (see Step #3)
* Set "Variable name": `_NO_DEBUG_HEAP`
@@ -103,24 +114,24 @@ Create another environment variable (see Step #3)
Restart Visual Studio again.
-In Visual Studio, right+click "interface" under the Apps folder in Solution Explorer and select "Set as Startup Project". Run from the menu bar `Debug > Start Debugging`.
+In Visual Studio, right-click "interface" under the Apps folder in Solution Explorer and select "Set as Startup Project". Run from the menu bar `Debug > Start Debugging`.
Now, you should have a full build of Vircadia and be able to run the Interface using Visual Studio.
Note: You can also run Interface by launching it from command line or File Explorer from `%VIRCADIA_DIR%\build\interface\Release\interface.exe`
-## Troubleshooting
+# Troubleshooting
-For any problems after Step #7, first try this:
-* Delete your locally cloned copy of the Vircadia repository
-* Restart your computer
-* Redownload the [repository](https://github.com/vircadia/vircadia)
-* Restart directions from Step #7
+For any problems after Step #7, first try this:
+* Delete your locally cloned copy of the Vircadia repository
+* Restart your computer
+* Redownload the [repository](https://github.com/vircadia/vircadia)
+* Restart directions from Step #7
-#### CMake gives you the same error message repeatedly after the build fails
+## CMake gives you the same error message repeatedly after the build fails
Remove `CMakeCache.txt` found in the `%VIRCADIA_DIR%\build` directory.
-#### CMake can't find OpenSSL
+## CMake can't find OpenSSL
Remove `CMakeCache.txt` found in the `%VIRCADIA_DIR%\build` directory. Verify that your HIFI_VCPKG_BASE environment variable is set and pointing to the correct location. Verify that the file `${HIFI_VCPKG_BASE}/installed/x64-windows/include/openssl/ssl.h` exists.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f111f482ae..77d0413690 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -41,8 +41,15 @@ endif()
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/_env/EXTERNAL_BUILD_ASSETS.txt" "${EXTERNAL_BUILD_ASSETS}")
MESSAGE(STATUS "EXTERNAL_BUILD_ASSETS: ${EXTERNAL_BUILD_ASSETS}")
+# read USE_GLES enviroment variable and sets it as GLES option
+# TODO still gets overwritten by "use GLES on linux aarch64"
set(GLES_OPTION "$ENV{USE_GLES}")
+# use GLES on linux aarch64
+if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
+ set(GLES_OPTION ON)
+endif()
+
# Will affect VCPKG dependencies
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/_env/USE_GLES.txt" "${GLES_OPTION}")
MESSAGE(STATUS "GLES_OPTION: ${GLES_OPTION}")
@@ -125,6 +132,15 @@ else()
set(MOBILE 0)
endif()
+set(SCREENSHARE 0)
+if (WIN32)
+ set(SCREENSHARE 1)
+endif()
+if (APPLE AND NOT CLIENT_ONLY)
+ # Don't include Screenshare in OSX client-only builds.
+ set(SCREENSHARE 1)
+endif()
+
# Use default time server if none defined in environment
set_from_env(TIMESERVER_URL TIMESERVER_URL "http://timestamp.comodoca.com?td=sha256")
@@ -187,7 +203,7 @@ else ()
set(PLATFORM_QT_COMPONENTS WebEngine Xml)
endif ()
-if (USE_GLES AND (NOT ANDROID))
+if (USE_GLES AND (NOT ANDROID AND NOT UNIX))
set(DISABLE_QML_OPTION ON)
endif()
@@ -258,12 +274,18 @@ add_custom_target(cmake SOURCES ${CMAKE_SRC})
GroupSources("cmake")
unset(CMAKE_SRC)
-file(GLOB_RECURSE JS_SRC scripts/*.js unpublishedScripts/*.js)
+file(GLOB_RECURSE JS_SRC scripts/*.* unpublishedScripts/*.*)
add_custom_target(js SOURCES ${JS_SRC})
GroupSources("scripts")
GroupSources("unpublishedScripts")
unset(JS_SRC)
+file(GLOB_RECURSE WEB_APP_SRC vircadia-web/*.*)
+list(FILTER WEB_APP_SRC EXCLUDE REGEX "vircadia-web/(dist|node_modules|public)/*" )
+add_custom_target(vircadia-web SOURCES ${WEB_APP_SRC})
+GroupSources("vircadia-web")
+unset(WEB_APP_SRC)
+
set_packaging_parameters()
# Locate the required Qt build on the filesystem
@@ -316,8 +338,11 @@ endif()
if (BUILD_CLIENT)
add_subdirectory(interface)
- add_subdirectory(screenshare)
- set_target_properties(interface PROPERTIES FOLDER "Apps")
+ if (APPLE)
+ set_target_properties(Vircadia PROPERTIES FOLDER "Apps")
+ else()
+ set_target_properties(interface PROPERTIES FOLDER "Apps")
+ endif()
option(USE_SIXENSE "Build Interface with sixense library/plugin" OFF)
endif()
@@ -327,6 +352,10 @@ if (BUILD_CLIENT OR BUILD_SERVER)
add_subdirectory(server-console)
endif()
+if (SCREENSHARE)
+ add_subdirectory(screenshare)
+endif()
+
# BUILD_TOOLS option will be handled inside the tools's CMakeLists.txt because 'scribe' tool is required for build anyway
add_subdirectory(tools)
diff --git a/README.md b/README.md
index 830236f458..314777e3e2 100644
--- a/README.md
+++ b/README.md
@@ -1,33 +1,44 @@
-# Vircadia (Codename Athena)
+
+
+

### What is this?
-Vircadia™ is a 3D social software project seeking to incrementally bring about a truly free and open metaverse, in desktop and XR.
+Vircadia™ is a 3D social software project seeking to incrementally bring about a truly free and open metaverse.
-### [Website](https://vircadia.com/) | [Discord](https://discordapp.com/invite/Pvx2vke) | [Download](https://vircadia.com/download-vircadia/)
+* Desktop and VR use
+* Hundreds of users simultaneously
+* Full-body avatars
+* FBX, glTF, and OBJ support
+* JavaScript scripting engine
+* 16km^3 world space in a server
+* Fully self-hosted
+* Apache 2.0
### Releases
[View Releases here](https://github.com/vircadia/vircadia/releases/)
-### How to build the Interface
+### How to deploy a Server
+
+- [For Windows and Linux](https://vircadia.com/deploy-a-server/)
+
+### Building
+
+#### How to build the Interface
- [For Windows](https://github.com/vircadia/vircadia/blob/master/BUILD_WIN.md)
- [For Mac](https://github.com/vircadia/vircadia/blob/master/BUILD_OSX.md)
- [For Linux](https://github.com/vircadia/vircadia/blob/master/BUILD_LINUX.md)
- [For Linux - Vircadia Builder](https://github.com/vircadia/vircadia-builder)
-### How to deploy a Server
-
-- [For Windows and Linux](https://vircadia.com/deploy-a-server/)
-
-### How to build a Server
+#### How to build a Server
- [For Windows](https://github.com/vircadia/vircadia/blob/master/BUILD_WIN.md)
- [For Linux](https://github.com/vircadia/vircadia/blob/master/BUILD_LINUX.md)
- [For Linux - Vircadia Builder](https://github.com/vircadia/vircadia-builder)
-### How to generate an Installer
+#### How to generate an Installer
- [For Windows - Interface & Server](https://github.com/vircadia/vircadia/blob/master/INSTALLER.md)
- [For Mac - Interface](https://github.com/vircadia/vircadia/blob/master/INSTALLER.md#os-x)
@@ -45,10 +56,11 @@ Vircadia consists of many projects and codebases with its unifying structure's g
- The Interface (Codename Athena) - You are here!
- The Server (Codename Athena) - You are also here!
-- The UI Framework (Codename Nyx) - Codebase coming soon.
-- [The Metaverse (Codename Iamus)](https://github.com/vircadia/Iamus/)
-- [The Metaverse Dashboard (Codename Iamus)](https://github.com/vircadia/project-iamus-dashboard/)
-- [The Launcher (Codename Pantheon)](https://github.com/vircadia/pantheon-launcher/)
+- [The Web Interface (Codename Aether)](https://github.com/vircadia/vircadia-web/)
+- [The Web SDK (Codename Ananke)](https://github.com/vircadia/vircadia-web-sdk/)
+- [The Metaverse Server (Codename Iamus)](https://github.com/vircadia/Iamus/)
+- [The Metaverse Server Dashboard (Codename Iamus)](https://github.com/vircadia/project-iamus-dashboard/)
+- [The Launcher (Codename Pantheon)](https://github.com/vircadia/pantheon-launcher/) - Currently Windows only.
#### Child Projects
- [Vircadia Builder for Linux](https://github.com/vircadia/vircadia-builder/)
diff --git a/android/apps/interface/CMakeLists.txt b/android/apps/interface/CMakeLists.txt
index 500d555915..2f21d22b12 100644
--- a/android/apps/interface/CMakeLists.txt
+++ b/android/apps/interface/CMakeLists.txt
@@ -1,6 +1,6 @@
set(TARGET_NAME native-lib)
setup_hifi_library()
-link_hifi_libraries(shared task networking gl gpu qml image fbx hfm render-utils physics entities octree ${PLATFORM_GL_BACKEND})
+link_hifi_libraries(shared task networking gl gpu qml image model-serializers hfm render-utils physics entities octree ${PLATFORM_GL_BACKEND})
target_opengl()
target_bullet()
diff --git a/android/apps/questInterface/CMakeLists.txt b/android/apps/questInterface/CMakeLists.txt
index 97ca46f6e5..72448cc9cf 100644
--- a/android/apps/questInterface/CMakeLists.txt
+++ b/android/apps/questInterface/CMakeLists.txt
@@ -2,7 +2,7 @@ set(TARGET_NAME questInterface)
setup_hifi_library()
link_hifi_libraries(
shared task networking qml
- image fbx hfm render-utils physics entities octree
+ image model-serializers hfm render-utils physics entities octree
oculusMobile oculusMobilePlugin
gl gpu ${PLATFORM_GL_BACKEND}
)
diff --git a/assignment-client/CMakeLists.txt b/assignment-client/CMakeLists.txt
index 31d8c9e5a8..abb94f95e3 100644
--- a/assignment-client/CMakeLists.txt
+++ b/assignment-client/CMakeLists.txt
@@ -8,10 +8,11 @@ if (APPLE)
endif ()
setup_memory_debugger()
+setup_thread_debugger()
# link in the shared libraries
link_hifi_libraries(
- audio avatars octree gpu graphics shaders fbx hfm entities
+ audio avatars octree gpu graphics shaders model-serializers hfm entities
networking animation recording shared script-engine embedded-webserver
controllers physics plugins midi image
material-networking model-networking ktx shaders
diff --git a/cmake/externals/steamworks/CMakeLists.txt b/cmake/externals/steamworks/CMakeLists.txt
index 1ec72d7d28..f418b82ab5 100644
--- a/cmake/externals/steamworks/CMakeLists.txt
+++ b/cmake/externals/steamworks/CMakeLists.txt
@@ -54,7 +54,7 @@ elseif(APPLE)
LOG 1
)
-elseif(NOT ANDROID)
+elseif(NOT ANDROID AND NOT CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
# FIXME need to account for different architectures
set(${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE ${SOURCE_DIR}/redistributable_bin/linux64/libsteam_api.so CACHE STRING INTERNAL)
diff --git a/cmake/macros/GenerateInstallers.cmake b/cmake/macros/GenerateInstallers.cmake
index e09a7dc322..15690f6012 100644
--- a/cmake/macros/GenerateInstallers.cmake
+++ b/cmake/macros/GenerateInstallers.cmake
@@ -96,19 +96,23 @@ macro(GENERATE_INSTALLERS)
set(CPACK_PACKAGING_INSTALL_PREFIX /)
set(CPACK_OSX_PACKAGE_VERSION ${CMAKE_OSX_DEPLOYMENT_TARGET})
- # make sure a High Fidelity directory exists, in case this hits prior to other installs
- install(CODE "file(MAKE_DIRECTORY \"\${CMAKE_INSTALL_PREFIX}/${DMG_SUBFOLDER_NAME}\")")
+ # Create folder if used.
+ if (NOT INTERFACE_INSTALL_DIR STREQUAL ".")
+ # make sure a High Fidelity directory exists, in case this hits prior to other installs
+ install(CODE "file(MAKE_DIRECTORY \"\${CMAKE_INSTALL_PREFIX}/${DMG_SUBFOLDER_NAME}\")")
- # add the resource file to the Icon file inside the folder
- install(CODE
- "execute_process(COMMAND Rez -append ${DMG_SUBFOLDER_ICON} -o \${CMAKE_INSTALL_PREFIX}/${ESCAPED_DMG_SUBFOLDER_NAME}/Icon\\r)"
- )
+ # add the resource file to the Icon file inside the folder
+ install(CODE
+ "execute_process(COMMAND Rez -append ${DMG_SUBFOLDER_ICON} -o \${CMAKE_INSTALL_PREFIX}/${ESCAPED_DMG_SUBFOLDER_NAME}/Icon\\r)"
+ )
- # modify the folder to use that custom icon
- install(CODE "execute_process(COMMAND SetFile -a C \${CMAKE_INSTALL_PREFIX}/${ESCAPED_DMG_SUBFOLDER_NAME})")
+ # modify the folder to use that custom icon
+ install(CODE "execute_process(COMMAND SetFile -a C \${CMAKE_INSTALL_PREFIX}/${ESCAPED_DMG_SUBFOLDER_NAME})")
+
+ # hide the special Icon? file
+ install(CODE "execute_process(COMMAND SetFile -a V \${CMAKE_INSTALL_PREFIX}/${ESCAPED_DMG_SUBFOLDER_NAME}/Icon\\r)")
+ endif ()
- # hide the special Icon? file
- install(CODE "execute_process(COMMAND SetFile -a V \${CMAKE_INSTALL_PREFIX}/${ESCAPED_DMG_SUBFOLDER_NAME}/Icon\\r)")
endif ()
# configure a cpack properties file for custom variables in template
diff --git a/cmake/macros/LinkHifiLibraries.cmake b/cmake/macros/LinkHifiLibraries.cmake
index 6a430f5b13..390bdf2326 100644
--- a/cmake/macros/LinkHifiLibraries.cmake
+++ b/cmake/macros/LinkHifiLibraries.cmake
@@ -26,5 +26,6 @@ function(LINK_HIFI_LIBRARIES)
endforeach()
setup_memory_debugger()
+ setup_thread_debugger()
endfunction()
diff --git a/cmake/macros/ManuallyInstallOpenSSLForQt.cmake b/cmake/macros/ManuallyInstallOpenSSLForQt.cmake
index eae0eaca58..baee173572 100644
--- a/cmake/macros/ManuallyInstallOpenSSLForQt.cmake
+++ b/cmake/macros/ManuallyInstallOpenSSLForQt.cmake
@@ -3,6 +3,7 @@
#
# Created by Stephen Birarda on 1/15/16.
# Copyright 2014 High Fidelity, Inc.
+# Copyright 2020 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
@@ -19,13 +20,13 @@ macro(manually_install_openssl_for_qt)
find_package(OpenSSL REQUIRED)
install(
- FILES "${VCPKG_INSTALL_ROOT}/bin/ssleay32.dll"
+ FILES "${VCPKG_INSTALL_ROOT}/bin/libcrypto-1_1-x64.dll"
DESTINATION ${TARGET_INSTALL_DIR}
COMPONENT ${TARGET_INSTALL_COMPONENT}
)
install(
- FILES "${VCPKG_INSTALL_ROOT}/bin/libeay32.dll"
+ FILES "${VCPKG_INSTALL_ROOT}/bin/libssl-1_1-x64.dll"
DESTINATION ${TARGET_INSTALL_DIR}
COMPONENT ${TARGET_INSTALL_COMPONENT}
)
diff --git a/cmake/macros/MemoryDebugger.cmake b/cmake/macros/MemoryDebugger.cmake
index 5aa99787bf..244d47b02e 100644
--- a/cmake/macros/MemoryDebugger.cmake
+++ b/cmake/macros/MemoryDebugger.cmake
@@ -9,29 +9,42 @@
macro(SETUP_MEMORY_DEBUGGER)
if ("$ENV{VIRCADIA_MEMORY_DEBUGGING}")
+ if (VIRCADIA_THREAD_DEBUGGING)
+ message(FATAL_ERROR "Thread debugging and memory debugging can't be enabled at the same time." )
+ endif()
+
SET( VIRCADIA_MEMORY_DEBUGGING true )
endif ()
if (VIRCADIA_MEMORY_DEBUGGING)
- if (UNIX)
- if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
- # for clang on Linux
- SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -fsanitize=undefined -fsanitize=address -fsanitize=leak -fsanitize-recover=address")
- SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined -fsanitize=address -fsanitize=leak -fsanitize-recover=address")
- SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined -fsanitize=address -fsanitize=leak -fsanitize-recover=address")
- else ()
- # for gcc on Linux
- # For some reason, using -fstack-protector results in this error:
- # usr/bin/ld: ../../libraries/audio/libaudio.so: undefined reference to `FIR_1x4_AVX512(float*, float*, float*, float*, float*, float (*) [64], int)'
- # The '-DSTACK_PROTECTOR' argument below disables the usage of this function in the code. This should be fine as it only works on the latest Intel hardware,
- # and is an optimization that should make no functional difference.
-
- SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fsanitize=address -fsanitize=leak -U_FORTIFY_SOURCE -DSTACK_PROTECTOR -fstack-protector-strong -fno-omit-frame-pointer")
- SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined -fsanitize=address -fsanitize=leak ")
- SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined -fsanitize=address -fsanitize=leak")
+ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -fsanitize=undefined -fsanitize=address -fsanitize-recover=address")
+ SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined -fsanitize=address -fsanitize-recover=address")
+ SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined -fsanitize=address -fsanitize-recover=address")
+ if (UNIX)
+ # Only supported on Linux and OSX
+ # https://clang.llvm.org/docs/LeakSanitizer.html
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=leak")
+ SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=leak")
+ SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=leak")
endif()
+ elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
+ # for gcc
+ # For some reason, using -fstack-protector results in this error:
+ # usr/bin/ld: ../../libraries/audio/libaudio.so: undefined reference to `FIR_1x4_AVX512(float*, float*, float*, float*, float*, float (*) [64], int)'
+ # The '-DSTACK_PROTECTOR' argument below disables the usage of this function in the code. This should be fine as it only works on the latest Intel hardware,
+ # and is an optimization that should make no functional difference.
+
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fsanitize=address -fsanitize=leak -U_FORTIFY_SOURCE -DSTACK_PROTECTOR -fstack-protector-strong -fno-omit-frame-pointer")
+ SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined -fsanitize=address -fsanitize=leak ")
+ SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined -fsanitize=address -fsanitize=leak")
+ elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
+ # https://docs.microsoft.com/en-us/cpp/sanitizers/asan?view=msvc-160
+ # Supported experimentally starting from VS2019 v16.4, and officially from v16.9.
+ # UBSan and leak detection don't seem to be implemented yet.
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address /Zi")
else()
- message(FATAL_ERROR "Memory debugging is not supported on this platform." )
+ message(FATAL_ERROR "Memory debugging is not supported on this compiler.")
endif()
endif ()
endmacro(SETUP_MEMORY_DEBUGGER)
diff --git a/cmake/macros/SetPackagingParameters.cmake b/cmake/macros/SetPackagingParameters.cmake
index d7f1aa2786..abe93275f6 100644
--- a/cmake/macros/SetPackagingParameters.cmake
+++ b/cmake/macros/SetPackagingParameters.cmake
@@ -38,6 +38,12 @@ macro(SET_PACKAGING_PARAMETERS)
set(CLIENT_COMPONENT client)
set(SERVER_COMPONENT server)
+ if (APPLE)
+ set(INTERFACE_BUNDLE_NAME "Vircadia")
+ else()
+ set(INTERFACE_BUNDLE_NAME "interface")
+ endif()
+
if (RELEASE_TYPE STREQUAL "PRODUCTION")
set(DEPLOY_PACKAGE TRUE)
set(PRODUCTION_BUILD 1)
@@ -45,7 +51,6 @@ macro(SET_PACKAGING_PARAMETERS)
set(BUILD_ORGANIZATION "Vircadia")
set(HIGH_FIDELITY_PROTOCOL "hifi")
set(HIGH_FIDELITY_APP_PROTOCOL "hifiapp")
- set(INTERFACE_BUNDLE_NAME "interface")
set(INTERFACE_ICON_PREFIX "interface")
# add definition for this release type
@@ -68,7 +73,6 @@ macro(SET_PACKAGING_PARAMETERS)
set(PR_BUILD 1)
set(BUILD_VERSION "PR${RELEASE_NUMBER}")
set(BUILD_ORGANIZATION "Vircadia - PR${RELEASE_NUMBER}")
- set(INTERFACE_BUNDLE_NAME "interface")
set(INTERFACE_ICON_PREFIX "interface-beta")
# add definition for this release type
@@ -77,7 +81,6 @@ macro(SET_PACKAGING_PARAMETERS)
set(DEV_BUILD 1)
set(BUILD_VERSION "dev")
set(BUILD_ORGANIZATION "Vircadia - ${BUILD_VERSION}")
- set(INTERFACE_BUNDLE_NAME "interface")
set(INTERFACE_ICON_PREFIX "interface-beta")
# add definition for this release type
@@ -85,7 +88,11 @@ macro(SET_PACKAGING_PARAMETERS)
endif ()
set(NITPICK_BUNDLE_NAME "nitpick")
- set(NITPICK_ICON_PREFIX "nitpick")
+ if (RELEASE_TYPE STREQUAL "PRODUCTION")
+ set(NITPICK_ICON_PREFIX "nitpick")
+ else ()
+ set(NITPICK_ICON_PREFIX "nitpick-beta")
+ endif ()
string(TIMESTAMP BUILD_TIME "%d/%m/%Y")
@@ -125,10 +132,10 @@ macro(SET_PACKAGING_PARAMETERS)
set(DMG_SUBFOLDER_ICON "${HF_CMAKE_DIR}/installer/install-folder.rsrc")
- set(CONSOLE_INSTALL_DIR ${DMG_SUBFOLDER_NAME})
- set(INTERFACE_INSTALL_DIR ${DMG_SUBFOLDER_NAME})
- set(SCREENSHARE_INSTALL_DIR ${DMG_SUBFOLDER_NAME})
- set(NITPICK_INSTALL_DIR ${DMG_SUBFOLDER_NAME})
+ set(CONSOLE_INSTALL_DIR ".")
+ set(INTERFACE_INSTALL_DIR ".")
+ set(SCREENSHARE_INSTALL_DIR ".")
+ set(NITPICK_INSTALL_DIR ".")
if (CLIENT_ONLY)
set(CONSOLE_EXEC_NAME "Console.app")
@@ -147,7 +154,7 @@ macro(SET_PACKAGING_PARAMETERS)
set(SCREENSHARE_APP_CONTENTS "${SCREENSHARE_INSTALL_APP_PATH}/Contents")
- set(INTERFACE_INSTALL_APP_PATH "${CONSOLE_INSTALL_DIR}/${INTERFACE_BUNDLE_NAME}.app")
+ set(INTERFACE_INSTALL_APP_PATH "${INTERFACE_INSTALL_DIR}/${INTERFACE_BUNDLE_NAME}.app")
set(INTERFACE_ICON_FILENAME "${INTERFACE_ICON_PREFIX}.icns")
set(NITPICK_ICON_FILENAME "${NITPICK_ICON_PREFIX}.icns")
else ()
diff --git a/cmake/macros/SetupHifiClientServerPlugin.cmake b/cmake/macros/SetupHifiClientServerPlugin.cmake
index 1ce0b0ca6e..5c98ceb139 100644
--- a/cmake/macros/SetupHifiClientServerPlugin.cmake
+++ b/cmake/macros/SetupHifiClientServerPlugin.cmake
@@ -11,7 +11,11 @@ macro(SETUP_HIFI_CLIENT_SERVER_PLUGIN)
setup_hifi_library()
if (BUILD_CLIENT)
- add_dependencies(interface ${TARGET_NAME})
+ if (APPLE)
+ add_dependencies(Vircadia ${TARGET_NAME})
+ else()
+ add_dependencies(interface ${TARGET_NAME})
+ endif()
endif()
if (BUILD_SERVER)
diff --git a/cmake/macros/SetupHifiLibrary.cmake b/cmake/macros/SetupHifiLibrary.cmake
index 108786a651..5c6eb0a4c6 100644
--- a/cmake/macros/SetupHifiLibrary.cmake
+++ b/cmake/macros/SetupHifiLibrary.cmake
@@ -30,7 +30,7 @@ macro(SETUP_HIFI_LIBRARY)
foreach(SRC ${AVX2_SRCS})
if (WIN32)
set_source_files_properties(${SRC} PROPERTIES COMPILE_FLAGS /arch:AVX2)
- elseif (APPLE OR (UNIX AND NOT ANDROID))
+ elseif (APPLE OR (UNIX AND NOT ANDROID AND NOT CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64"))
set_source_files_properties(${SRC} PROPERTIES COMPILE_FLAGS "-mavx2 -mfma")
endif()
endforeach()
@@ -53,6 +53,7 @@ macro(SETUP_HIFI_LIBRARY)
endforeach()
setup_memory_debugger()
+ setup_thread_debugger()
# create a library and set the property so it can be referenced later
if (${${TARGET_NAME}_SHARED})
diff --git a/cmake/macros/SetupHifiPlugin.cmake b/cmake/macros/SetupHifiPlugin.cmake
index 023c7603dc..22fa02dd79 100644
--- a/cmake/macros/SetupHifiPlugin.cmake
+++ b/cmake/macros/SetupHifiPlugin.cmake
@@ -9,7 +9,11 @@ macro(SETUP_HIFI_PLUGIN)
set(${TARGET_NAME}_SHARED 1)
setup_hifi_library(${ARGV})
if (BUILD_CLIENT)
- add_dependencies(interface ${TARGET_NAME})
+ if (APPLE)
+ add_dependencies(Vircadia ${TARGET_NAME})
+ else()
+ add_dependencies(interface ${TARGET_NAME})
+ endif()
endif()
target_link_libraries(${TARGET_NAME} ${CMAKE_THREAD_LIBS_INIT})
set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Plugins")
diff --git a/cmake/macros/SetupQt.cmake b/cmake/macros/SetupQt.cmake
index bd198a2195..6f31a3994c 100644
--- a/cmake/macros/SetupQt.cmake
+++ b/cmake/macros/SetupQt.cmake
@@ -18,7 +18,7 @@ endfunction()
function(calculate_qt5_version result _QT_DIR)
# All Qt5 packages have little "private" include directories named with the actual Qt version such as:
- # .../include/QtCore/5.12.3/QtCore/private
+ # .../include/QtCore/5.15.2/QtCore/private
# Sometimes we need to include these private headers for debug hackery.
# Hence we find one of these directories and pick apart its path to determine the actual QT_VERSION.
if (APPLE)
diff --git a/cmake/macros/ThreadDebugger.cmake b/cmake/macros/ThreadDebugger.cmake
new file mode 100644
index 0000000000..0353e3b1cb
--- /dev/null
+++ b/cmake/macros/ThreadDebugger.cmake
@@ -0,0 +1,36 @@
+#
+# MemoryDebugger.cmake
+#
+# 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
+#
+
+macro(SETUP_THREAD_DEBUGGER)
+if ("$ENV{VIRCADIA_THREAD_DEBUGGING}")
+ if (VIRCADIA_MEMORY_DEBUGGING )
+ message(FATAL_ERROR "Thread debugging and memory debugging can't be enabled at the same time." )
+ endif ()
+
+ SET(VIRCADIA_THREAD_DEBUGGING true)
+endif ()
+
+if (VIRCADIA_THREAD_DEBUGGING)
+ if (UNIX)
+ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ # for clang on Linux
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fno-omit-frame-pointer")
+ SET(CMAKE_EXE_LINKER_FLAGS "-fsanitize=thread ${CMAKE_EXE_LINKER_FLAGS}")
+ SET(CMAKE_SHARED_LINKER_FLAGS "-fsanitize=thread ${CMAKE_EXE_LINKER_FLAGS}")
+ else ()
+ # for gcc on Linux
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fno-omit-frame-pointer")
+ SET(CMAKE_EXE_LINKER_FLAGS " -fsanitize=thread ${CMAKE_EXE_LINKER_FLAGS}")
+ SET(CMAKE_SHARED_LINKER_FLAGS "-fsanitize=thread ${CMAKE_EXE_LINKER_FLAGS}")
+ endif()
+ else()
+ message(FATAL_ERROR "Thread debugging is not supported on this platform.")
+ endif()
+endif ()
+endmacro(SETUP_THREAD_DEBUGGER)
diff --git a/cmake/ports/hifi-client-deps/CONTROL b/cmake/ports/hifi-client-deps/CONTROL
index 4a8a2bc44e..3a8c4693b3 100644
--- a/cmake/ports/hifi-client-deps/CONTROL
+++ b/cmake/ports/hifi-client-deps/CONTROL
@@ -1,4 +1,4 @@
Source: hifi-client-deps
Version: 0.1
Description: Collected dependencies for High Fidelity applications
-Build-Depends: hifi-deps, aristo (windows), glslang, liblo (windows), nlohmann-json, openvr (linux|windows), quazip (!android), sdl2 (!android), spirv-cross (!android), spirv-tools (!android), sranipal (windows), vulkanmemoryallocator
+Build-Depends: hifi-deps, aristo (windows), glslang, liblo (windows), nlohmann-json, openvr ((linux&!arm)|windows), quazip (!android), sdl2 (!android), spirv-cross (!android), spirv-tools (!android), sranipal (windows), vulkanmemoryallocator
diff --git a/cmake/ports/nvtt/0001-Build-on-aarch64.patch b/cmake/ports/nvtt/0001-Build-on-aarch64.patch
new file mode 100644
index 0000000000..4f737f78c4
--- /dev/null
+++ b/cmake/ports/nvtt/0001-Build-on-aarch64.patch
@@ -0,0 +1,37 @@
+commit 8909ba06ea1893a6e028836fbade28fd115ee1cc
+Author: Julian Groß
+Date: Wed Feb 17 04:51:49 2021 +0100
+
+ Enable building on aarch64 according to https://github.com/castano/nvidia-texture-tools/pull/309 and https://github.com/castano/nvidia-texture-tools/pull/322
+
+diff --git a/src/nvcore/Debug.cpp b/src/nvcore/Debug.cpp
+index 9ab4525..e335f97 100644
+--- a/src/nvcore/Debug.cpp
++++ b/src/nvcore/Debug.cpp
+@@ -1008,6 +1008,13 @@ void debug::dumpInfo()
+ #endif
+ }
+
++static va_list getEmptyVAList(va_list list, ...)
++{
++ va_start(list, list);
++ va_end(list);
++ return list;
++}
++
+ /// Dump callstack using the specified handler.
+ void debug::dumpCallstack(MessageHandler *messageHandler, int callstackLevelsToSkip /*= 0*/)
+ {
+@@ -1020,8 +1027,11 @@ void debug::dumpCallstack(MessageHandler *messageHandler, int callstackLevelsToS
+ Array lines;
+ writeStackTrace(trace, size, callstackLevelsToSkip + 1, lines); // + 1 to skip the call to dumpCallstack
+
++ va_list empty;
++ empty = getEmptyVAList(empty);
++
+ for (uint i = 0; i < lines.count(); i++) {
+- messageHandler->log(lines[i], NULL);
++ messageHandler->log(lines[i], empty);
+ delete lines[i];
+ }
+ }
diff --git a/cmake/ports/nvtt/0002-Hack-remove-include-sysctl.h-to-build-on-linux-a.patch b/cmake/ports/nvtt/0002-Hack-remove-include-sysctl.h-to-build-on-linux-a.patch
new file mode 100644
index 0000000000..78e92d38b8
--- /dev/null
+++ b/cmake/ports/nvtt/0002-Hack-remove-include-sysctl.h-to-build-on-linux-a.patch
@@ -0,0 +1,25 @@
+From 84dc6af45b1176a2b82d089239665cb3dc1584de Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Julian=20Gro=C3=9F?=
+Date: Wed, 23 Dec 2020 07:33:39 +0100
+Subject: [PATCH] Hack: remove #include to build on
+ linux-aarch64
+
+---
+ src/nvthread/nvthread.cpp | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/src/nvthread/nvthread.cpp b/src/nvthread/nvthread.cpp
+index 2b3abe6..cec9f4f 100644
+--- a/src/nvthread/nvthread.cpp
++++ b/src/nvthread/nvthread.cpp
+@@ -11,7 +11,6 @@
+ #include
+ #elif NV_OS_UNIX
+ #include
+-#include
+ #include
+ #elif NV_OS_DARWIN
+ #import
+--
+2.17.1
+
diff --git a/cmake/ports/nvtt/portfile.cmake b/cmake/ports/nvtt/portfile.cmake
index b21bb5609c..9088b62046 100644
--- a/cmake/ports/nvtt/portfile.cmake
+++ b/cmake/ports/nvtt/portfile.cmake
@@ -15,6 +15,13 @@ vcpkg_from_github(
HEAD_REF master
)
+if(VCPKG_TARGET_ARCHITECTURE STREQUAL arm64)
+ vcpkg_apply_patches(
+ SOURCE_PATH ${SOURCE_PATH}
+ PATCHES "${CMAKE_CURRENT_LIST_DIR}/0001-Build-on-aarch64.patch" "${CMAKE_CURRENT_LIST_DIR}/0002-Hack-remove-include-sysctl.h-to-build-on-linux-a.patch"
+ )
+endif()
+
vcpkg_configure_cmake(
SOURCE_PATH ${SOURCE_PATH}
OPTIONS
diff --git a/cmake/ports/openssl-windows/CONTROL b/cmake/ports/openssl-windows/CONTROL
index 881c311d00..54ca58580d 100644
--- a/cmake/ports/openssl-windows/CONTROL
+++ b/cmake/ports/openssl-windows/CONTROL
@@ -1,3 +1,3 @@
Source: openssl-windows
-Version: 1.0.2p-1
+Version: 1.1.1h
Description: OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. It is also a general-purpose cryptography library.
diff --git a/cmake/ports/openssl-windows/ConfigureIncludeQuotesFix.patch b/cmake/ports/openssl-windows/ConfigureIncludeQuotesFix.patch
deleted file mode 100644
index 09494f5650..0000000000
--- a/cmake/ports/openssl-windows/ConfigureIncludeQuotesFix.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/Configure b/Configure
-index c98107a..77ad9d3 100644
---- a/Configure
-+++ b/Configure
-@@ -972,7 +972,7 @@ PROCESS_ARGS:
- }
- elsif (/^--with-zlib-include=(.*)$/)
- {
-- $withargs{"zlib-include"}="-I$1";
-+ $withargs{"zlib-include"}="-I\"$1\"";
- }
- elsif (/^--with-fipsdir=(.*)$/)
- {
diff --git a/cmake/ports/openssl-windows/EmbedSymbolsInStaticLibsZ7.patch b/cmake/ports/openssl-windows/EmbedSymbolsInStaticLibsZ7.patch
deleted file mode 100644
index 1a8de2c4bd..0000000000
--- a/cmake/ports/openssl-windows/EmbedSymbolsInStaticLibsZ7.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-diff --git a/util/pl/VC-32.pl b/util/pl/VC-32.pl
-index dba96cb..5722f6e 100644
---- a/util/pl/VC-32.pl
-+++ b/util/pl/VC-32.pl
-@@ -154,9 +154,17 @@ else
- $cflags=$opt_cflags.$base_cflags;
- }
-
--# generate symbols.pdb unconditionally
--$app_cflag.=" /Zi /Fd\$(TMP_D)/app";
--$lib_cflag.=" /Zi /Fd\$(TMP_D)/lib";
-+# generate symbols.pdb when building dlls and embed symbols when building static libs
-+if ($shlib)
-+ {
-+ $app_cflag.=" /Zi /Fd\$(TMP_D)/app.pdb";
-+ $lib_cflag.=" /Zi /Fd\$(TMP_D)/lib.pdb";
-+ }
-+else
-+ {
-+ $app_cflag.=" /Z7";
-+ $lib_cflag.=" /Z7";
-+ }
- $lflags.=" /debug";
-
- $obj='.obj';
diff --git a/cmake/ports/openssl-windows/STRINGIFYPatch.patch b/cmake/ports/openssl-windows/STRINGIFYPatch.patch
deleted file mode 100644
index dd8f9c2972..0000000000
--- a/cmake/ports/openssl-windows/STRINGIFYPatch.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-diff --git a/crypto/cversion.c b/crypto/cversion.c
-index bfff699..17b7912 100644
---- a/crypto/cversion.c
-+++ b/crypto/cversion.c
-@@ -56,6 +56,9 @@
- * [including the GNU Public Licence.]
- */
-
-+#define STRINGIFY2(x) #x
-+#define STRINGIFY(x) STRINGIFY2(x)
-+
- #include "cryptlib.h"
-
- #ifndef NO_WINDOWS_BRAINDEATH
-@@ -79,7 +82,7 @@ const char *SSLeay_version(int t)
- }
- if (t == SSLEAY_CFLAGS) {
- #ifdef CFLAGS
-- return (CFLAGS);
-+ return STRINGIFY(CFLAGS);
- #else
- return ("compiler: information not available");
- #endif
diff --git a/cmake/ports/openssl-windows/portfile.cmake b/cmake/ports/openssl-windows/portfile.cmake
index d58d51431e..edf826b4eb 100644
--- a/cmake/ports/openssl-windows/portfile.cmake
+++ b/cmake/ports/openssl-windows/portfile.cmake
@@ -3,7 +3,7 @@ if(VCPKG_CMAKE_SYSTEM_NAME)
endif()
include(vcpkg_common_functions)
-set(OPENSSL_VERSION 1.0.2p)
+set(OPENSSL_VERSION 1.1.1h)
set(MASTER_COPY_SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src/openssl-${OPENSSL_VERSION})
vcpkg_find_acquire_program(PERL)
@@ -12,18 +12,12 @@ get_filename_component(PERL_EXE_PATH ${PERL} DIRECTORY)
set(ENV{PATH} "$ENV{PATH};${PERL_EXE_PATH}")
vcpkg_download_distfile(OPENSSL_SOURCE_ARCHIVE
- URLS "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz" "https://www.openssl.org/source/old/1.0.2/openssl-${OPENSSL_VERSION}.tar.gz"
+ URLS "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz" "https://www.openssl.org/source/old/1.1.1/openssl-${OPENSSL_VERSION}.tar.gz"
FILENAME "openssl-${OPENSSL_VERSION}.tar.gz"
- SHA512 958c5a7c3324bbdc8f07dfb13e11329d9a1b4452c07cf41fbd2d42b5fe29c95679332a3476d24c2dc2b88be16e4a24744aba675a05a388c0905756c77a8a2f16
+ SHA512 da50fd99325841ed7a4367d9251c771ce505a443a73b327d8a46b2c6a7d2ea99e43551a164efc86f8743b22c2bdb0020bf24a9cbd445e9d68868b2dc1d34033a
)
vcpkg_extract_source_archive(${OPENSSL_SOURCE_ARCHIVE})
-vcpkg_apply_patches(
- SOURCE_PATH ${MASTER_COPY_SOURCE_PATH}
- PATCHES ${CMAKE_CURRENT_LIST_DIR}/ConfigureIncludeQuotesFix.patch
- ${CMAKE_CURRENT_LIST_DIR}/STRINGIFYPatch.patch
- ${CMAKE_CURRENT_LIST_DIR}/EmbedSymbolsInStaticLibsZ7.patch
-)
vcpkg_find_acquire_program(NASM)
get_filename_component(NASM_EXE_PATH ${NASM} DIRECTORY)
@@ -40,39 +34,26 @@ set(CONFIGURE_COMMAND ${PERL} Configure
if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86")
set(OPENSSL_ARCH VC-WIN32)
- set(OPENSSL_DO "ms\\do_nasm.bat")
elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64")
set(OPENSSL_ARCH VC-WIN64A)
- set(OPENSSL_DO "ms\\do_win64a.bat")
else()
message(FATAL_ERROR "Unsupported target architecture: ${VCPKG_TARGET_ARCHITECTURE}")
endif()
-if(VCPKG_LIBRARY_LINKAGE STREQUAL dynamic)
- set(OPENSSL_MAKEFILE "ms\\ntdll.mak")
-else()
- set(OPENSSL_MAKEFILE "ms\\nt.mak")
-endif()
-
file(REMOVE_RECURSE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg)
if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
+ message(STATUS "Configure ${TARGET_TRIPLET}-rel")
file(COPY ${MASTER_COPY_SOURCE_PATH} DESTINATION ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel)
set(SOURCE_PATH_RELEASE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/openssl-${OPENSSL_VERSION})
set(OPENSSLDIR_RELEASE ${CURRENT_PACKAGES_DIR})
- message(STATUS "Configure ${TARGET_TRIPLET}-rel")
vcpkg_execute_required_process(
COMMAND ${CONFIGURE_COMMAND} ${OPENSSL_ARCH} "--prefix=${OPENSSLDIR_RELEASE}" "--openssldir=${OPENSSLDIR_RELEASE}" -FS
WORKING_DIRECTORY ${SOURCE_PATH_RELEASE}
LOGNAME configure-perl-${TARGET_TRIPLET}-${CMAKE_BUILD_TYPE}-rel
)
- vcpkg_execute_required_process(
- COMMAND ${OPENSSL_DO}
- WORKING_DIRECTORY ${SOURCE_PATH_RELEASE}
- LOGNAME configure-do-${TARGET_TRIPLET}-${CMAKE_BUILD_TYPE}-rel
- )
message(STATUS "Configure ${TARGET_TRIPLET}-rel done")
message(STATUS "Build ${TARGET_TRIPLET}-rel")
@@ -80,16 +61,16 @@ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
# This is ok; we just do as much work as we can in parallel first, then follow up with a single-threaded build.
make_directory(${SOURCE_PATH_RELEASE}/inc32/openssl)
execute_process(
- COMMAND ${JOM} -k -j $ENV{NUMBER_OF_PROCESSORS} -f ${OPENSSL_MAKEFILE}
+ COMMAND ${JOM} -k -j $ENV{NUMBER_OF_PROCESSORS}
WORKING_DIRECTORY ${SOURCE_PATH_RELEASE}
OUTPUT_FILE ${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-rel-0-out.log
ERROR_FILE ${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-rel-0-err.log
)
vcpkg_execute_required_process(
- COMMAND nmake -f ${OPENSSL_MAKEFILE} install
+ COMMAND nmake install
WORKING_DIRECTORY ${SOURCE_PATH_RELEASE}
- LOGNAME build-${TARGET_TRIPLET}-rel-1)
-
+ LOGNAME build-${TARGET_TRIPLET}-rel-1
+ )
message(STATUS "Build ${TARGET_TRIPLET}-rel done")
endif()
@@ -101,39 +82,46 @@ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
set(OPENSSLDIR_DEBUG ${CURRENT_PACKAGES_DIR}/debug)
vcpkg_execute_required_process(
- COMMAND ${CONFIGURE_COMMAND} debug-${OPENSSL_ARCH} "--prefix=${OPENSSLDIR_DEBUG}" "--openssldir=${OPENSSLDIR_DEBUG}" -FS
+ COMMAND ${CONFIGURE_COMMAND} ${OPENSSL_ARCH} --debug "--prefix=${OPENSSLDIR_DEBUG}" "--openssldir=${OPENSSLDIR_DEBUG}" -FS
WORKING_DIRECTORY ${SOURCE_PATH_DEBUG}
LOGNAME configure-perl-${TARGET_TRIPLET}-${CMAKE_BUILD_TYPE}-dbg
)
- vcpkg_execute_required_process(
- COMMAND ${OPENSSL_DO}
- WORKING_DIRECTORY ${SOURCE_PATH_DEBUG}
- LOGNAME configure-do-${TARGET_TRIPLET}-${CMAKE_BUILD_TYPE}-dbg
- )
message(STATUS "Configure ${TARGET_TRIPLET}-dbg done")
message(STATUS "Build ${TARGET_TRIPLET}-dbg")
make_directory(${SOURCE_PATH_DEBUG}/inc32/openssl)
execute_process(
- COMMAND ${JOM} -k -j $ENV{NUMBER_OF_PROCESSORS} -f ${OPENSSL_MAKEFILE}
+ COMMAND ${JOM} -k -j $ENV{NUMBER_OF_PROCESSORS}
WORKING_DIRECTORY ${SOURCE_PATH_DEBUG}
OUTPUT_FILE ${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-dbg-0-out.log
ERROR_FILE ${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-dbg-0-err.log
)
vcpkg_execute_required_process(
- COMMAND nmake -f ${OPENSSL_MAKEFILE} install
+ COMMAND nmake install
WORKING_DIRECTORY ${SOURCE_PATH_DEBUG}
- LOGNAME build-${TARGET_TRIPLET}-dbg-1)
-
+ LOGNAME build-${TARGET_TRIPLET}-dbg-1
+ )
message(STATUS "Build ${TARGET_TRIPLET}-dbg done")
endif()
+file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/certs)
+file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/lib/engines-1_1)
+file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/private)
+file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/certs)
file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)
+file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/lib/engines-1_1)
+file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/private)
file(REMOVE
- ${CURRENT_PACKAGES_DIR}/debug/bin/openssl.exe
- ${CURRENT_PACKAGES_DIR}/debug/openssl.cnf
${CURRENT_PACKAGES_DIR}/openssl.cnf
+ ${CURRENT_PACKAGES_DIR}/openssl.cnf.dist
+ ${CURRENT_PACKAGES_DIR}/ct_log_list.cnf
+ ${CURRENT_PACKAGES_DIR}/ct_log_list.cnf.dist
+ ${CURRENT_PACKAGES_DIR}/debug/openssl.cnf
+ ${CURRENT_PACKAGES_DIR}/debug/openssl.cnf.dist
+ ${CURRENT_PACKAGES_DIR}/debug/ct_log_list.cnf
+ ${CURRENT_PACKAGES_DIR}/debug/ct_log_list.cnf.dist
+ ${CURRENT_PACKAGES_DIR}/debug/bin/openssl.exe
)
file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/tools/openssl/)
@@ -147,14 +135,6 @@ if(VCPKG_LIBRARY_LINKAGE STREQUAL static)
file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin/)
endif()
-file(READ "${CURRENT_PACKAGES_DIR}/include/openssl/dtls1.h" _contents)
-string(REPLACE "" "" _contents "${_contents}")
-file(WRITE "${CURRENT_PACKAGES_DIR}/include/openssl/dtls1.h" "${_contents}")
-
-file(READ "${CURRENT_PACKAGES_DIR}/include/openssl/rand.h" _contents)
-string(REPLACE "# include " "#ifndef _WINSOCKAPI_\n#define _WINSOCKAPI_\n#endif\n# include " _contents "${_contents}")
-file(WRITE "${CURRENT_PACKAGES_DIR}/include/openssl/rand.h" "${_contents}")
-
vcpkg_copy_pdbs()
file(COPY ${CMAKE_CURRENT_LIST_DIR}/usage DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT})
diff --git a/domain-server/CMakeLists.txt b/domain-server/CMakeLists.txt
index 693132a8f7..a3a85684b4 100644
--- a/domain-server/CMakeLists.txt
+++ b/domain-server/CMakeLists.txt
@@ -15,6 +15,7 @@ if (APPLE)
endif ()
setup_memory_debugger()
+setup_thread_debugger()
# TODO: find a solution that will handle web file changes in resources on windows without a re-build.
# Currently the resources are only copied on post-build. If one is changed but the domain-server is not, they will
diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp
index f0a648b7c0..3acd17f6af 100644
--- a/domain-server/src/DomainServer.cpp
+++ b/domain-server/src/DomainServer.cpp
@@ -661,7 +661,7 @@ bool DomainServer::isPacketVerified(const udt::Packet& packet) {
// if this is a mismatching connect packet, we can't simply drop it on the floor
// send back a packet to the interface that tells them we refuse connection for a mismatch
- if (headerType == PacketType::DomainConnectRequest
+ if ((headerType == PacketType::DomainConnectRequest || headerType == PacketType::DomainConnectRequestPending)
&& headerVersion != versionForPacketType(PacketType::DomainConnectRequest)) {
DomainGatekeeper::sendProtocolMismatchConnectionDenial(packet.getSenderSockAddr());
}
@@ -807,6 +807,8 @@ void DomainServer::setupNodeListAndAssignments() {
// register the gatekeeper for the packets it needs to receive
packetReceiver.registerListener(PacketType::DomainConnectRequest,
PacketReceiver::makeUnsourcedListenerReference(&_gatekeeper, &DomainGatekeeper::processConnectRequestPacket));
+ packetReceiver.registerListener(PacketType::DomainConnectRequestPending,
+ PacketReceiver::makeUnsourcedListenerReference(&_gatekeeper, &DomainGatekeeper::processConnectRequestPacket));
packetReceiver.registerListener(PacketType::ICEPing,
PacketReceiver::makeUnsourcedListenerReference(&_gatekeeper, &DomainGatekeeper::processICEPingPacket));
packetReceiver.registerListener(PacketType::ICEPingReply,
diff --git a/hifi_qt.py b/hifi_qt.py
index 48e9b337a6..7ee8a787b5 100644
--- a/hifi_qt.py
+++ b/hifi_qt.py
@@ -27,7 +27,7 @@ endif()
def __init__(self, args):
self.args = args
self.configFilePath = os.path.join(args.build_root, 'qt.cmake')
- self.version = os.getenv('VIRCADIA_USE_QT_VERSION', '5.12.3')
+ self.version = os.getenv('VIRCADIA_USE_QT_VERSION', '5.15.2')
self.assets_url = hifi_utils.readEnviromentVariableFromFile(args.build_root, 'EXTERNAL_BUILD_ASSETS')
@@ -53,36 +53,71 @@ endif()
# OS dependent information
system = platform.system()
+ cpu_architecture = platform.machine()
if 'Windows' == system:
- self.qtUrl = self.assets_url + '/dependencies/vcpkg/qt5-install-5.12.3-windows3.tar.gz%3FversionId=5ADqP0M0j5ZfimUHrx4zJld6vYceHEsI'
+ self.qtUrl = self.assets_url + '/dependencies/vcpkg/qt5-install-5.15.2-windows.tar.gz'
elif 'Darwin' == system:
- self.qtUrl = self.assets_url + '/dependencies/vcpkg/qt5-install-5.12.3-macos.tar.gz%3FversionId=bLAgnoJ8IMKpqv8NFDcAu8hsyQy3Rwwz'
+ self.qtUrl = self.assets_url + '/dependencies/vcpkg/qt5-install-5.15.2-macos.tar.gz'
elif 'Linux' == system:
import distro
dist = distro.linux_distribution()
- if distro.id() == 'ubuntu':
- u_major = int( distro.major_version() )
- u_minor = int( distro.minor_version() )
+ if 'x86_64' == cpu_architecture:
+ if distro.id() == 'ubuntu':
+ u_major = int( distro.major_version() )
+ u_minor = int( distro.minor_version() )
- if u_major == 16:
- self.qtUrl = self.assets_url + '/dependencies/vcpkg/qt5-install-5.12.3-ubuntu-16.04-with-symbols.tar.gz'
- elif u_major == 18:
- self.qtUrl = self.assets_url + '/dependencies/vcpkg/qt5-install-5.12.3-ubuntu-18.04.tar.gz'
- elif u_major == 19 and u_minor == 10:
- self.qtUrl = self.assets_url + '/dependencies/vcpkg/qt5-install-5.12.6-ubuntu-19.10.tar.xz'
- elif u_major > 19:
- print("We don't support " + distro.name(pretty=True) + " yet. Perhaps consider helping us out?")
- raise Exception('LINUX DISTRO IS NOT SUPPORTED YET!!!')
+ if u_major == 18:
+ self.qtUrl = self.assets_url + '/dependencies/vcpkg/qt5-install-5.15.2-ubuntu-18.04-amd64.tar.xz'
+ elif u_major > 19:
+ print("We don't support " + distro.name(pretty=True) + " yet. Perhaps consider helping us out?")
+ raise Exception('LINUX DISTRO IS NOT SUPPORTED YET!!!')
+ else:
+ print("Sorry, " + distro.name(pretty=True) + " is old and won't be officially supported. Please consider upgrading.");
+ raise Exception('UNKNOWN LINUX DISTRO VERSION!!!')
else:
- print("Sorry, " + distro.name(pretty=True) + " is old and won't be officially supported. Please consider upgrading.");
- raise Exception('UNKNOWN LINUX DISTRO VERSION!!!')
+ print("Sorry, " + distro.name(pretty=True) + " is not supported on x86_64. Please consider helping us out.")
+ print("It's also possible to build Qt for your distribution, please see the documentation at:")
+ print("https://github.com/vircadia/vircadia/tree/master/tools/qt-builder")
+ raise Exception('UNKNOWN LINUX VERSION!!!')
+ elif 'aarch64' == cpu_architecture:
+ if distro.id() == 'ubuntu':
+ u_major = int( distro.major_version() )
+ u_minor = int( distro.minor_version() )
+
+ if u_major == 18:
+ self.qtUrl = 'http://motofckr9k.ddns.net/vircadia_packages/qt5-install-5.15.2-ubuntu-18.04-aarch64_test.tar.xz'
+ elif u_major > 19:
+ print("We don't support " + distro.name(pretty=True) + " on aarch64 yet. Perhaps consider helping us out?")
+ raise Exception('LINUX DISTRO IS NOT SUPPORTED YET!!!')
+ else:
+ print("Sorry, " + distro.name(pretty=True) + " is old and won't be officially supported. Please consider upgrading.");
+ raise Exception('UNKNOWN LINUX DISTRO VERSION!!!')
+
+ elif distro.id() == 'debian':
+ u_major = int( distro.major_version() )
+ u_minor = int( distro.minor_version() )
+
+ if u_major == 10:
+ #self.qtUrl = self.assets_url + '/dependencies/vcpkg/qt5-install-5.12.3-ubuntu-16.04-with-symbols.tar.gz'
+ print("We don't support " + distro.name(pretty=True) + " on aarch64 yet. Perhaps consider helping us out?")
+ raise Exception('LINUX DISTRO IS NOT SUPPORTED YET!!!')
+ elif u_major > 10:
+ print("We don't support " + distro.name(pretty=True) + " on aarch64 yet. Perhaps consider helping us out?")
+ raise Exception('LINUX DISTRO IS NOT SUPPORTED YET!!!')
+ else:
+ print("Sorry, " + distro.name(pretty=True) + " is old and won't be officially supported. Please consider upgrading.");
+ raise Exception('UNKNOWN LINUX DISTRO VERSION!!!')
+
+ else:
+ print("Sorry, " + distro.name(pretty=True) + " is not supported on aarch64. Please consider helping us out.")
+ print("It's also possible to build Qt for your distribution, please see the documentation at:")
+ print("https://github.com/vircadia/vircadia/tree/master/tools/qt-builder")
+ raise Exception('UNKNOWN LINUX VERSION!!!')
else:
- print("Sorry, " + distro.name(pretty=True) + " is not supported. Please consider helping us out.")
- print("It's also possible to build Qt for your distribution, please see the documentation at:")
- print("https://github.com/vircadia/vircadia/tree/master/tools/qt-builder")
- raise Exception('UNKNOWN LINUX VERSION!!!')
+ raise Exception('UNKNOWN CPU ARCHITECTURE!!!')
+
else:
print("System : " + platform.system())
print("Architecture: " + platform.architecture())
diff --git a/hifi_vcpkg.py b/hifi_vcpkg.py
index ebdfb6c972..fb77fd2507 100644
--- a/hifi_vcpkg.py
+++ b/hifi_vcpkg.py
@@ -44,13 +44,14 @@ endif()
self.assets_url = self.readVar('EXTERNAL_BUILD_ASSETS')
# The noClean flag indicates we're doing weird dependency maintenance stuff
- # i.e. we've got an explicit checkout of vcpkg and we don't want the script to
- # do stuff it might otherwise do. It typically indicates that we're using our
+ # i.e. we've got an explicit checkout of vcpkg and we don't want the script to
+ # do stuff it might otherwise do. It typically indicates that we're using our
# own git checkout of vcpkg and manually managing it
self.noClean = False
# OS dependent information
system = platform.system()
+ machine = platform.machine()
if 'HIFI_VCPKG_PATH' in os.environ:
self.path = os.environ['HIFI_VCPKG_PATH']
@@ -105,6 +106,12 @@ endif()
self.bootstrapEnv['CXXFLAGS'] = '-D_CTERMID_H_'
if usePrebuilt:
self.prebuiltArchive = self.assets_url + "/dependencies/vcpkg/builds/vcpkg-osx.tgz%3FversionId=6JrIMTdvpBF3MAsjA92BMkO79Psjzs6Z"
+ elif 'Linux' == system and 'aarch64' == machine:
+ self.exe = os.path.join(self.path, 'vcpkg')
+ self.bootstrapCmds = [ os.path.join(self.path, 'bootstrap-vcpkg.sh'), '-disableMetrics' ]
+ self.vcpkgUrl = 'http://motofckr9k.ddns.net/vircadia_packages/vcpkg-2020.11-1_arm64.tar.xz'
+ self.vcpkgHash = 'f39fa1c34d2ba820954b8ce4acc05e3d0ce5fa5efe5440516ba910ff222c85c658ba4bbfc92b3fa6cbb594f99be115cda69ebe44ed38d4d3988058fb1faefbb3'
+ self.hostTriplet = 'arm64-linux'
else:
self.exe = os.path.join(self.path, 'vcpkg')
self.bootstrapCmds = [ os.path.join(self.path, 'bootstrap-vcpkg.sh'), '-disableMetrics' ]
diff --git a/ice-server/CMakeLists.txt b/ice-server/CMakeLists.txt
index 07b90b369e..9234d68faf 100644
--- a/ice-server/CMakeLists.txt
+++ b/ice-server/CMakeLists.txt
@@ -19,6 +19,7 @@ endif ()
include_directories(SYSTEM "${OPENSSL_INCLUDE_DIR}")
setup_memory_debugger()
+setup_thread_debugger()
# append OpenSSL to our list of libraries to link
target_link_libraries(${TARGET_NAME} ${OPENSSL_LIBRARIES})
diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt
index 0a0ade149d..c307c63142 100644
--- a/interface/CMakeLists.txt
+++ b/interface/CMakeLists.txt
@@ -1,4 +1,10 @@
-set(TARGET_NAME interface)
+if (APPLE)
+ # Make the OSX DMG app be Vircadia.app.
+ set(TARGET_NAME Vircadia)
+else()
+ set(TARGET_NAME interface)
+endif()
+
project(${TARGET_NAME})
file(GLOB_RECURSE QML_SRC resources/qml/*.qml resources/qml/*.js)
@@ -47,6 +53,7 @@ add_custom_target(resources ALL DEPENDS ${GENERATE_QRC_DEPENDS})
set(OPTIONAL_EXTERNALS "LeapMotion")
setup_memory_debugger()
+setup_thread_debugger()
foreach(EXTERNAL ${OPTIONAL_EXTERNALS})
string(TOUPPER ${EXTERNAL} ${EXTERNAL}_UPPERCASE)
@@ -191,9 +198,12 @@ if (BUILD_TOOLS AND NPM_EXECUTABLE)
endif()
if (WIN32 OR APPLE)
- add_dependencies(${TARGET_NAME} resources screenshare)
+ add_dependencies(${TARGET_NAME} resources)
endif()
+if (SCREENSHARE)
+ add_dependencies(${TARGET_NAME} screenshare)
+endif()
if (WIN32)
# These are external plugins, but we need to do the 'add dependency' here so that their
@@ -218,7 +228,7 @@ endif()
# link required hifi libraries
link_hifi_libraries(
shared workload task octree ktx gpu gl procedural graphics graphics-scripting render
- pointers recording hfm fbx networking material-networking
+ pointers recording hfm model-serializers networking material-networking
model-networking model-baker entities avatars
audio audio-client animation script-engine physics
render-utils entities-renderer avatars-renderer ui qml auto-updater midi
@@ -299,7 +309,7 @@ target_link_libraries(
${PLATFORM_QT_LIBRARIES}
)
-if (UNIX AND NOT ANDROID)
+if (UNIX AND NOT ANDROID AND NOT VIRCADIA_THREAD_DEBUGGING)
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
# Linux
target_link_libraries(${TARGET_NAME} pthread atomic)
@@ -333,10 +343,6 @@ if (APPLE)
COMMAND "${CMAKE_COMMAND}" -E copy_directory
"${CMAKE_SOURCE_DIR}/scripts"
"${RESOURCES_DEV_DIR}/scripts"
- # copy screenshare app to the resource folder
- COMMAND "${CMAKE_COMMAND}" -E copy_directory
- "${CMAKE_CURRENT_BINARY_DIR}/../screenshare/hifi-screenshare-darwin-x64/hifi-screenshare.app"
- "${RESOURCES_DEV_DIR}/hifi-screenshare.app"
# copy JSDoc files beside the executable
COMMAND "${CMAKE_COMMAND}" -E copy_directory
"${CMAKE_SOURCE_DIR}/tools/jsdoc/out"
@@ -363,6 +369,15 @@ if (APPLE)
"${RESOURCES_DEV_DIR}/serverless/redirect.json"
)
+ if (SCREENSHARE)
+ add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
+ # copy screenshare app to the resource folder
+ COMMAND "${CMAKE_COMMAND}" -E copy_directory
+ "${CMAKE_CURRENT_BINARY_DIR}/../screenshare/hifi-screenshare-darwin-x64/hifi-screenshare.app"
+ "${RESOURCES_DEV_DIR}/hifi-screenshare.app"
+ )
+ endif()
+
# call the fixup_interface macro to add required bundling commands for installation
fixup_interface()
diff --git a/interface/resources/qml/controlsUit/SpinBox.qml b/interface/resources/qml/controlsUit/SpinBox.qml
index a888bbd07c..719b0d00c1 100644
--- a/interface/resources/qml/controlsUit/SpinBox.qml
+++ b/interface/resources/qml/controlsUit/SpinBox.qml
@@ -73,9 +73,9 @@ SpinBox {
}
}
- stepSize: realStepSize * factor
- to : realTo*factor
- from : realFrom*factor
+ stepSize: Math.round(realStepSize * factor)
+ to : Math.round(realTo*factor)
+ from : Math.round(realFrom*factor)
font.family: "Fira Sans SemiBold"
font.pixelSize: hifi.fontSizes.textFieldInput
@@ -97,11 +97,11 @@ SpinBox {
}
textFromValue: function(value, locale) {
- return parseFloat(value / factor).toFixed(decimals);
+ return (value / factor).toFixed(decimals);
}
valueFromText: function(text, locale) {
- return Number.fromLocaleString(locale, text) * factor;
+ return Math.round(Number.fromLocaleString(locale, text) * factor);
}
diff --git a/interface/resources/qml/dialogs/preferences/SpinBoxPreference.qml b/interface/resources/qml/dialogs/preferences/SpinBoxPreference.qml
index 1b080c2759..5b3a28cd1d 100644
--- a/interface/resources/qml/dialogs/preferences/SpinBoxPreference.qml
+++ b/interface/resources/qml/dialogs/preferences/SpinBoxPreference.qml
@@ -51,6 +51,7 @@ Preference {
decimals: preference.decimals
minimumValue: preference.min
maximumValue: preference.max
+ realStepSize: preference.step
width: 100
anchors {
verticalCenter: parent.verticalCenter
diff --git a/interface/resources/qml/dialogs/preferences/SpinnerSliderPreference.qml b/interface/resources/qml/dialogs/preferences/SpinnerSliderPreference.qml
index cbc804d9d7..bf7ea08d3a 100644
--- a/interface/resources/qml/dialogs/preferences/SpinnerSliderPreference.qml
+++ b/interface/resources/qml/dialogs/preferences/SpinnerSliderPreference.qml
@@ -76,6 +76,7 @@ Preference {
realValue: preference.value
minimumValue: preference.min
maximumValue: preference.max
+ realStepSize: preference.step
width: 100
onValueChanged: {
slider.value = realValue;
diff --git a/interface/resources/serverless/Models/Planter.glb b/interface/resources/serverless/Models/Planter.glb
new file mode 100644
index 0000000000..7e575d0ddf
Binary files /dev/null and b/interface/resources/serverless/Models/Planter.glb differ
diff --git a/interface/resources/serverless/Models/Stands.fbx b/interface/resources/serverless/Models/Stands.fbx
new file mode 100644
index 0000000000..ac5b2cafda
Binary files /dev/null and b/interface/resources/serverless/Models/Stands.fbx differ
diff --git a/interface/resources/serverless/Models/Trees1.glb b/interface/resources/serverless/Models/Trees1.glb
new file mode 100644
index 0000000000..23c66c6c05
Binary files /dev/null and b/interface/resources/serverless/Models/Trees1.glb differ
diff --git a/interface/resources/serverless/Models/VircadiaLogo.fbx b/interface/resources/serverless/Models/VircadiaLogo.fbx
new file mode 100644
index 0000000000..78de8d27cd
Binary files /dev/null and b/interface/resources/serverless/Models/VircadiaLogo.fbx differ
diff --git a/interface/resources/serverless/Models/bowl2.fbx b/interface/resources/serverless/Models/bowl2.fbx
new file mode 100644
index 0000000000..0f3d0048b2
Binary files /dev/null and b/interface/resources/serverless/Models/bowl2.fbx differ
diff --git a/interface/resources/serverless/Models/dome2.glb b/interface/resources/serverless/Models/dome2.glb
new file mode 100644
index 0000000000..0069f88f54
Binary files /dev/null and b/interface/resources/serverless/Models/dome2.glb differ
diff --git a/interface/resources/serverless/Models/dome2_glass.glb b/interface/resources/serverless/Models/dome2_glass.glb
new file mode 100644
index 0000000000..757bbeb9d5
Binary files /dev/null and b/interface/resources/serverless/Models/dome2_glass.glb differ
diff --git a/interface/resources/serverless/Models/mirror_without_backface.baked.fbx b/interface/resources/serverless/Models/mirror_without_backface.baked.fbx
new file mode 100644
index 0000000000..83f9de79b9
Binary files /dev/null and b/interface/resources/serverless/Models/mirror_without_backface.baked.fbx differ
diff --git a/interface/resources/serverless/Models/seagull-ANI.fbx b/interface/resources/serverless/Models/seagull-ANI.fbx
new file mode 100644
index 0000000000..9bb180f3c4
Binary files /dev/null and b/interface/resources/serverless/Models/seagull-ANI.fbx differ
diff --git a/interface/resources/serverless/Models/temple5.glb b/interface/resources/serverless/Models/temple5.glb
new file mode 100644
index 0000000000..08a10975ac
Binary files /dev/null and b/interface/resources/serverless/Models/temple5.glb differ
diff --git a/interface/resources/serverless/Scripts/materialSequencer.js b/interface/resources/serverless/Scripts/materialSequencer.js
new file mode 100644
index 0000000000..998a8759e6
--- /dev/null
+++ b/interface/resources/serverless/Scripts/materialSequencer.js
@@ -0,0 +1,59 @@
+// Distributed under the Apache License, Version 2.0.
+// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
+// 2020 Silverfish.
+//material sequencer, put on a material entity (server script) to make it iterate through discrete steps of X UV offset.
+
+/*UserData:
+{
+ "verticalOffset": 0,
+ "segments": 16,
+ "updateInterval": 250
+}
+*/
+
+(function() {
+ var DEFAULT_VERTICAL_OFFSET = 0.0;
+ var DEFAULT_HORIZONTAL_SPEED = 1;
+ var DEFAULT_UPDATE_INTERVAL = 1000;
+ var DEFAULT_SEGMENTS = 16;
+
+ var self = this;
+ var _entityID;
+ this.preload = function(entityID) {
+ _entityID = entityID;
+ var verticalOffset = DEFAULT_VERTICAL_OFFSET;
+ var updateInterval = DEFAULT_UPDATE_INTERVAL;
+ var moveDistance = 1 / DEFAULT_SEGMENTS;
+ var verticalOffset = DEFAULT_VERTICAL_OFFSET;
+ var oldPosition = 0;
+ var currentPosition = 0;
+ var userData = JSON.parse(Entities.getEntityProperties(_entityID, ["userData"]).userData);
+ if (userData !== undefined) {
+ if (userData.segments !== undefined) {
+ moveDistance = 1 / userData.segments;
+ }
+ if (userData.verticalOffset !== undefined) {
+ verticalOffset = userData.verticalOffset;
+ }
+ if (userData.updateInterval !== undefined) {
+ updateInterval = userData.updateInterval;
+ }
+ }
+
+ self.intervalID = Script.setInterval(function() {
+ if(currentPosition >= 1){
+ currentPosition = 0;
+ oldPosition = 0;
+ }
+
+ Entities.editEntity(_entityID, { materialMappingPos: { x: currentPosition, y: verticalOffset}});
+ // print("current Pos: " + currentPosition);
+ currentPosition = oldPosition + moveDistance;
+ oldPosition = currentPosition;
+ }, updateInterval);
+ };
+
+ this.unload = function() {
+ Script.clearInterval(self.intervalID);
+ }
+});
\ No newline at end of file
diff --git a/interface/resources/serverless/Scripts/mirrorClient.js b/interface/resources/serverless/Scripts/mirrorClient.js
new file mode 100644
index 0000000000..9b917668cd
--- /dev/null
+++ b/interface/resources/serverless/Scripts/mirrorClient.js
@@ -0,0 +1,182 @@
+//
+// mirrorClient.js
+//
+// Created by Patrick Manalich
+// Edited by Rebecca Stankus on 8/30/17.
+// Edited by David Back on 11/17/17.
+// Edited by Anna Brewer on 7/12/19.
+// Copyright 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
+//
+// Attach `mirrorClient.js` to a box entity whose z dimension is very small,
+// and whose x and y dimensions are up to you. See comments in `mirrorReflection.js`
+// for more information about the mirror on/off zone.
+
+"use strict";
+
+(function () { // BEGIN LOCAL SCOPE
+
+ // VARIABLES
+ /* globals utils, Render */
+ var _this = this;
+ var MAX_MIRROR_RESOLUTION_SIDE_PX = 960; // The max pixel resolution of the long side of the mirror
+ var ZERO_ROT = { w: 1, x: 0, y: 0, z: 0 }; // Constant quaternion for a rotation of 0
+ var FAR_CLIP_DISTANCE = 16; // The far clip distance for the spectator camera when the mirror is on
+ var mirrorLocalEntityID = false; // The entity ID of the local entity that displays the mirror reflection
+ var mirrorLocalEntityRunning; // True if mirror local entity is reflecting, false otherwise
+ var mirrorLocalEntityOffset = 0.01; // The distance between the center of the mirror and the mirror local entity
+ var spectatorCameraConfig = Render.getConfig("SecondaryCamera"); // Render configuration for the spectator camera
+ var lastDimensions = { x: 0, y: 0 }; // The previous dimensions of the mirror
+ var previousFarClipDistance; // Store the specator camera's previous far clip distance that we override for the mirror
+
+ // LOCAL FUNCTIONS
+ function isPositionInsideBox(position, boxProperties) {
+ var localPosition = Vec3.multiplyQbyV(Quat.inverse(boxProperties.rotation),
+ Vec3.subtract(MyAvatar.position, boxProperties.position));
+ var halfDimensions = Vec3.multiply(boxProperties.dimensions, 0.5);
+ return -halfDimensions.x <= localPosition.x &&
+ halfDimensions.x >= localPosition.x &&
+ -halfDimensions.y <= localPosition.y &&
+ halfDimensions.y >= localPosition.y &&
+ -halfDimensions.z <= localPosition.z &&
+ halfDimensions.z >= localPosition.z;
+ }
+
+ // When x or y dimensions of the mirror change - reset the resolution of the
+ // spectator camera and edit the mirror local entity to adjust for the new dimensions
+ function updateMirrorDimensions(forceUpdate) {
+
+ if (!mirrorLocalEntityID) {
+ return;
+ }
+
+ if (mirrorLocalEntityRunning) {
+ var newDimensions = Entities.getEntityProperties(_this.entityID, 'dimensions').dimensions;
+
+ if (forceUpdate === true || (newDimensions.x != lastDimensions.x || newDimensions.y != lastDimensions.y)) {
+ var mirrorResolution = _this.calculateMirrorResolution(newDimensions);
+ spectatorCameraConfig.resetSizeSpectatorCamera(mirrorResolution.x, mirrorResolution.y);
+ Entities.editEntity(mirrorLocalEntityID, {
+ dimensions: {
+ x: (Math.max(newDimensions.x, newDimensions.y)),
+ y: (Math.max(newDimensions.x, newDimensions.y)),
+ z: 0
+ }
+ });
+ }
+ lastDimensions = newDimensions;
+ }
+ }
+
+ // Takes in an mirror scalar number which is used for the index of "halfDimSigns" that is needed to adjust the mirror
+ // local entity's position. Deletes and re-adds the mirror local entity so the url and position are updated.
+ function createMirrorLocalEntity() {
+
+ if (mirrorLocalEntityID) {
+ Entities.deleteEntity(mirrorLocalEntityID);
+ mirrorLocalEntityID = false;
+ }
+
+ if (mirrorLocalEntityRunning) {
+ mirrorLocalEntityID = Entities.addEntity({
+ type: "Image",
+ name: "mirrorLocalEntity",
+ imageURL: "resource://spectatorCameraFrame",
+ emissive: true,
+ parentID: _this.entityID,
+ alpha: 1,
+ localPosition: {
+ x: 0,
+ y: 0,
+ z: mirrorLocalEntityOffset
+ },
+ localRotation: Quat.fromPitchYawRollDegrees(0, 0, 180),
+ isVisibleInSecondaryCamera: false
+ }, "local");
+
+ updateMirrorDimensions(true);
+ }
+
+ }
+
+ _this.calculateMirrorResolution = function(entityDimensions) {
+ var mirrorResolutionX, mirrorResolutionY;
+ if (entityDimensions.x > entityDimensions.y) {
+ mirrorResolutionX = MAX_MIRROR_RESOLUTION_SIDE_PX;
+ mirrorResolutionY = Math.round(mirrorResolutionX * entityDimensions.y / entityDimensions.x);
+ } else {
+ mirrorResolutionY = MAX_MIRROR_RESOLUTION_SIDE_PX;
+ mirrorResolutionX = Math.round(mirrorResolutionY * entityDimensions.x / entityDimensions.y);
+ }
+
+ var resolution = {
+ "x": mirrorResolutionX,
+ "y": mirrorResolutionY
+ };
+
+ return resolution;
+ };
+
+ // Sets up spectator camera to render the mirror, calls 'createMirrorLocalEntity' once to set up
+ // mirror local entity, then connects 'updateMirrorDimensions' to update dimension changes
+ _this.mirrorLocalEntityOn = function(onPreload) {
+ if (!mirrorLocalEntityRunning) {
+ if (!spectatorCameraConfig.attachedEntityId) {
+ mirrorLocalEntityRunning = true;
+ spectatorCameraConfig.mirrorProjection = true;
+ spectatorCameraConfig.attachedEntityId = _this.entityID;
+ previousFarClipDistance = spectatorCameraConfig.farClipPlaneDistance;
+ spectatorCameraConfig.farClipPlaneDistance = FAR_CLIP_DISTANCE;
+ var entityProperties = Entities.getEntityProperties(_this.entityID, ['dimensions']);
+ var mirrorEntityDimensions = entityProperties.dimensions;
+ var initialResolution = _this.calculateMirrorResolution(mirrorEntityDimensions);
+ spectatorCameraConfig.resetSizeSpectatorCamera(initialResolution.x, initialResolution.y);
+ spectatorCameraConfig.enableSecondaryCameraRenderConfigs(true);
+ createMirrorLocalEntity();
+ Script.update.connect(updateMirrorDimensions);
+ } else {
+ print("Cannot turn on mirror if spectator camera is already in use");
+ }
+ }
+ };
+
+ // Resets spectator camera, deletes the mirror local entity, and disconnects 'updateMirrorDimensions'
+ _this.mirrorLocalEntityOff = function() {
+ if (mirrorLocalEntityRunning) {
+ spectatorCameraConfig.enableSecondaryCameraRenderConfigs(false);
+ spectatorCameraConfig.mirrorProjection = false;
+ spectatorCameraConfig.attachedEntityId = null;
+ spectatorCameraConfig.farClipPlaneDistance = previousFarClipDistance;
+ if (mirrorLocalEntityID) {
+ Entities.deleteEntity(mirrorLocalEntityID);
+ mirrorLocalEntityID = false;
+ }
+ Script.update.disconnect(updateMirrorDimensions);
+ mirrorLocalEntityRunning = false;
+ }
+ };
+
+ // ENTITY FUNCTIONS
+ _this.preload = function(entityID) {
+ _this.entityID = entityID;
+ mirrorlocalEntityRunning = false;
+
+ // If avatar is already inside the mirror zone at the time preload is called then turn on the mirror
+ var children = Entities.getChildrenIDs(_this.entityID);
+ var childZero = Entities.getEntityProperties(children[0]);
+ if (isPositionInsideBox(MyAvatar.position, {
+ position: childZero.position,
+ rotation: childZero.rotation,
+ dimensions: childZero.dimensions
+ })) {
+ _this.mirrorLocalEntityOn(true);
+ }
+ };
+
+ // Turn off mirror on unload
+ _this.unload = function(entityID) {
+ _this.mirrorLocalEntityOff();
+ };
+});
diff --git a/interface/resources/serverless/Scripts/mirrorReflection.js b/interface/resources/serverless/Scripts/mirrorReflection.js
new file mode 100644
index 0000000000..11f4f0781d
--- /dev/null
+++ b/interface/resources/serverless/Scripts/mirrorReflection.js
@@ -0,0 +1,32 @@
+//
+// mirrorReflection.js
+//
+// Created by Rebecca Stankus on 8/30/17.
+// Copyright 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
+//
+// Attach `mirrorReflection.js` to a zone entity that is parented to
+// the box entity whose Script is `mirrorClient.js`.
+// When a user enters this zone, the mirror will turn on.
+// When a user leaves this zone, the mirror will turn off.
+
+(function () {
+ var mirrorID, reflectionAreaID;
+ // get id of reflection area and mirror
+ this.preload = function(entityID) {
+ reflectionAreaID = entityID;
+ mirrorID = Entities.getEntityProperties(reflectionAreaID, 'parentID').parentID;
+ };
+
+ // when avatar enters reflection area, begin reflecting
+ this.enterEntity = function(entityID){
+ Entities.callEntityMethod(mirrorID, 'mirrorLocalEntityOn');
+ };
+
+ // when avatar leaves reflection area, stop reflecting
+ this.leaveEntity = function (entityID) {
+ Entities.callEntityMethod(mirrorID, 'mirrorLocalEntityOff');
+ };
+});
diff --git a/interface/resources/serverless/Scripts/portal.js b/interface/resources/serverless/Scripts/portal.js
new file mode 100644
index 0000000000..0542e74796
--- /dev/null
+++ b/interface/resources/serverless/Scripts/portal.js
@@ -0,0 +1,47 @@
+//
+// portal.js
+// Created by Zach Fox on 2019-05-23
+// Copyright 2019 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
+
+(function () {
+ var Portal = function() {};
+
+
+ Portal.prototype = {
+ enterEntity: function (id) {
+ var properties = Entities.getEntityProperties(id, ["userData"]);
+ var userData;
+
+ try {
+ userData = JSON.parse(properties.userData);
+ } catch (e) {
+ console.error("Error parsing userData: ", e);
+ }
+
+ if (userData) {
+ if (userData.destination) {
+ var destination = userData.destination;
+
+ if (userData.destination.indexOf("bookmark:") > -1) {
+ var bookmarkName = userData.destination.replace("bookmark:", "");
+ destination = LocationBookmarks.getAddress(bookmarkName);
+ }
+
+ Window.location = destination;
+ } else {
+ console.log("Please specify `destination` inside this entity's `userData`!");
+ return;
+ }
+ } else {
+ console.log("Please specify this entity's `userData`! See README.md for instructions.");
+ return;
+ }
+ }
+ };
+
+
+ return new Portal();
+});
diff --git a/interface/resources/serverless/Scripts/soundEmitter.js b/interface/resources/serverless/Scripts/soundEmitter.js
new file mode 100644
index 0000000000..504bd418f9
--- /dev/null
+++ b/interface/resources/serverless/Scripts/soundEmitter.js
@@ -0,0 +1,202 @@
+/* eslint-disable no-magic-numbers */
+//
+// soundEmitter.js
+//
+// Created by Zach Fox on 2019-07-05
+// Copyright High Fidelity 2019
+//
+// Licensed under the Apache 2.0 License
+// See accompanying license file or http://apache.org/
+//
+
+(function() {
+ var that;
+ var SOUND_EMITTER_UPDATE_INTERVAL_MS = 500;
+ var DEFAULT_AUDIO_INJECTOR_OPTIONS = {
+ "position": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "volume": 0.5,
+ "loop": false,
+ "localOnly": false
+ };
+
+
+ var SoundEmitter = function() {
+ that = this;
+ that.entityID = false;
+ that.soundObjectURL = false;
+ that.soundObject = false;
+ that.audioInjector = false;
+ that.audioInjectorOptions = DEFAULT_AUDIO_INJECTOR_OPTIONS;
+ that.signalsConnected = {};
+ that.soundEmitterUpdateInterval = false;
+ };
+
+
+ SoundEmitter.prototype = {
+ preload: function(entityID) {
+ that.entityID = entityID;
+
+ var properties = Entities.getEntityProperties(that.entityID, ["userData"]);
+
+ var userData;
+
+ try {
+ userData = JSON.parse(properties.userData);
+ } catch (e) {
+ console.error("Error parsing userData: ", e);
+ }
+
+ if (userData) {
+ if (userData.soundURL && userData.soundURL.length > 0) {
+ that.handleNewSoundURL(userData.soundURL);
+ } else {
+ console.log("Please specify this entity's `userData`! See README.md for instructions.");
+ return;
+ }
+ } else {
+ console.log("Please specify this entity's `userData`! See README.md for instructions.");
+ return;
+ }
+ },
+
+
+ clearCurrentSoundData: function() {
+ that.soundObjectURL = false;
+
+ if (that.signalsConnected["soundObjectReady"]) {
+ that.soundObject.ready.disconnect(that.updateSoundEmitter);
+ that.signalsConnected["soundObjectReady"] = false;
+ }
+
+ that.soundObject = false;
+
+ if (that.audioInjector) {
+ if (that.audioInjector.playing) {
+ that.audioInjector.stop();
+ }
+
+ that.audioInjector = false;
+ }
+
+ that.audioInjectorOptions = DEFAULT_AUDIO_INJECTOR_OPTIONS;
+
+ if (that.soundEmitterUpdateInterval) {
+ Script.clearInterval(that.soundEmitterUpdateInterval);
+ that.soundEmitterUpdateInterval = false;
+ }
+ },
+
+
+ unload: function() {
+ that.clearCurrentSoundData();
+ },
+
+
+ handleNewSoundURL: function(newSoundURL) {
+ that.clearCurrentSoundData();
+
+ that.soundObjectURL = newSoundURL;
+ that.soundObject = SoundCache.getSound(that.soundObjectURL);
+
+ if (that.soundObject.downloaded) {
+ that.updateSoundEmitter();
+ } else {
+ that.soundObject.ready.connect(that.updateSoundEmitter);
+ that.signalsConnected["soundObjectReady"] = true;
+ }
+ },
+
+
+ positionChanged: function(newPos) {
+ return (newPos.x !== that.audioInjectorOptions.position.x ||
+ newPos.y !== that.audioInjectorOptions.position.y ||
+ newPos.z !== that.audioInjectorOptions.position.z);
+ },
+
+
+ updateSoundEmitter: function() {
+ var properties = Entities.getEntityProperties(that.entityID, ["userData", "position", "script", "serverScripts"]);
+
+ var userData;
+
+ try {
+ userData = JSON.parse(properties.userData);
+ } catch (e) {
+ console.error("Error parsing userData: ", e);
+ }
+
+ var optionsChanged = false;
+ var shouldRestartPlayback = false;
+ var newPosition = properties.position;
+
+ if (userData) {
+ if (userData.soundURL && userData.soundURL.length > 0 && userData.soundURL !== that.soundObjectURL) {
+ console.log("Sound Emitter: User put a new sound URL into `userData`! Resetting...");
+ that.handleNewSoundURL(userData.soundURL);
+ return;
+ }
+
+ if (typeof(userData.volume) !== "undefined" && !isNaN(userData.volume) && userData.volume !== that.audioInjectorOptions.volume) {
+ optionsChanged = true;
+ that.audioInjectorOptions.volume = userData.volume;
+ }
+
+ if (typeof(userData.shouldLoop) !== "undefined" && userData.shouldLoop !== that.audioInjectorOptions.shouldLoop) {
+ optionsChanged = true;
+
+ if (!that.audioInjectorOptions.loop && userData.shouldLoop && that.audioInjector && !that.audioInjector.playing) {
+ shouldRestartPlayback = true;
+ }
+
+ that.audioInjectorOptions.loop = userData.shouldLoop;
+ }
+
+ if (typeof(userData.positionOverride) !== "undefined" && !isNaN(userData.positionOverride.x) &&
+ !isNaN(userData.positionOverride.y) && !isNaN(userData.positionOverride.z)) {
+ newPosition = userData.positionOverride;
+ }
+ } else {
+ console.log("Please specify this entity's `userData`! See README.md for instructions.");
+ that.clearCurrentSoundData();
+ return;
+ }
+
+ var localOnly = that.audioInjectorOptions.localOnly;
+ // If this script is attached as a client entity script...
+ if (properties.script.indexOf("soundEmitter.js") > -1) {
+ // ... Make sure that the audio injector IS local only.
+ localOnly = true;
+ // Else if this script is attached as a client server script...
+ } else if (properties.serverScripts.indexOf("soundEmitter.js") > -1) {
+ // ... Make sure that the audio injector IS NOT local only.
+ localOnly = false;
+ }
+ if (localOnly !== that.audioInjectorOptions.localOnly) {
+ optionsChanged = true;
+ that.audioInjectorOptions.localOnly = localOnly;
+ }
+
+ if (that.positionChanged(newPosition)) {
+ optionsChanged = true;
+ that.audioInjectorOptions["position"] = newPosition;
+ }
+
+ if (!that.audioInjector || shouldRestartPlayback) {
+ that.audioInjector = Audio.playSound(that.soundObject, that.audioInjectorOptions);
+ } else if (optionsChanged) {
+ that.audioInjector.setOptions(that.audioInjectorOptions);
+ }
+
+ if (!that.soundEmitterUpdateInterval) {
+ that.soundEmitterUpdateInterval = Script.setInterval(that.updateSoundEmitter, SOUND_EMITTER_UPDATE_INTERVAL_MS);
+ }
+ }
+ };
+
+
+ return new SoundEmitter();
+});
diff --git a/interface/resources/serverless/Scripts/wizardLoader.js b/interface/resources/serverless/Scripts/wizardLoader.js
new file mode 100644
index 0000000000..8d28b581cc
--- /dev/null
+++ b/interface/resources/serverless/Scripts/wizardLoader.js
@@ -0,0 +1,77 @@
+'use strict';
+
+//
+// wizardLoader.js
+//
+// Created by Kalila L. on Feb 19 2021.
+// Copyright 2021 Vircadia contributors.
+//
+// This script is used to load the onboarding wizard at the location of the entity it's on.
+//
+// Distributed under the Apache License, Version 2.0.
+// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
+//
+
+(function() {
+ var CONFIG_WIZARD_WEB_URL = 'https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Apps/configWizard/dist/index.html';
+
+ var loaderEntityID;
+ var configWizardEntityID;
+
+ function onWebAppEventReceived(sendingEntityID, event) {
+ if (sendingEntityID === configWizardEntityID) {
+ var eventJSON = JSON.parse(event);
+
+ if (eventJSON.command === 'first-run-wizard-ready') {
+ var objectToSend = {
+ command: 'script-to-web-initialize',
+ data: {
+ performancePreset: Performance.getPerformancePreset(),
+ refreshRateProfile: Performance.getRefreshRateProfile(),
+ displayName: MyAvatar.displayName
+ }
+ };
+
+ Entities.emitScriptEvent(configWizardEntityID, JSON.stringify(objectToSend));
+ }
+
+ if (eventJSON.command === 'complete-wizard') {
+ Performance.setPerformancePreset(eventJSON.data.performancePreset);
+ Performance.setRefreshRateProfile(eventJSON.data.refreshRateProfile);
+ MyAvatar.displayName = eventJSON.data.displayName;
+
+ Entities.deleteEntity(configWizardEntityID);
+ Entities.webEventReceived.disconnect(onWebAppEventReceived);
+ }
+ }
+ }
+
+ this.preload = function (entityID) {
+ loaderEntityID = entityID;
+ var loaderEntityProps = Entities.getEntityProperties(loaderEntityID, ['position', 'rotation']);
+
+ configWizardEntityID = Entities.addEntity({
+ type: 'Web',
+ sourceUrl: CONFIG_WIZARD_WEB_URL,
+ maxFPS: 60,
+ dpi: 20,
+ useBackground: false,
+ grab: {
+ grabbable: false
+ },
+ position: loaderEntityProps.position,
+ rotation: loaderEntityProps.rotation,
+ dimensions: { x: 1.4, y: 0.75, z: 0 }
+ }, 'local');
+
+ Entities.webEventReceived.connect(onWebAppEventReceived);
+ }
+
+ this.unload = function () {
+ if (configWizardEntityID) {
+ Entities.deleteEntity(configWizardEntityID);
+ Entities.webEventReceived.disconnect(onWebAppEventReceived);
+ }
+ }
+
+})
diff --git a/interface/resources/serverless/Sounds/468407__onderwish__sci-fi-survival-dreamscape.mp3 b/interface/resources/serverless/Sounds/468407__onderwish__sci-fi-survival-dreamscape.mp3
new file mode 100644
index 0000000000..218cc967b3
Binary files /dev/null and b/interface/resources/serverless/Sounds/468407__onderwish__sci-fi-survival-dreamscape.mp3 differ
diff --git a/interface/resources/serverless/Textures/default_particle.png b/interface/resources/serverless/Textures/default_particle.png
new file mode 100644
index 0000000000..6c781c824b
Binary files /dev/null and b/interface/resources/serverless/Textures/default_particle.png differ
diff --git a/interface/resources/serverless/Textures/galaxySkybox.JPG b/interface/resources/serverless/Textures/galaxySkybox.JPG
new file mode 100644
index 0000000000..e3ff7a4cf6
Binary files /dev/null and b/interface/resources/serverless/Textures/galaxySkybox.JPG differ
diff --git a/interface/resources/serverless/Textures/galaxySkybox.png b/interface/resources/serverless/Textures/galaxySkybox.png
new file mode 100644
index 0000000000..c7d9bf6d68
Binary files /dev/null and b/interface/resources/serverless/Textures/galaxySkybox.png differ
diff --git a/interface/resources/serverless/Textures/gradient1.jpg b/interface/resources/serverless/Textures/gradient1.jpg
new file mode 100644
index 0000000000..ef61b4dd97
Binary files /dev/null and b/interface/resources/serverless/Textures/gradient1.jpg differ
diff --git a/interface/resources/serverless/tutorial.json b/interface/resources/serverless/tutorial.json
index 17e7ea26e7..90d7e91aa3 100644
--- a/interface/resources/serverless/tutorial.json
+++ b/interface/resources/serverless/tutorial.json
@@ -1,19 +1,22 @@
{
- "DataVersion": 0,
- "Paths": {
- "/": "/0.155245,-0.941538,23.9289/0,0.791589,0,0.611053"
-},
+ "DataVersion": 0,
+ "Paths": {
+ "/old": "/0.155245,-0.941538,23.9289/0,0.791589,0,0.611053",
+ "/": "/21.6727,1.02002,25.1977/0,0.999868,0,-0.016252"
+
+ },
"Entities": [
- {
+ {
"id": "{0a199807-4a83-4286-b09c-f21124627c3e}",
"type": "Box",
"name": "Config Wizard Loader",
+ "locked": true,
"lastEdited": 1613737207915514,
"visible": false,
"position": {
- "x": -1.2722,
- "y": 0.4266,
- "z": 24.2307
+ "x": 21.8,
+ "y": 1.9,
+ "z": 28
},
"dimensions": {
"x": 0.20000000298023224,
@@ -21,10 +24,10 @@
"z": 0.20000000298023224
},
"rotation": {
- "x": 0,
- "y": -0.7660443782806396,
- "z": 0,
- "w": -0.6427876949310303
+ "x": 3.5931313391301956e-7,
+ "y": -0.9996991753578186,
+ "z": 0.000014645980627392419,
+ "w": 0.024525845423340797
},
"created": 1613736996738696,
"lastEditedBy": "{ff9b500e-e450-4127-b41f-1c42be16f71b}",
@@ -41,7 +44,7 @@
"angularDamping": 0,
"collisionless": true,
"ignoreForCollisions": true,
- "script": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Apps/configWizard/dist/wizardLoader.js",
+ "script": "qrc:///serverless/Scripts/wizardLoader.js",
"color": {
"red": 0,
"green": 180,
@@ -55,717 +58,35 @@
"isFacingAvatar": false
},
{
- "id": "{eb485a2d-2040-42f6-a960-51c88e2434b9}",
- "type": "Box",
- "lastEdited": 1601257171039244,
- "parentID": "{3deeadb3-5bab-4d1a-a8df-d3d4b192c76a}",
- "visible": false,
- "name": "Portal Cube",
- "locked": true,
- "userData": "{\"destination\":\"hifi://172.104.248.237:40102/154.572,-96.8437,-417.945/0,1,0,-1.52586e-05\"}",
- "position": {
- "x": -0.0005140304565429688,
- "y": -0.3913555145263672,
- "z": 0.0000209808349609375
- },
- "dimensions": {
- "x": 1.5066394805908203,
- "y": 2.504150629043579,
- "z": 0.20000000298023224
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1601254455054086,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": -20.05035400390625,
- "y": -6.776813983917236,
- "z": -13.91693115234375,
- "scale": 2.929288864135742
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "collisionMask": 0,
- "collidesWith": "",
- "script": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Scripts/portal.js",
- "color": {
- "red": 0,
- "green": 180,
- "blue": 239
- },
- "shape": "Cube",
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{7624234a-c3f9-433c-9ffa-ce17894f1842}",
- "type": "Text",
- "lastEdited": 1601257171039090,
- "parentID": "{3deeadb3-5bab-4d1a-a8df-d3d4b192c76a}",
- "name": "Portal Sign",
- "locked": true,
- "position": {
- "x": 0.0000591278076171875,
- "y": 1.9068689346313477,
- "z": -0.00003337860107421875
- },
- "dimensions": {
- "x": 3.3015296459198,
- "y": 0.511300265789032,
- "z": 0.009999999776482582
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1601237788304107,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": -20.255495071411133,
- "y": -4.684395790100098,
- "z": -14.123543739318848,
- "scale": 3.3409018516540527
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "collisionMask": 23,
- "collidesWith": "static,dynamic,kinematic,otherAvatar,",
- "billboardMode": "yaw",
- "text": "Portal to The Hub",
- "lineHeight": 0.4690000116825104,
- "textColor": {
- "red": 53,
- "green": 184,
- "blue": 240
- },
- "backgroundAlpha": 0,
- "unlit": true,
- "textEffect": "outline fill",
- "textEffectColor": {
- "red": 0,
- "green": 0,
- "blue": 0
- },
- "textEffectThickness": 0.36000001430511475,
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": true,
- "isFacingAvatar": false
-},
- {
- "id": "{4cc92ee0-e117-43f9-ae71-c6ff97979f11}",
- "type": "Material",
- "lastEdited": 1601257171040710,
- "parentID": "{3deeadb3-5bab-4d1a-a8df-d3d4b192c76a}",
- "parentJointIndex": 4,
- "name": "portal_scroll (2)",
- "locked": false,
- "userData": "{\n \"verticalOffset\": 0,\n \"segments\": 64,\n \"updateInterval\": 200\n}",
- "position": {
- "x": -0.00000476837158203125,
- "y": -0.5752763748168945,
- "z": 0.2233133316040039
- },
- "rotation": {
- "x": -0.0000457763671875,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1601249935956042,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": -23.118024826049805,
- "y": -7.00716495513916,
- "z": -14.539131164550781,
- "scale": 6.618997573852539
- },
- "canCastShadow": false,
- "primitiveMode": "lines",
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "collisionMask": 23,
- "collidesWith": "static,dynamic,kinematic,otherAvatar,",
- "script": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Scripts/materialSequencer.js",
- "scriptTimestamp": 1601250646975,
- "materialURL": "materialData",
- "priority": 3,
- "parentMaterialName": "[mat::move]",
- "materialMappingPos": {
- "x": 0.984375,
- "y": 0
- },
- "materialData": "{\"materialVersion\":1,\"materials\":[{\"name\":\"baseMaterial2\",\"model\":\"hifi_pbr\",\"opacity\":0.8,\"albedo\":[1,1,1],\"roughness\":1,\"metallic\":0,\"emissive\":[0,0,0],\"scattering\":0,\"unlit\":false,\"emissiveMap\":\"https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Images/gradient1.jpg\",\"albedoMap\":\"https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Images/gradient1.jpg\",\"opacityMapMode\":\"OPACITY_MAP_BLEND\",\"cullFaceMode\":\"CULL_NONE\",\"defaultFallthrough\":false}]}",
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{d431d791-8f9d-42ba-8031-d94b1d8d8815}",
+ "id": "{b9444e0f-1cda-4ad3-80e5-9ef3bf0ec6cd}",
"type": "Model",
- "lastEdited": 1601258385755309,
- "parentID": "{ee9b7ff6-97f0-4957-aea1-3b517b6e68b8}",
- "locked": true,
- "position": {
- "x": -21.901264190673828,
- "y": -4.0628180503845215,
- "z": 4.366877555847168
- },
- "dimensions": {
- "x": 5.791271686553955,
- "y": 3.2263991832733154,
- "z": 1.5121190547943115
- },
- "rotation": {
- "x": -0.0001068115234375,
- "y": -0.7046158313751221,
- "z": -0.0001373291015625,
- "w": 0.7095597982406616
- },
- "created": 1601076086837263,
- "lastEditedBy": "{0ff4c9e5-fb36-4bdd-9fbc-b2ed60e1aa3b}",
- "queryAACube": {
- "x": -25.301368713378906,
- "y": -8.470065116882324,
- "z": 0.9665484428405762,
- "scale": 6.799631118774414
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "shapeType": "simple-hull",
- "modelURL": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Models/controls_sign.fbx",
- "blendshapeCoefficients": "{\n}\n",
- "animation": {
- "allowTranslation": false
- },
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{60bb4eb3-6fa6-47c2-a264-23a9b562fd20}",
- "type": "Material",
- "lastEdited": 1601257171043513,
- "parentID": "{1a837deb-9f62-4d25-b027-b05bc092f7a5}",
- "name": "canopy light material (2)",
- "locked": true,
- "position": {
- "x": 0.8513965606689453,
- "y": 0.9252982139587402,
- "z": -1.2880910634994507
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1600724957561027,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": 10.290059089660645,
- "y": -7.974443435668945,
- "z": -21.87716293334961,
- "scale": 5.676094055175781
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "materialURL": "materialData",
- "priority": 1,
- "parentMaterialName": "[mat::light material]",
- "materialData": "{ \"materialVersion\": 1, \"materials\": [ { \"name\": \"untitled\", \"albedo\": [0.6352941176470588, 0.9647058823529412, 0.8980392156862745], \"metallic\": 0.001, \"roughness\": 0.5, \"opacity\": 1, \"emissive\": [1.154705882352941, 1.3323529411764705, 1.3205098039215686], \"scattering\": 0, \"unlit\": false, \"model\": \"hifi_pbr\" } ]}",
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{0735f399-0e78-4170-87c2-e1f30572ba04}",
- "type": "Text",
- "lastEdited": 1601257171043607,
- "parentID": "{ee9b7ff6-97f0-4957-aea1-3b517b6e68b8}",
- "name": "Mirror Sign",
- "locked": true,
- "position": {
- "x": 20.39116668701172,
- "y": -2.923142910003662,
- "z": -8.373934745788574
- },
- "dimensions": {
- "x": 1.7557624578475952,
- "y": 0.6635230779647827,
- "z": 0.009999999776482582
- },
- "rotation": {
- "x": -0.0000457763671875,
- "y": -0.5629816055297852,
- "z": -0.0000457763671875,
- "w": 0.8264439105987549
- },
- "created": 1601082108221117,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": 19.452810287475586,
- "y": -4.870745658874512,
- "z": -9.311684608459473,
- "scale": 1.8769828081130981
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "text": "Mirror",
- "lineHeight": 0.6470000147819519,
- "textColor": {
- "red": 0,
- "green": 0,
- "blue": 0
- },
- "backgroundAlpha": 0,
- "unlit": true,
- "textEffect": "outline fill",
- "textEffectColor": {
- "red": 94,
- "green": 207,
- "blue": 255
- },
- "textEffectThickness": 0.3400000035762787,
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{a4a586c6-b6f8-4b79-9ac9-76d6296e3ab8}",
- "type": "Zone",
- "lastEdited": 1601257171043415,
- "parentID": "{ecf5857e-f1d5-411e-a8a1-919ab8f27ad8}",
- "visible": false,
- "name": "mirror_zone",
- "locked": true,
- "userData": "{\"grabbableKey\":{\"grabbable\":false},\"original\":{\"id\":\"{da1e2fcd-d69b-47d7-b861-25b31f1c7175}\"}}",
- "position": {
- "x": -0.01726818084716797,
- "y": 0.2113490104675293,
- "z": 1.704751968383789
- },
- "dimensions": {
- "x": 2.8482747077941895,
- "y": 3.153184413909912,
- "z": 3.6725244522094727
- },
- "rotation": {
- "x": -0.0161592960357666,
- "y": 0.0000152587890625,
- "z": -0.006424069404602051,
- "w": 0.999847412109375
- },
- "created": 1601081037655929,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": 15.947319030761719,
- "y": -7.93642520904541,
- "z": -10.575695991516113,
- "scale": 5.6162872314453125
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "script": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Scripts/mirrorReflection.js",
- "scriptTimestamp": 1601084668318,
- "shapeType": "box",
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{f2ac10e4-89f3-4125-bb8f-917e510394df}",
- "type": "Box",
- "lastEdited": 1601257171038745,
- "name": "Sound Emitter",
- "locked": true,
- "userData": "{\"soundURL\":\"https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Sounds/468407__onderwish__sci-fi-survival-dreamscape.mp3?dl=1\",\"shouldLoop\":true,\"volume\":0.18,\"refreshInterval\":100,\"grabbableKey\":{\"grabbable\":false}}",
- "position": {
- "x": 18.58538055419922,
- "y": 5.378335952758789,
- "z": 20.337299346923828
- },
- "dimensions": {
- "x": 0.20000000298023224,
- "y": 0.20000000298023224,
- "z": 0.20000000298023224
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1601078881703340,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": 18.41217613220215,
- "y": 5.2051310539245605,
- "z": 20.164094924926758,
- "scale": 0.3464101552963257
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "script": "https://cdn-1.vircadia.com/us-e-1/usefulUtilities/soundEmitter/soundEmitter.js",
- "scriptTimestamp": 1601079357399,
- "color": {
- "red": 0,
- "green": 180,
- "blue": 239
- },
- "shape": "Cube",
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{698d7e54-ee5b-4005-bc9d-62840aa07c19}",
- "type": "Model",
- "lastEdited": 1601257171043706,
- "locked": true,
- "position": {
- "x": 20.58482551574707,
- "y": 3.3026206493377686,
- "z": 22.10502052307129
- },
- "dimensions": {
- "x": 0.9342527389526367,
- "y": 0.8603132963180542,
- "z": 0.47802668809890747
- },
- "rotation": {
- "x": -0.0175631046295166,
- "y": -0.4897993206977844,
- "z": 0.030106067657470703,
- "w": 0.8711223602294922
- },
- "created": 1594159515504117,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": 19.906320571899414,
- "y": 2.624115467071533,
- "z": 21.426515579223633,
- "scale": 1.3570102453231812
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "shapeType": "simple-compound",
- "modelURL": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Models/seagull-ANI.fbx",
- "blendshapeCoefficients": "{\n}\n",
- "animation": {
- "url": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Models/seagull-ANI.fbx",
- "allowTranslation": false,
- "currentFrame": 68.07844543457031,
- "running": true,
- "lastFrame": 120
- },
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{523b7462-9a49-4949-8d31-d84749cbab0a}",
- "type": "Model",
- "lastEdited": 1601257171038388,
- "name": "Vircadia Sign",
- "locked": true,
- "position": {
- "x": 40.31134796142578,
- "y": 3.2890982627868652,
- "z": 19.960262298583984
- },
- "dimensions": {
- "x": 4.443090915679932,
- "y": 0.7363157868385315,
- "z": 0.16073395311832428
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.7011978626251221,
- "z": 0.0000152587890625,
- "w": 0.7129777669906616
- },
- "created": 1600983484676932,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": 38.05807113647461,
- "y": 1.0358200073242188,
- "z": 17.70698356628418,
- "scale": 4.506556510925293
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "modelURL": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Models/VircadiaLogo.fbx",
- "blendshapeCoefficients": "{\n}\n",
- "animation": {
- "allowTranslation": false
- },
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{1a837deb-9f62-4d25-b027-b05bc092f7a5}",
- "type": "Model",
- "lastEdited": 1601257171043086,
- "name": "(2)",
- "locked": true,
- "description": "cyberpunk light building",
- "position": {
- "x": 32.089881896972656,
- "y": 0.20440244674682617,
- "z": 0
- },
- "dimensions": {
- "x": 2.9088404178619385,
- "y": 2.9556829929351807,
- "z": 3.8756446838378906
- },
- "rotation": {
- "x": -0.0000762939453125,
- "y": -0.269459068775177,
- "z": -0.0000152587890625,
- "w": 0.9629815816879272
- },
- "created": 1600724957559377,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": 29.251834869384766,
- "y": -2.6336443424224854,
- "z": -2.8380467891693115,
- "scale": 5.676093578338623
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "shapeType": "static-mesh",
- "modelURL": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Models/cyberpunk%20light%20building.fbx",
- "blendshapeCoefficients": "{\n}\n",
- "animation": {
- "allowTranslation": false
- },
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{ecf5857e-f1d5-411e-a8a1-919ab8f27ad8}",
- "type": "Model",
- "lastEdited": 1601257171043259,
+ "lastEdited": 1617134731448079,
"name": "mirror_reflectingPlane",
"locked": true,
"userData": "{\"grabbableKey\":{\"grabbable\":false,\"ignoreIK\":false},\"original\":{\"id\":\"{6291b4e5-0dcb-484c-9c11-fe47725a4ad8}\"}}",
"position": {
- "x": 38.92219543457031,
- "y": 0,
- "z": 11.933252334594727
+ "x": 3.3984665870666504,
+ "y": 1.891787052154541,
+ "z": 20.900876998901367
},
"dimensions": {
- "x": 1.846174716949463,
- "y": 2.2880923748016357,
+ "x": 1.6291353702545166,
+ "y": 2.206333875656128,
"z": 0.01092288363724947
},
"rotation": {
- "x": -0.0001678466796875,
- "y": 0.5556267499923706,
- "z": 0.0009613037109375,
- "w": -0.8314183354377747
+ "x": -0.0000152587890625,
+ "y": -0.8816205263137817,
+ "z": 0.0000152587890625,
+ "w": -0.4719768166542053
},
- "created": 1601081037655824,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
+ "created": 1614198986204053,
+ "lastEditedBy": "{0b759026-5fea-494c-99de-ab6301e73d4c}",
"queryAACube": {
- "x": 37.45217514038086,
- "y": -1.4700210094451904,
- "z": 10.463231086730957,
- "scale": 2.940042018890381
+ "x": 2.0271434783935547,
+ "y": 0.5204638242721558,
+ "z": 19.52955436706543,
+ "scale": 2.7426464557647705
},
"grab": {
"grabbable": false,
@@ -787,9 +108,9 @@
"ignoreForCollisions": true,
"collisionMask": 0,
"collidesWith": "",
- "script": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Scripts/mirrorClient.js",
+ "script": "qrc:///serverless/Scripts/mirrorClient.js",
"scriptTimestamp": 1601084665601,
- "modelURL": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Models/mirror_without_backface.baked.fbx",
+ "modelURL": "qrc:///serverless/Models/mirror_without_backface.baked.fbx",
"blendshapeCoefficients": "{\n}\n",
"clientOnly": false,
"avatarEntity": false,
@@ -798,10 +119,1285 @@
"isFacingAvatar": false
},
{
- "id": "{32132863-ae54-4d1b-95a9-d8e5fd7df066}",
+ "id": "{61e0e141-bb95-4e7a-a043-3f4f783e39f4}",
+ "type": "Text",
+ "lastEdited": 1617134727215565,
+ "locked": true,
+ "description": "mirror text",
+ "position": {
+ "x": 3.306519031524658,
+ "y": 4.0622100830078125,
+ "z": 20.931333541870117
+ },
+ "dimensions": {
+ "x": 3.2473599910736084,
+ "y": 0.6462407112121582,
+ "z": 0.009999999776482582
+ },
+ "rotation": {
+ "x": 0.0008392333984375,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 0.999969482421875
+ },
+ "created": 1614383649622836,
+ "lastEditedBy": "{0b759026-5fea-494c-99de-ab6301e73d4c}",
+ "queryAACube": {
+ "x": 1.6509922742843628,
+ "y": 2.4066834449768066,
+ "z": 19.275806427001953,
+ "scale": 3.311053514480591
+ },
+ "billboardMode": "yaw",
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "collisionMask": 23,
+ "collidesWith": "static,dynamic,kinematic,otherAvatar,",
+ "text": "Mirror",
+ "lineHeight": 0.6000000238418579,
+ "textColor": {
+ "red": 0,
+ "green": 0,
+ "blue": 0
+ },
+ "backgroundAlpha": 0,
+ "unlit": true,
+ "font": "Inconsolata",
+ "textEffect": "outline fill",
+ "textEffectColor": {
+ "red": 0,
+ "green": 208,
+ "blue": 255
+ },
+ "textEffectThickness": 0.30000001192092896,
+ "alignment": "center",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": true,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{4b1ac4d3-325b-46a2-9c27-0e94ee1afcaf}",
+ "type": "Model",
+ "lastEdited": 1617140845328587,
+ "name": "Seagull",
+ "locked": true,
+ "position": {
+ "x": 23.798669815063477,
+ "y": 4.926492214202881,
+ "z": 10.381175994873047
+ },
+ "dimensions": {
+ "x": 0.9342527389526367,
+ "y": 0.8603132963180542,
+ "z": 0.47802668809890747
+ },
+ "rotation": {
+ "x": -0.017654716968536377,
+ "y": -0.4898908734321594,
+ "z": 0.030106067657470703,
+ "w": 0.8710917234420776
+ },
+ "created": 1614198986205195,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 23.12016487121582,
+ "y": 4.247987270355225,
+ "z": 9.70267105102539,
+ "scale": 1.3570102453231812
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "shapeType": "simple-compound",
+ "modelURL": "qrc:///serverless/Models/seagull-ANI.fbx",
+ "blendshapeCoefficients": "{\n}\n",
+ "animation": {
+ "url": "qrc:///serverless/Models/seagull-ANI.fbx",
+ "allowTranslation": false,
+ "currentFrame": 99.81153869628906,
+ "running": true,
+ "lastFrame": 120
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{7c7f80be-4fa3-4615-86f3-5446c6737350}",
+ "type": "Box",
+ "lastEdited": 1617140739515673,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "visible": false,
+ "name": "Sound Emitter",
+ "locked": true,
+ "userData": "{\"soundURL\":\"qrc:///serverless/Sounds/468407__onderwish__sci-fi-survival-dreamscape.mp3\",\"shouldLoop\":true,\"volume\":0.18,\"refreshInterval\":100,\"grabbableKey\":{\"grabbable\":false}}",
+ "position": {
+ "x": 0,
+ "y": 1.0455207824707031,
+ "z": 0
+ },
+ "dimensions": {
+ "x": 0.20000000298023224,
+ "y": 0.20000000298023224,
+ "z": 0.20000000298023224
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198017837347,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 28.069303512573242,
+ "y": 5.205089092254639,
+ "z": 26.711923599243164,
+ "scale": 0.3464101552963257
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "script": "qrc:///serverless/Scripts/soundEmitter.js",
+ "scriptTimestamp": 1601079357399,
+ "color": {
+ "red": 0,
+ "green": 180,
+ "blue": 239
+ },
+ "shape": "Cube",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{0436152a-b188-4608-abe9-a3fb1c4b283d}",
+ "type": "Model",
+ "lastEdited": 1617140818158676,
+ "name": "Vircadia Sign",
+ "locked": true,
+ "position": {
+ "x": 43.52519226074219,
+ "y": 4.912969589233398,
+ "z": 8.236417770385742
+ },
+ "dimensions": {
+ "x": 4.443090915679932,
+ "y": 0.7363157868385315,
+ "z": 0.16073395311832428
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.7019302845001221,
+ "z": 0.0000152587890625,
+ "w": 0.7122453451156616
+ },
+ "created": 1614198986205729,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 41.271915435791016,
+ "y": 2.659691333770752,
+ "z": 5.983139514923096,
+ "scale": 4.506556510925293
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "modelURL": "qrc:///serverless/Models/VircadiaLogo.fbx",
+ "blendshapeCoefficients": "{\n}\n",
+ "animation": {
+ "allowTranslation": false
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{06b826d4-5385-4c49-92c2-47e24f97b35a}",
+ "type": "Text",
+ "lastEdited": 1617134764395172,
+ "name": "(2)",
+ "locked": true,
+ "description": "mirror text",
+ "position": {
+ "x": 34.17714309692383,
+ "y": 4.050739288330078,
+ "z": 27.204530715942383
+ },
+ "dimensions": {
+ "x": 3.2473599910736084,
+ "y": 0.6462407112121582,
+ "z": 0.009999999776482582
+ },
+ "rotation": {
+ "x": 0.0008392333984375,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 0.999969482421875
+ },
+ "created": 1614453280539951,
+ "lastEditedBy": "{0b759026-5fea-494c-99de-ab6301e73d4c}",
+ "queryAACube": {
+ "x": 32.5216178894043,
+ "y": 2.3952126502990723,
+ "z": 25.54900360107422,
+ "scale": 3.311053514480591
+ },
+ "billboardMode": "yaw",
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "collisionMask": 23,
+ "collidesWith": "static,dynamic,kinematic,otherAvatar,",
+ "text": "Controls",
+ "lineHeight": 0.6000000238418579,
+ "textColor": {
+ "red": 0,
+ "green": 0,
+ "blue": 0
+ },
+ "backgroundAlpha": 0,
+ "unlit": true,
+ "font": "Inconsolata",
+ "textEffect": "outline fill",
+ "textEffectColor": {
+ "red": 0,
+ "green": 208,
+ "blue": 255
+ },
+ "textEffectThickness": 0.30000001192092896,
+ "alignment": "center",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": true,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{159f2743-d862-47e3-9f27-5de062b09941}",
+ "type": "Material",
+ "lastEdited": 1617140810844450,
+ "parentID": "{0436152a-b188-4608-abe9-a3fb1c4b283d}",
+ "parentJointIndex": 0,
+ "name": "VClogo",
+ "locked": true,
+ "userData": "{\"verticalOffset\":0,\"segments\":16,\"updateInterval\":1000}",
+ "position": {
+ "x": -0.00001823902130126953,
+ "y": -0.0002636909484863281,
+ "z": 0.10145187377929688
+ },
+ "rotation": {
+ "x": 0.0012969970703125,
+ "y": 0.0000152587890625,
+ "z": 0.0000457763671875,
+ "w": 0.999969482421875
+ },
+ "created": 1614198986205783,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 47.7151985168457,
+ "y": 1.0358200073242188,
+ "z": 24.254812240600586,
+ "scale": 4.506557464599609
+ },
+ "canCastShadow": false,
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "collisionMask": 23,
+ "collidesWith": "static,dynamic,kinematic,otherAvatar,",
+ "scriptTimestamp": 1597610738986,
+ "materialURL": "materialData",
+ "priority": 3,
+ "parentMaterialName": "[mat::NeonTubes]",
+ "materialMappingPos": {
+ "x": 0.8125,
+ "y": 0
+ },
+ "materialData": "{\"materialVersion\":1,\"materials\":[{\"name\":\"baseMaterial2\",\"model\":\"hifi_pbr\",\"opacity\":1,\"albedo\":[0,0,0],\"roughness\":1,\"metallic\":0,\"emissive\":[2.3,2,2],\"scattering\":0,\"unlit\":false,\"opacityMapMode\":\"OPACITY_MAP_MASK\",\"cullFaceMode\":\"CULL_BACK\",\"defaultFallthrough\":false}]}",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+{
+ "id": "{5b6443c5-ec22-4c8a-9581-85134ceb6856}",
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "type": "Model",
+ "name": "Bowl",
+ "locked": true,
+ "lastEdited": 1617218059378792,
+ "dimensions": {
+ "x": 1.7757656574249268,
+ "y": 1.2933320999145508,
+ "z": 1.7757654190063477
+ },
+ "rotation": {
+ "x": -0.000030517578125,
+ "y": -0.000030517578125,
+ "z": -0.000030517578125,
+ "w": 1
+ },
+ "created": 1617216882976266,
+ "lastEditedBy": "{f72b151a-b325-4c9f-805a-7a7a520f82f7}",
+ "position": {
+ "x": -0.00001823902130126953,
+ "y": -5.1002636909484863281,
+ "z": 0.10145187377929688
+ },
+ "queryAACube": {
+ "x": -1.4123910665512085,
+ "y": -1.4123910665512085,
+ "z": -1.4123910665512085,
+ "scale": 2.824782133102417
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "shapeType": "static-mesh",
+ "modelURL": "qrc:///serverless/Models/bowl2.fbx",
+ "blendshapeCoefficients": "{\n}\n",
+ "animation": {
+ "allowTranslation": false
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{9c451827-4c87-4bf7-8372-aeb6bbd61eaa}",
+ "type": "ParticleEffect",
+ "lastEdited": 1617217817025177,
+ "parentID": "{5b6443c5-ec22-4c8a-9581-85134ceb6856}",
+ "name": "Brew",
+ "locked": true,
+ "position": {
+ "x": 0,
+ "y": 0.44699999690055847,
+ "z": 0
+ },
+ "dimensions": {
+ "x": 16.263307571411133,
+ "y": 16.263307571411133,
+ "z": 16.263307571411133
+ },
+ "rotation": {
+ "x": 8.988587651970192e-12,
+ "y": -0.00008631677337689325,
+ "z": -0.7071500420570374,
+ "w": 0.7070636749267578
+ },
+ "created": 1617216898348298,
+ "lastEditedBy": "{f72b151a-b325-4c9f-805a-7a7a520f82f7}",
+ "queryAACube": {
+ "x": 7.714627265930176,
+ "y": -12.719738006591797,
+ "z": -5.470824241638184,
+ "scale": 28.168874740600586
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "shapeType": "ellipsoid",
+ "color": {
+ "red": 4,
+ "green": 101,
+ "blue": 143
+ },
+ "alpha": 0.30000001192092896,
+ "textures": "qrc:///serverless/Textures/default_particle.png",
+ "maxParticles": 80,
+ "lifespan": 2,
+ "emitRate": 47,
+ "emitSpeed": 0.30000001192092896,
+ "speedSpread": 0,
+ "emitOrientation": {
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "emitDimensions": {
+ "x": 1,
+ "y": 1,
+ "z": 0
+ },
+ "emitRadiusStart": 0,
+ "polarStart": 0.8700000047683716,
+ "polarFinish": 1.2200000286102295,
+ "azimuthStart": 3.0999999046325684,
+ "azimuthFinish": 3.140000104904175,
+ "emitAcceleration": {
+ "x": 0,
+ "y": -0.9900000095367432,
+ "z": 0
+ },
+ "accelerationSpread": {
+ "x": 0.10000000149011612,
+ "y": 0.3400000035762787,
+ "z": 0.10000000149011612
+ },
+ "particleRadius": 1.5,
+ "radiusStart": 0.5,
+ "radiusFinish": 0.30000001192092896,
+ "colorSpread": {
+ "red": 0,
+ "green": 150,
+ "blue": 150
+ },
+ "colorStart": {
+ "red": 0,
+ "green": 0,
+ "blue": 0
+ },
+ "colorFinish": {
+ "red": 0,
+ "green": 0,
+ "blue": 0
+ },
+ "alphaStart": 0.5,
+ "alphaFinish": 0,
+ "emitterShouldTrail": true,
+ "spinStart": null,
+ "spinFinish": null,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{77cbbb3f-e1fe-436c-8b0a-11b45b96181b}",
+ "type": "ParticleEffect",
+ "lastEdited": 1617216897203063,
+ "parentID": "{5b6443c5-ec22-4c8a-9581-85134ceb6856}",
+ "name": "steam",
+ "locked": true,
+ "position": {
+ "x": 0.03824615478515625,
+ "y": 5.34733772277832,
+ "z": 0.057065125554800034
+ },
+ "dimensions": {
+ "x": 14.4042329788208,
+ "y": 14.4042329788208,
+ "z": 14.4042329788208
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1617216882977327,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 9.363174438476562,
+ "y": -6.209394454956055,
+ "z": -3.8040504455566406,
+ "scale": 24.948863983154297
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "shapeType": "ellipsoid",
+ "alpha": 0.014999999664723873,
+ "textures": "qrc:///serverless/Textures/default_particle.png",
+ "maxParticles": 100,
+ "lifespan": 3.069999933242798,
+ "emitSpeed": 0.4000000059604645,
+ "speedSpread": 0.10000000149011612,
+ "emitOrientation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "polarFinish": 3.1415927410125732,
+ "emitAcceleration": {
+ "x": 0,
+ "y": -1,
+ "z": 0
+ },
+ "particleRadius": 1.5,
+ "radiusStart": 0.5,
+ "radiusFinish": 0.4000000059604645,
+ "colorStart": {
+ "red": 0,
+ "green": 0,
+ "blue": 0
+ },
+ "colorFinish": {
+ "red": 0,
+ "green": 0,
+ "blue": 0
+ },
+ "alphaStart": 0.5,
+ "alphaFinish": 0,
+ "emitterShouldTrail": true,
+ "spinStart": null,
+ "spinFinish": null,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{463bad19-9d44-479e-af6c-9d86ee76fc45}",
"type": "Light",
- "lastEdited": 1601257171038209,
- "parentID": "{70e655f0-9e82-4be9-a31f-bf8d00798b70}",
+ "lastEdited": 1617217841543322,
+ "parentID": "{5b6443c5-ec22-4c8a-9581-85134ceb6856}",
+ "name": "blacklight",
+ "locked": true,
+ "position": {
+ "x": 0,
+ "y": 1.6233999729156494,
+ "z": 0
+ },
+ "dimensions": {
+ "x": 3.867255687713623,
+ "y": 3.867255687713623,
+ "z": 4.0243144035339355
+ },
+ "rotation": {
+ "x": -0.7071176171302795,
+ "y": 3.849143226375418e-12,
+ "z": -0.000021579189706244506,
+ "w": 0.7070960402488708
+ },
+ "created": 1617217525079443,
+ "lastEditedBy": "{f72b151a-b325-4c9f-805a-7a7a520f82f7}",
+ "queryAACube": {
+ "x": 18.404050827026367,
+ "y": -0.8539872169494629,
+ "z": 5.2184553146362305,
+ "scale": 6.790172100067139
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "isSpotlight": true,
+ "intensity": -25.700000762939453,
+ "exponent": 19.6299991607666,
+ "cutoff": 73.94000244140625,
+ "falloffRadius": 72.4000015258789,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{a80ee618-752e-44e4-a9de-04f089b4fe03}",
+ "type": "Model",
+ "lastEdited": 1617140830643374,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "Dome Glass",
+ "locked": true,
+ "position": {
+ "x": -0.000016799232980702072,
+ "y": 3.1790809631347656,
+ "z": 0.000016798756405478343
+ },
+ "dimensions": {
+ "x": 44.38727569580078,
+ "y": 7.3717122077941895,
+ "z": 44.38727569580078
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986204337,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": -3.359670639038086,
+ "y": -24.09037208557129,
+ "z": -4.717145919799805,
+ "scale": 63.20445251464844
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "shapeType": "static-mesh",
+ "modelURL": "qrc:///serverless/Models/dome2_glass.glb",
+ "blendshapeCoefficients": "{\n}\n",
+ "animation": {
+ "allowTranslation": false
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{d2ef46ed-c85f-4ab5-bef3-14feb46e9091}",
+ "type": "Model",
+ "lastEdited": 1617134717193282,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "trees",
+ "locked": true,
+ "position": {
+ "x": -0.000016800577213871293,
+ "y": -0.5505132675170898,
+ "z": 0.000016800084267742932
+ },
+ "dimensions": {
+ "x": 26.59911346435547,
+ "y": 9.549417495727539,
+ "z": 26.465896606445312
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986202454,
+ "lastEditedBy": "{0b759026-5fea-494c-99de-ab6301e73d4c}",
+ "queryAACube": {
+ "x": 8.883026123046875,
+ "y": -15.577155113220215,
+ "z": 7.525779724121094,
+ "scale": 38.71883010864258
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "modelURL": "qrc:///serverless/Models/Trees1.glb",
+ "blendshapeCoefficients": "{\n}\n",
+ "animation": {
+ "allowTranslation": false
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{f3d87e87-a250-42f8-a285-84cbeb777353}",
+ "type": "Model",
+ "lastEdited": 1617140880548597,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "Panels",
+ "locked": true,
+ "position": {
+ "x": -0.0001735687255859375,
+ "y": -5.685686111450195,
+ "z": 0.00017449550796300173
+ },
+ "dimensions": {
+ "x": 36.70009231567383,
+ "y": 3.3704721927642822,
+ "z": 25.731521606445312
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614377167635894,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": -5.742575168609619,
+ "y": -23.827165603637695,
+ "z": 4.4112548828125,
+ "scale": 59.816864013671875
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "modelURL": "qrc:///serverless/Models/Stands.fbx",
+ "blendshapeCoefficients": "{\n}\n",
+ "useOriginalPivot": true,
+ "animation": {
+ "url": "qrc:///serverless/Models/Stands.fbx",
+ "allowTranslation": false,
+ "currentFrame": 68342.515625,
+ "running": true
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{25638e51-c19c-420a-a9cc-ff02626b62ef}",
+ "type": "Box",
+ "lastEdited": 1617134697724395,
+ "visible": false,
+ "name": "portalCube",
+ "locked": true,
+ "userData": "{\"destination\":\"hifi://172.104.248.237:40102/154.572,-96.8437,-417.945/0,1,0,-1.52586e-05\"}",
+ "position": {
+ "x": 0.06047534942626953,
+ "y": 1.751168131828308,
+ "z": 4.2923126220703125
+ },
+ "dimensions": {
+ "x": 1.6716244220733643,
+ "y": 2.5448203086853027,
+ "z": 0.26420968770980835
+ },
+ "rotation": {
+ "x": 0.0000152587890625,
+ "y": 0.6351872682571411,
+ "z": -0.0000457763671875,
+ "w": 0.772335410118103
+ },
+ "created": 1614454164933827,
+ "lastEditedBy": "{0b759026-5fea-494c-99de-ab6301e73d4c}",
+ "queryAACube": {
+ "x": -1.4676154851913452,
+ "y": 0.22307729721069336,
+ "z": 2.764221668243408,
+ "scale": 3.0561816692352295
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "collisionMask": 23,
+ "collidesWith": "static,dynamic,kinematic,otherAvatar,",
+ "damping": 0,
+ "angularDamping": 0,
+ "script": "qrc:///serverless/Scripts/portal.js",
+ "scriptTimestamp": 1617134674001,
+ "color": {
+ "red": 0,
+ "green": 180,
+ "blue": 239
+ },
+ "shape": "Cube",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{e0261cde-c5e0-44bf-a747-787c4c867d79}",
+ "type": "Light",
+ "lastEdited": 1617140788480898,
+ "name": "mainDomeLight",
+ "locked": true,
+ "position": {
+ "x": 21.799074172973633,
+ "y": 10.247319221496582,
+ "z": 8.613605499267578
+ },
+ "dimensions": {
+ "x": 61.943946838378906,
+ "y": 61.943946838378906,
+ "z": 61.943946838378906
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986202528,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": -31.845956802368164,
+ "y": -43.39771270751953,
+ "z": -45.03142547607422,
+ "scale": 107.2900619506836
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "collisionMask": 23,
+ "collidesWith": "static,dynamic,kinematic,otherAvatar,",
+ "color": {
+ "red": 255,
+ "green": 235,
+ "blue": 87
+ },
+ "intensity": 0.8999999761581421,
+ "exponent": 1,
+ "cutoff": 75,
+ "falloffRadius": 30,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "type": "Model",
+ "lastEdited": 1617134709051164,
+ "name": "Dome",
+ "locked": true,
+ "position": {
+ "x": 21.799192428588867,
+ "y": 5.9566450119018555,
+ "z": 8.613487243652344
+ },
+ "dimensions": {
+ "x": 54.60203552246094,
+ "y": 13.734564781188965,
+ "z": 54.60203552246094
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986203467,
+ "lastEditedBy": "{0b759026-5fea-494c-99de-ab6301e73d4c}",
+ "queryAACube": {
+ "x": -25952.515625,
+ "y": -25921.0625,
+ "z": -25953.87890625,
+ "scale": 51961.5234375
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "shapeType": "static-mesh",
+ "modelURL": "qrc:///serverless/Models/dome2.glb",
+ "blendshapeCoefficients": "{\n}\n",
+ "animation": {
+ "allowTranslation": false
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{52c84c1c-6567-4670-9b2b-9aa9bc1456ea}",
+ "type": "Model",
+ "lastEdited": 1617134574674644,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "locked": true,
+ "position": {
+ "x": 4.238387418808998e-12,
+ "y": -2.3088181018829346,
+ "z": -7.275957614183426e-12
+ },
+ "dimensions": {
+ "x": 5.688337802886963,
+ "y": 7.10263204574585,
+ "z": 5.688361644744873
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986204522,
+ "lastEditedBy": "{78b82b17-4e7a-410f-95ce-1c3ace1cd609}",
+ "queryAACube": {
+ "x": -4.850972652435303,
+ "y": -3.341723680496216,
+ "z": -4.9151411056518555,
+ "scale": 38.45905685424805
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "scriptTimestamp": 1598912452582,
+ "shapeType": "static-mesh",
+ "modelURL": "qrc:///serverless/Models/temple5.glb",
+ "blendshapeCoefficients": "{\n}\n",
+ "animation": {
+ "allowTranslation": false
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{d344138a-adb8-4ae7-9aae-447266a48869}",
+ "type": "Light",
+ "lastEdited": 1617140788480765,
+ "parentID": "{b9444e0f-1cda-4ad3-80e5-9ef3bf0ec6cd}",
+ "name": "mirrorLight",
+ "locked": true,
+ "position": {
+ "x": -0.0015339851379394531,
+ "y": -0.000001519918441772461,
+ "z": 0.26983165740966797
+ },
+ "dimensions": {
+ "x": 3.8637032508850098,
+ "y": 3.8637032508850098,
+ "z": 4
+ },
+ "rotation": {
+ "x": 0.0000152587890625,
+ "y": 1,
+ "z": 0.0000152587890625,
+ "w": -0.0000152587890625
+ },
+ "created": 1614453808970411,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 6.681288719177246,
+ "y": -3.11796498298645,
+ "z": 35.638336181640625,
+ "scale": 6.771735668182373
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "color": {
+ "red": 255,
+ "green": 255,
+ "blue": 235
+ },
+ "isSpotlight": true,
+ "intensity": 0.699999988079071,
+ "exponent": 1,
+ "cutoff": 75,
+ "falloffRadius": 10,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{0d85144d-a15c-4d1b-84a5-b3a379d31798}",
+ "type": "Light",
+ "lastEdited": 1617140731977291,
+ "parentID": "{b9444e0f-1cda-4ad3-80e5-9ef3bf0ec6cd}",
+ "name": "Mirror Light",
+ "locked": true,
+ "position": {
+ "x": 0.08925724029541016,
+ "y": 0.4832591116428375,
+ "z": 0.20032405853271484
+ },
+ "dimensions": {
+ "x": 6.747879505157471,
+ "y": 6.747879505157471,
+ "z": 6.985918998718262
+ },
+ "rotation": {
+ "x": -0.999969482421875,
+ "y": -0.0001373291015625,
+ "z": -0.0000762939453125,
+ "w": 0.00856029987335205
+ },
+ "created": 1614198986203073,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 4.045637607574463,
+ "y": -5.162182331085205,
+ "z": 33.07383346557617,
+ "scale": 11.826699256896973
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "isSpotlight": true,
+ "intensity": 2,
+ "exponent": 1,
+ "cutoff": 75,
+ "falloffRadius": 5.699999809265137,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{89f2cd0b-782f-4e4e-a674-587ae5893f7d}",
+ "type": "Light",
+ "lastEdited": 1617140712801743,
+ "parentID": "{52c84c1c-6567-4670-9b2b-9aa9bc1456ea}",
+ "name": "templeLight",
"locked": true,
"position": {
"x": -0.10364770889282227,
@@ -819,12 +1415,12 @@
"z": -0.0000152587890625,
"w": 1
},
- "created": 1598733516961728,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
+ "created": 1614198986204117,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
"queryAACube": {
- "x": -4.850877285003662,
- "y": -7.476483345031738,
- "z": -4.915230751037598,
+ "x": 23.39162826538086,
+ "y": -2.135477066040039,
+ "z": 21.969898223876953,
"scale": 9.494348526000977
},
"grab": {
@@ -860,770 +1456,10 @@
"isFacingAvatar": false
},
{
- "id": "{74fcc311-ac54-4c92-b658-67b616d89124}",
- "type": "Model",
- "lastEdited": 1601257562566663,
- "parentID": "{ee9b7ff6-97f0-4957-aea1-3b517b6e68b8}",
- "locked": true,
- "position": {
- "x": 2.8377300509419e-13,
- "y": -5.038946151733398,
- "z": 0
- },
- "dimensions": {
- "x": 1.7757656574249268,
- "y": 1.2933320999145508,
- "z": 1.7757654190063477
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1600122372976180,
- "lastEditedBy": "{68e3a576-152f-48c2-adf3-6dde43ee51ba}",
- "queryAACube": {
- "x": -15.658815383911133,
- "y": -20.814706802368164,
- "z": -15.639467239379883,
- "scale": 31.393596649169922
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "shapeType": "static-mesh",
- "modelURL": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Models/bowl2.fbx",
- "blendshapeCoefficients": "{\n}\n",
- "animation": {
- "allowTranslation": false
- },
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{1cfc9c02-50cc-4c22-bf79-9aeb57522b04}",
- "type": "Light",
- "lastEdited": 1601257171037813,
- "parentID": "{ee9b7ff6-97f0-4957-aea1-3b517b6e68b8}",
- "name": "TreeLight_1",
- "locked": true,
- "position": {
- "x": 9.000457763671875,
- "y": -0.2475719451904297,
- "z": 8.999537467956543
- },
- "dimensions": {
- "x": 10.24996280670166,
- "y": 10.24996280670166,
- "z": 10.24996280670166
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1600983484676879,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": 0.12341690063476562,
- "y": -10.132533073425293,
- "z": 0.1231222152709961,
- "scale": 17.753456115722656
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "color": {
- "red": 69,
- "green": 106,
- "blue": 255
- },
- "intensity": 17.799999237060547,
- "exponent": 1,
- "cutoff": 75,
- "falloffRadius": 26.100000381469727,
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{8233c8d0-ae61-4b7c-8ac4-8200e897dc86}",
- "type": "Light",
- "lastEdited": 1601257171037784,
- "parentID": "{ee9b7ff6-97f0-4957-aea1-3b517b6e68b8}",
- "name": "TreeLight_2",
- "locked": true,
- "position": {
- "x": -8.819664001464844,
- "y": -0.24757671356201172,
- "z": 8.97313404083252
- },
- "dimensions": {
- "x": 10.24996280670166,
- "y": 10.24996280670166,
- "z": 10.24996280670166
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1600983484676428,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": -17.696704864501953,
- "y": -10.13199520111084,
- "z": 0.0961751937866211,
- "scale": 17.753456115722656
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "color": {
- "red": 191,
- "green": 31,
- "blue": 255
- },
- "intensity": 15,
- "exponent": 1,
- "cutoff": 75,
- "falloffRadius": 26.100000381469727,
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{a09d75c8-91d7-470f-a7ff-d49f59d8fd66}",
- "type": "Light",
- "lastEdited": 1601257171037821,
- "locked": true,
- "position": {
- "x": 20.86223793029785,
- "y": 3.7069454193115234,
- "z": 22.919116973876953
- },
- "dimensions": {
- "x": 7.6550493240356445,
- "y": 7.6550493240356445,
- "z": 7.6550493240356445
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1601156079314076,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": 14.232770919799805,
- "y": -2.9225220680236816,
- "z": 16.289649963378906,
- "scale": 13.25893497467041
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "intensity": 5,
- "exponent": 1,
- "cutoff": 75,
- "falloffRadius": 1,
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{70e655f0-9e82-4be9-a31f-bf8d00798b70}",
- "type": "Model",
- "lastEdited": 1601257491990357,
- "parentID": "{ee9b7ff6-97f0-4957-aea1-3b517b6e68b8}",
- "locked": true,
- "position": {
- "x": 4.238387418808998e-12,
- "y": -2.3088181018829346,
- "z": -7.275957614183426e-12
- },
- "dimensions": {
- "x": 5.688337802886963,
- "y": 7.10263204574585,
- "z": 5.688361644744873
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1598733420183555,
- "lastEditedBy": "{68e3a576-152f-48c2-adf3-6dde43ee51ba}",
- "queryAACube": {
- "x": -5.365779876708984,
- "y": -8.682729721069336,
- "z": -5.365577697753906,
- "scale": 10.73135757446289
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "scriptTimestamp": 1598912452582,
- "shapeType": "static-mesh",
- "modelURL": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Models/SmallTemple5.glb",
- "blendshapeCoefficients": "{\n}\n",
- "animation": {
- "allowTranslation": false
- },
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{a700075e-206d-447c-a0f2-cdd2d377c621}",
- "type": "ParticleEffect",
- "lastEdited": 1601257171034843,
- "parentID": "{74fcc311-ac54-4c92-b658-67b616d89124}",
- "locked": true,
- "position": {
- "x": 0.03811454772949219,
- "y": 0.9292696714401245,
- "z": 0.05720067024230957
- },
- "dimensions": {
- "x": 18.12510108947754,
- "y": 18.12510108947754,
- "z": 18.12510108947754
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1600122719130701,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": -15.658815383911133,
- "y": -20.814706802368164,
- "z": -15.639467239379883,
- "scale": 31.393596649169922
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "shapeType": "ellipsoid",
- "alpha": 0,
- "textures": "http://eu-central-1.linodeobjects.com/vircadia-assets/interface/default/default_particle.png",
- "maxParticles": 100,
- "lifespan": 2.5,
- "emitRate": 20,
- "emitSpeed": 0.5,
- "speedSpread": 0.10000000149011612,
- "emitOrientation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "polarFinish": 3.1415927410125732,
- "emitAcceleration": {
- "x": 0,
- "y": -2,
- "z": 0
- },
- "particleRadius": 1.5,
- "radiusStart": 0.5,
- "radiusFinish": 0.4000000059604645,
- "colorStart": {
- "red": 0,
- "green": 0,
- "blue": 0
- },
- "colorFinish": {
- "red": 0,
- "green": 0,
- "blue": 0
- },
- "alphaStart": 0.5,
- "alphaFinish": 0,
- "emitterShouldTrail": true,
- "spinStart": null,
- "spinFinish": null,
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{1257cabd-b553-482e-92d8-be6da0a65769}",
- "type": "Shape",
- "lastEdited": 1601258198368340,
- "parentID": "{ee9b7ff6-97f0-4957-aea1-3b517b6e68b8}",
- "locked": true,
- "position": {
- "x": -3.5344172033546783e-11,
- "y": -7.235068321228027,
- "z": -5.820766091346741e-11
- },
- "dimensions": {
- "x": 54.22285461425781,
- "y": 0.890187680721283,
- "z": 54.22285461425781
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1600721905502275,
- "lastEditedBy": "{0ff4c9e5-fb36-4bdd-9fbc-b2ed60e1aa3b}",
- "queryAACube": {
- "x": -38.34418487548828,
- "y": -46.58723449707031,
- "z": -38.34368133544922,
- "scale": 76.6878662109375
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "color": {
- "red": 0,
- "green": 0,
- "blue": 0
- },
- "shape": "Cylinder",
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{9ca25d38-4e0b-4eee-8736-0f569f053c56}",
- "type": "Light",
- "lastEdited": 1601257171036649,
- "locked": true,
- "position": {
- "x": 18.585229873657227,
- "y": 8.62344741821289,
- "z": 20.33745002746582
- },
- "dimensions": {
- "x": 61.943946838378906,
- "y": 61.943946838378906,
- "z": 61.943946838378906
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1600985305517745,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": -35.05979919433594,
- "y": -45.021583557128906,
- "z": -33.307579040527344,
- "scale": 107.2900619506836
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "collisionMask": 23,
- "collidesWith": "static,dynamic,kinematic,otherAvatar,",
- "color": {
- "red": 255,
- "green": 235,
- "blue": 87
- },
- "exponent": 1,
- "cutoff": 75,
- "falloffRadius": 30,
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{30d38443-925c-44d2-a6dd-bfe90cf03169}",
- "type": "Model",
- "lastEdited": 1601258262276262,
- "parentID": "{ee9b7ff6-97f0-4957-aea1-3b517b6e68b8}",
- "name": "Dome Glass",
- "locked": true,
- "position": {
- "x": -0.000016799232980702072,
- "y": 3.1790809631347656,
- "z": 0.000016798756405478343
- },
- "dimensions": {
- "x": 44.38727569580078,
- "y": 7.3717122077941895,
- "z": 44.38727569580078
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1601235894674966,
- "lastEditedBy": "{0ff4c9e5-fb36-4bdd-9fbc-b2ed60e1aa3b}",
- "queryAACube": {
- "x": -31.602176666259766,
- "y": -29.431379318237305,
- "z": -31.602275848388672,
- "scale": 63.20445251464844
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "shapeType": "static-mesh",
- "modelURL": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Models/dome2_glass.glb",
- "blendshapeCoefficients": "{\n}\n",
- "animation": {
- "allowTranslation": false
- },
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{369d555d-f945-4555-9ef3-8f323fea547c}",
- "type": "Light",
- "lastEdited": 1601257171034893,
- "parentID": "{ee9b7ff6-97f0-4957-aea1-3b517b6e68b8}",
- "name": "TreeLight_4",
- "locked": true,
- "position": {
- "x": -8.819656372070312,
- "y": -0.07544326782226562,
- "z": -9.190401077270508
- },
- "dimensions": {
- "x": 10.24996280670166,
- "y": 10.24996280670166,
- "z": 10.24996280670166
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1600983484676513,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": -17.696136474609375,
- "y": -9.960415840148926,
- "z": -18.067365646362305,
- "scale": 17.753456115722656
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "color": {
- "red": 250,
- "green": 214,
- "blue": 32
- },
- "intensity": 15,
- "exponent": 1,
- "cutoff": 75,
- "falloffRadius": 26.100000381469727,
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{5cb5d8ee-d17b-4d72-941a-bef2f8d8a91e}",
- "type": "Material",
- "lastEdited": 1601257171038436,
- "parentID": "{523b7462-9a49-4949-8d31-d84749cbab0a}",
- "parentJointIndex": 0,
- "name": "VClogo",
- "locked": true,
- "userData": "{\"verticalOffset\":0,\"segments\":16,\"updateInterval\":1000}",
- "position": {
- "x": -0.00001823902130126953,
- "y": -0.0002636909484863281,
- "z": 0.10145187377929688
- },
- "rotation": {
- "x": 0.0012969970703125,
- "y": 0.0000152587890625,
- "z": 0.0000457763671875,
- "w": 0.999969482421875
- },
- "created": 1600983484676983,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": 19.472692489624023,
- "y": -4.3051862716674805,
- "z": -2.6303162574768066,
- "scale": 4.506556510925293
- },
- "canCastShadow": false,
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "collisionMask": 23,
- "collidesWith": "static,dynamic,kinematic,otherAvatar,",
- "scriptTimestamp": 1597610738986,
- "materialURL": "materialData",
- "priority": 3,
- "parentMaterialName": "[mat::NeonTubes]",
- "materialMappingPos": {
- "x": 0.8125,
- "y": 0
- },
- "materialData": "{\"materialVersion\":1,\"materials\":[{\"name\":\"baseMaterial2\",\"model\":\"hifi_pbr\",\"opacity\":1,\"albedo\":[0,0,0],\"roughness\":1,\"metallic\":0,\"emissive\":[2.3,2,2],\"scattering\":0,\"unlit\":false,\"opacityMapMode\":\"OPACITY_MAP_MASK\",\"cullFaceMode\":\"CULL_BACK\",\"defaultFallthrough\":false}]}",
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{9bfb2207-70d2-4578-ba34-016449cc1569}",
- "type": "Light",
- "lastEdited": 1601257171035017,
- "parentID": "{ee9b7ff6-97f0-4957-aea1-3b517b6e68b8}",
- "name": "TreeLight_3",
- "locked": true,
- "position": {
- "x": 9.418960571289062,
- "y": -0.07544326782226562,
- "z": -9.190400123596191
- },
- "dimensions": {
- "x": 10.24996280670166,
- "y": 10.24996280670166,
- "z": 10.24996280670166
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1600983484676750,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": 0.54248046875,
- "y": -9.960972785949707,
- "z": -18.06680679321289,
- "scale": 17.753456115722656
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "color": {
- "red": 69,
- "green": 255,
- "blue": 69
- },
- "intensity": 20.5,
- "exponent": 1,
- "cutoff": 75,
- "falloffRadius": 26.100000381469727,
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{72cb8c19-406e-4979-b1b2-5a2e4247b278}",
+ "id": "{3a740728-5d6f-4a3b-a710-49a8c6cb1ae0}",
"type": "Zone",
- "lastEdited": 1601258385750995,
- "parentID": "{ee9b7ff6-97f0-4957-aea1-3b517b6e68b8}",
+ "lastEdited": 1617140938876740,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
"name": "MainDomeZone",
"locked": true,
"userData": "{\n \"grabbableKey\": {\n \"grabbable\": false,\n \"ignoreIK\": false\n }\n}",
@@ -1638,17 +1474,17 @@
"z": 10000
},
"rotation": {
- "x": -0.14595149457454681,
- "y": -0.023671336472034454,
- "z": 0.0017202693270519376,
- "w": 0.9890071153640747
+ "x": 0.44721001386642456,
+ "y": 0.5232430100440979,
+ "z": 0.06775686889886856,
+ "w": 0.7222389578819275
},
- "created": 1593477197502695,
- "lastEditedBy": "{0ff4c9e5-fb36-4bdd-9fbc-b2ed60e1aa3b}",
+ "created": 1614198986203133,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
"queryAACube": {
- "x": -25980.759765625,
- "y": -25926.40234375,
- "z": -25980.763671875,
+ "x": -25952.515625,
+ "y": -25921.0625,
+ "z": -25953.87890625,
"scale": 51961.5234375
},
"grab": {
@@ -1680,7 +1516,7 @@
"green": 127,
"blue": 68
},
- "intensity": 2,
+ "intensity": 1.5,
"direction": {
"x": 0.20760862529277802,
"y": -0.7512804269790649,
@@ -1691,8 +1527,8 @@
"shadowMaxDistance": 57.79999923706055
},
"ambientLight": {
- "ambientIntensity": 0.20000000298023224,
- "ambientURL": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Images/galaxySkybox.png"
+ "ambientIntensity": 0.8999999761581421,
+ "ambientURL": "qrc:///serverless/Textures/galaxySkybox.png"
},
"skybox": {
"color": {
@@ -1700,7 +1536,7 @@
"green": 235,
"blue": 235
},
- "url": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Images/galaxySkybox.png"
+ "url": "qrc:///serverless/Textures/galaxySkybox.png"
},
"haze": {
"hazeRange": 50,
@@ -1738,21 +1574,21 @@
"isFacingAvatar": false
},
{
- "id": "{a701dd17-68d7-4252-8c50-d18ac081ff1e}",
- "type": "Model",
- "lastEdited": 1601257171034627,
- "parentID": "{ee9b7ff6-97f0-4957-aea1-3b517b6e68b8}",
- "name": "trees",
+ "id": "{c5a35dbf-8253-4782-b121-26d0c609aad5}",
+ "type": "Shape",
+ "lastEdited": 1617140925236269,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "MainCollision",
"locked": true,
"position": {
- "x": -0.000016800577213871293,
- "y": -0.5505132675170898,
- "z": 0.000016800084267742932
+ "x": 0.00002288818359375,
+ "y": -6.380376815795898,
+ "z": -0.00002409383887425065
},
"dimensions": {
- "x": 26.59911346435547,
- "y": 9.549417495727539,
- "z": 26.465896606445312
+ "x": 54.22285461425781,
+ "y": 0.890187680721283,
+ "z": 54.22285461425781
},
"rotation": {
"x": -0.0000152587890625,
@@ -1760,13 +1596,13 @@
"z": -0.0000152587890625,
"w": 1
},
- "created": 1600983484676798,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
+ "created": 1614198986204167,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
"queryAACube": {
- "x": -19.359479904174805,
- "y": -20.918161392211914,
- "z": -19.359350204467773,
- "scale": 38.71883010864258
+ "x": -10.101629257202148,
+ "y": -40.391536712646484,
+ "z": -11.458602905273438,
+ "scale": 76.6878662109375
},
"grab": {
"grabbable": false,
@@ -1785,11 +1621,12 @@
},
"damping": 0,
"angularDamping": 0,
- "modelURL": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Models/Trees1.glb",
- "blendshapeCoefficients": "{\n}\n",
- "animation": {
- "allowTranslation": false
+ "color": {
+ "red": 0,
+ "green": 0,
+ "blue": 0
},
+ "shape": "Cylinder",
"clientOnly": false,
"avatarEntity": false,
"localEntity": false,
@@ -1797,33 +1634,37 @@
"isFacingAvatar": false
},
{
- "id": "{3deeadb3-5bab-4d1a-a8df-d3d4b192c76a}",
- "type": "Model",
- "lastEdited": 1601257171037923,
+ "id": "{99f186d7-a623-4339-930e-1689d62a23e0}",
+ "type": "Zone",
+ "lastEdited": 1617134741129783,
+ "parentID": "{b9444e0f-1cda-4ad3-80e5-9ef3bf0ec6cd}",
+ "visible": false,
+ "name": "mirror_zone",
"locked": true,
+ "userData": "{\"grabbableKey\":{\"grabbable\":false},\"original\":{\"id\":\"{da1e2fcd-d69b-47d7-b861-25b31f1c7175}\"}}",
"position": {
- "x": 0,
- "y": 0.42019224166870117,
- "z": 7.884521484375
+ "x": -0.01726818084716797,
+ "y": 0.2113490104675293,
+ "z": 1.704751968383789
},
"dimensions": {
- "x": 2.6655850410461426,
- "y": 3.2029099464416504,
- "z": 0.21786867082118988
+ "x": 2.8482747077941895,
+ "y": 3.153184413909912,
+ "z": 3.6725244522094727
},
"rotation": {
- "x": -0.0000152587890625,
- "y": 0.4771343469619751,
- "z": -0.0001068115234375,
- "w": 0.8788127899169922
+ "x": -0.0161592960357666,
+ "y": 0.0000152587890625,
+ "z": -0.006424069404602051,
+ "w": 0.999847412109375
},
- "created": 1601249822682598,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
+ "created": 1614198986202623,
+ "lastEditedBy": "{0b759026-5fea-494c-99de-ab6301e73d4c}",
"queryAACube": {
- "x": -2.086350917816162,
- "y": -1.666158676147461,
- "z": 5.798170566558838,
- "scale": 4.172701835632324
+ "x": 8.46190071105957,
+ "y": -2.328949451446533,
+ "z": 35.4334716796875,
+ "scale": 5.6162872314453125
},
"grab": {
"grabbable": false,
@@ -1840,16 +1681,9 @@
"w": 1
}
},
- "damping": 0,
- "angularDamping": 0,
- "modelURL": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Models/portal2.fbx",
- "blendshapeCoefficients": "{\n}\n",
- "animation": {
- "url": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Models/portal2.fbx",
- "allowTranslation": false,
- "currentFrame": 57265.5,
- "running": true
- },
+ "script": "qrc:///serverless/Scripts/mirrorReflection.js",
+ "scriptTimestamp": 1601084668318,
+ "shapeType": "box",
"clientOnly": false,
"avatarEntity": false,
"localEntity": false,
@@ -1857,35 +1691,35 @@
"isFacingAvatar": false
},
{
- "id": "{9debec8d-26a7-4838-ac32-cce1fe59c72e}",
+ "id": "{33d5305a-641d-4a4f-baa9-23ec22bb9d48}",
"type": "Light",
- "lastEdited": 1601257171038206,
- "parentID": "{ee9b7ff6-97f0-4957-aea1-3b517b6e68b8}",
- "name": "Mirror Light",
+ "lastEdited": 1617140731977526,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "TreeLight_4",
"locked": true,
"position": {
- "x": 20.063940048217773,
- "y": -2.7442214488983154,
- "z": -8.21159553527832
+ "x": -8.819656372070312,
+ "y": -0.07544326782226562,
+ "z": -9.190401077270508
},
"dimensions": {
- "x": 6.488605499267578,
- "y": 6.488605499267578,
- "z": 6.488605499267578
+ "x": 10.24996280670166,
+ "y": 10.24996280670166,
+ "z": 10.24996280670166
},
"rotation": {
"x": -0.0000152587890625,
- "y": 0.17360186576843262,
- "z": -0.0000762939453125,
- "w": 0.9848020076751709
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
},
- "created": 1601081824307531,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
+ "created": 1614198986202730,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
"queryAACube": {
- "x": 14.444778442382812,
- "y": -9.372614860534668,
- "z": -13.83016586303711,
- "scale": 11.238594055175781
+ "x": 10.546369552612305,
+ "y": -4.619409561157227,
+ "z": 8.817764282226562,
+ "scale": 17.753456115722656
},
"grab": {
"grabbable": false,
@@ -1904,10 +1738,15 @@
},
"damping": 0,
"angularDamping": 0,
- "intensity": 3,
+ "color": {
+ "red": 250,
+ "green": 214,
+ "blue": 32
+ },
+ "intensity": 15,
"exponent": 1,
"cutoff": 75,
- "falloffRadius": 16.600000381469727,
+ "falloffRadius": 26.100000381469727,
"clientOnly": false,
"avatarEntity": false,
"localEntity": false,
@@ -1915,10 +1754,395 @@
"isFacingAvatar": false
},
{
- "id": "{b7a9788d-58a9-4999-8e8f-55fe07acb486}",
+ "id": "{67b2c758-41ea-4448-80eb-f171d792ab5c}",
+ "type": "Box",
+ "lastEdited": 1617140777516274,
+ "visible": false,
+ "name": "LandingPoint",
+ "locked": true,
+ "position": {
+ "x": 21.792818069458008,
+ "y": 0,
+ "z": 25.644922256469727
+ },
+ "dimensions": {
+ "x": 3.2382099628448486,
+ "y": 0.20000000298023224,
+ "z": 1.8551445007324219
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1617140160943861,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 19.924158096313477,
+ "y": -1.8686603307724,
+ "z": 23.776262283325195,
+ "scale": 3.7373206615448
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "color": {
+ "red": 0,
+ "green": 180,
+ "blue": 239
+ },
+ "shape": "Cube",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{a4421b2e-123a-4619-8788-e36eef8029ea}",
+ "type": "Light",
+ "lastEdited": 1617140788480412,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "TreeLight_2",
+ "locked": true,
+ "position": {
+ "x": -8.819664001464844,
+ "y": -0.24757671356201172,
+ "z": 8.97313404083252
+ },
+ "dimensions": {
+ "x": 10.24996280670166,
+ "y": 10.24996280670166,
+ "z": 10.24996280670166
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986202574,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 10.54580307006836,
+ "y": -4.790988445281982,
+ "z": 26.981304168701172,
+ "scale": 17.753456115722656
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "color": {
+ "red": 191,
+ "green": 31,
+ "blue": 255
+ },
+ "intensity": 15,
+ "exponent": 1,
+ "cutoff": 75,
+ "falloffRadius": 26.100000381469727,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{523e1c2d-1603-47bb-80f1-314747b161b0}",
+ "type": "Material",
+ "lastEdited": 1617140991884044,
+ "parentID": "{f3d87e87-a250-42f8-a285-84cbeb777353}",
+ "parentJointIndex": 4,
+ "name": "moveMaterial",
+ "userData": "{\n \"verticalOffset\": 0,\n \"segments\": 64,\n \"updateInterval\": 200\n}",
+ "position": {
+ "x": 0.00000476837158203125,
+ "y": 7.152557373046875e-7,
+ "z": 0.000003814697265625
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000457763671875,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614382837959471,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": -5.742575168609619,
+ "y": -21.97960662841797,
+ "z": 11.547750473022461,
+ "scale": 52.68036651611328
+ },
+ "canCastShadow": false,
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "collisionMask": 23,
+ "collidesWith": "static,dynamic,kinematic,otherAvatar,",
+ "script": "qrc:///serverless/Scripts/materialSequencer.js",
+ "scriptTimestamp": 1601250646975,
+ "materialURL": "materialData",
+ "priority": 3,
+ "parentMaterialName": "[mat::move]",
+ "materialMappingPos": {
+ "x": 0.265625,
+ "y": 0
+ },
+ "materialData": "{\"materialVersion\":1,\"materials\":[{\"name\":\"moveMaterial\",\"model\":\"hifi_pbr\",\"opacity\":0.8,\"albedo\":[1,1,1],\"roughness\":1,\"metallic\":0,\"emissive\":[0,0,0],\"scattering\":0,\"unlit\":false,\"emissiveMap\":\"qrc:///serverless/Textures/gradient1.jpg\",\"albedoMap\":\"qrc:///serverless/Textures/gradient1.jpg\",\"opacityMapMode\":\"OPACITY_MAP_BLEND\",\"cullFaceMode\":\"CULL_NONE\",\"defaultFallthrough\":false}]}",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{35eb5c90-08e6-44de-b6b9-46c9fd36494a}",
+ "type": "Text",
+ "lastEdited": 1617134723640851,
+ "name": "(2)",
+ "locked": true,
+ "description": "mirror text",
+ "position": {
+ "x": 0,
+ "y": 4.090241432189941,
+ "z": 4.291414260864258
+ },
+ "dimensions": {
+ "x": 3.2473599910736084,
+ "y": 0.6462407112121582,
+ "z": 0.009999999776482582
+ },
+ "rotation": {
+ "x": 0.0008392333984375,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 0.999969482421875
+ },
+ "created": 1614453187953099,
+ "lastEditedBy": "{0b759026-5fea-494c-99de-ab6301e73d4c}",
+ "queryAACube": {
+ "x": -1.6555267572402954,
+ "y": 2.4347147941589355,
+ "z": 2.635887622833252,
+ "scale": 3.311053514480591
+ },
+ "billboardMode": "yaw",
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "collisionMask": 23,
+ "collidesWith": "static,dynamic,kinematic,otherAvatar,",
+ "text": "Portal",
+ "lineHeight": 0.6000000238418579,
+ "textColor": {
+ "red": 0,
+ "green": 0,
+ "blue": 0
+ },
+ "backgroundAlpha": 0,
+ "unlit": true,
+ "font": "Inconsolata",
+ "textEffect": "outline fill",
+ "textEffectColor": {
+ "red": 0,
+ "green": 208,
+ "blue": 255
+ },
+ "textEffectThickness": 0.30000001192092896,
+ "alignment": "center",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": true,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{7d040847-617e-494b-9593-05ab35142098}",
+ "type": "Light",
+ "lastEdited": 1617140731977921,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "TreeLight_3",
+ "locked": true,
+ "position": {
+ "x": 9.418960571289062,
+ "y": -0.07544326782226562,
+ "z": -9.190400123596191
+ },
+ "dimensions": {
+ "x": 10.24996280670166,
+ "y": 10.24996280670166,
+ "z": 10.24996280670166
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986202887,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 28.784984588623047,
+ "y": -4.61996603012085,
+ "z": 8.818321228027344,
+ "scale": 17.753456115722656
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "color": {
+ "red": 69,
+ "green": 255,
+ "blue": 69
+ },
+ "intensity": 20.5,
+ "exponent": 1,
+ "cutoff": 75,
+ "falloffRadius": 26.100000381469727,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{c191dc9f-7a8e-4f98-9974-b23c9bb7992d}",
+ "type": "Light",
+ "lastEdited": 1617140788480592,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "TreeLight_1",
+ "locked": true,
+ "position": {
+ "x": 9.000457763671875,
+ "y": -0.2475719451904297,
+ "z": 8.999537467956543
+ },
+ "dimensions": {
+ "x": 10.24996280670166,
+ "y": 10.24996280670166,
+ "z": 10.24996280670166
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986203735,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 28.365924835205078,
+ "y": -4.791526794433594,
+ "z": 27.008251190185547,
+ "scale": 17.753456115722656
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "color": {
+ "red": 69,
+ "green": 106,
+ "blue": 255
+ },
+ "intensity": 17.799999237060547,
+ "exponent": 1,
+ "cutoff": 75,
+ "falloffRadius": 26.100000381469727,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{cf666211-2b88-4ee6-af3c-a1a92bd6c513}",
"type": "Model",
- "lastEdited": 1601257171034676,
- "parentID": "{ee9b7ff6-97f0-4957-aea1-3b517b6e68b8}",
+ "lastEdited": 1617140858220173,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
"name": "Planters",
"locked": true,
"position": {
@@ -1937,12 +2161,12 @@
"z": -0.0000152587890625,
"w": 1
},
- "created": 1600983484676673,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
+ "created": 1614198986203890,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
"queryAACube": {
- "x": -13.858329772949219,
- "y": -20.452945709228516,
- "z": -13.857589721679688,
+ "x": 14.384176254272461,
+ "y": -15.1119384765625,
+ "z": 13.02754020690918,
"scale": 27.715923309326172
},
"grab": {
@@ -1963,7 +2187,7 @@
"damping": 0,
"angularDamping": 0,
"shapeType": "static-mesh",
- "modelURL": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Models/Planter.glb",
+ "modelURL": "qrc:///serverless/Models/Planter.glb",
"blendshapeCoefficients": "{\n}\n",
"animation": {
"allowTranslation": false
@@ -1973,124 +2197,8 @@
"localEntity": false,
"faceCamera": false,
"isFacingAvatar": false
-},
- {
- "id": "{ee9b7ff6-97f0-4957-aea1-3b517b6e68b8}",
- "type": "Model",
- "lastEdited": 1601258385751160,
- "name": "Dome",
- "locked": true,
- "position": {
- "x": 18.58534812927246,
- "y": 4.332773208618164,
- "z": 20.337331771850586
- },
- "dimensions": {
- "x": 54.60203552246094,
- "y": 13.734564781188965,
- "z": 54.60203552246094
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1600983484676623,
- "lastEditedBy": "{0ff4c9e5-fb36-4bdd-9fbc-b2ed60e1aa3b}",
- "queryAACube": {
- "x": -25980.759765625,
- "y": -25926.40234375,
- "z": -25980.763671875,
- "scale": 51961.5234375
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "shapeType": "static-mesh",
- "modelURL": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Models/dome2.glb",
- "blendshapeCoefficients": "{\n}\n",
- "animation": {
- "allowTranslation": false
- },
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
-},
- {
- "id": "{7b9901a2-94ed-48a2-ae33-1ccabd0ee1e5}",
- "type": "Light",
- "lastEdited": 1601257171037705,
- "parentID": "{74fcc311-ac54-4c92-b658-67b616d89124}",
- "locked": true,
- "position": {
- "x": 0.041241057217121124,
- "y": 1.0814814567565918,
- "z": -0.03974604234099388
- },
- "dimensions": {
- "x": 9.067279815673828,
- "y": 9.067279815673828,
- "z": 9.067279815673828
- },
- "rotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "created": 1600122409224272,
- "lastEditedBy": "{70099fa7-d189-42dc-80a0-02c37d1942d1}",
- "queryAACube": {
- "x": -7.811369895935059,
- "y": -12.818197250366211,
- "z": -7.892119884490967,
- "scale": 15.704989433288574
- },
- "grab": {
- "grabbable": false,
- "equippableLeftRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- },
- "equippableRightRotation": {
- "x": -0.0000152587890625,
- "y": -0.0000152587890625,
- "z": -0.0000152587890625,
- "w": 1
- }
- },
- "damping": 0,
- "angularDamping": 0,
- "intensity": 5,
- "exponent": 1,
- "cutoff": 75,
- "falloffRadius": 1,
- "clientOnly": false,
- "avatarEntity": false,
- "localEntity": false,
- "faceCamera": false,
- "isFacingAvatar": false
}
],
- "Id": "{190133e9-0517-4f19-b163-786c40f120ec}",
- "Version": 128
+ "Id": "{2fef14da-af5c-43f2-855c-b36bfa23d90f}",
+ "Version": 133
}
diff --git a/interface/resources/serverless/tutorialqrc.json b/interface/resources/serverless/tutorialqrc.json
new file mode 100644
index 0000000000..90d7e91aa3
--- /dev/null
+++ b/interface/resources/serverless/tutorialqrc.json
@@ -0,0 +1,2204 @@
+{
+ "DataVersion": 0,
+ "Paths": {
+ "/old": "/0.155245,-0.941538,23.9289/0,0.791589,0,0.611053",
+ "/": "/21.6727,1.02002,25.1977/0,0.999868,0,-0.016252"
+
+ },
+ "Entities": [
+ {
+ "id": "{0a199807-4a83-4286-b09c-f21124627c3e}",
+ "type": "Box",
+ "name": "Config Wizard Loader",
+ "locked": true,
+ "lastEdited": 1613737207915514,
+ "visible": false,
+ "position": {
+ "x": 21.8,
+ "y": 1.9,
+ "z": 28
+ },
+ "dimensions": {
+ "x": 0.20000000298023224,
+ "y": 0.20000000298023224,
+ "z": 0.20000000298023224
+ },
+ "rotation": {
+ "x": 3.5931313391301956e-7,
+ "y": -0.9996991753578186,
+ "z": 0.000014645980627392419,
+ "w": 0.024525845423340797
+ },
+ "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": "qrc:///serverless/Scripts/wizardLoader.js",
+ "color": {
+ "red": 0,
+ "green": 180,
+ "blue": 239
+ },
+ "shape": "Cube",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+ },
+ {
+ "id": "{b9444e0f-1cda-4ad3-80e5-9ef3bf0ec6cd}",
+ "type": "Model",
+ "lastEdited": 1617134731448079,
+ "name": "mirror_reflectingPlane",
+ "locked": true,
+ "userData": "{\"grabbableKey\":{\"grabbable\":false,\"ignoreIK\":false},\"original\":{\"id\":\"{6291b4e5-0dcb-484c-9c11-fe47725a4ad8}\"}}",
+ "position": {
+ "x": 3.3984665870666504,
+ "y": 1.891787052154541,
+ "z": 20.900876998901367
+ },
+ "dimensions": {
+ "x": 1.6291353702545166,
+ "y": 2.206333875656128,
+ "z": 0.01092288363724947
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.8816205263137817,
+ "z": 0.0000152587890625,
+ "w": -0.4719768166542053
+ },
+ "created": 1614198986204053,
+ "lastEditedBy": "{0b759026-5fea-494c-99de-ab6301e73d4c}",
+ "queryAACube": {
+ "x": 2.0271434783935547,
+ "y": 0.5204638242721558,
+ "z": 19.52955436706543,
+ "scale": 2.7426464557647705
+ },
+ "grab": {
+ "grabbable": false,
+ "grabFollowsController": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "collisionless": true,
+ "ignoreForCollisions": true,
+ "collisionMask": 0,
+ "collidesWith": "",
+ "script": "qrc:///serverless/Scripts/mirrorClient.js",
+ "scriptTimestamp": 1601084665601,
+ "modelURL": "qrc:///serverless/Models/mirror_without_backface.baked.fbx",
+ "blendshapeCoefficients": "{\n}\n",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{61e0e141-bb95-4e7a-a043-3f4f783e39f4}",
+ "type": "Text",
+ "lastEdited": 1617134727215565,
+ "locked": true,
+ "description": "mirror text",
+ "position": {
+ "x": 3.306519031524658,
+ "y": 4.0622100830078125,
+ "z": 20.931333541870117
+ },
+ "dimensions": {
+ "x": 3.2473599910736084,
+ "y": 0.6462407112121582,
+ "z": 0.009999999776482582
+ },
+ "rotation": {
+ "x": 0.0008392333984375,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 0.999969482421875
+ },
+ "created": 1614383649622836,
+ "lastEditedBy": "{0b759026-5fea-494c-99de-ab6301e73d4c}",
+ "queryAACube": {
+ "x": 1.6509922742843628,
+ "y": 2.4066834449768066,
+ "z": 19.275806427001953,
+ "scale": 3.311053514480591
+ },
+ "billboardMode": "yaw",
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "collisionMask": 23,
+ "collidesWith": "static,dynamic,kinematic,otherAvatar,",
+ "text": "Mirror",
+ "lineHeight": 0.6000000238418579,
+ "textColor": {
+ "red": 0,
+ "green": 0,
+ "blue": 0
+ },
+ "backgroundAlpha": 0,
+ "unlit": true,
+ "font": "Inconsolata",
+ "textEffect": "outline fill",
+ "textEffectColor": {
+ "red": 0,
+ "green": 208,
+ "blue": 255
+ },
+ "textEffectThickness": 0.30000001192092896,
+ "alignment": "center",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": true,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{4b1ac4d3-325b-46a2-9c27-0e94ee1afcaf}",
+ "type": "Model",
+ "lastEdited": 1617140845328587,
+ "name": "Seagull",
+ "locked": true,
+ "position": {
+ "x": 23.798669815063477,
+ "y": 4.926492214202881,
+ "z": 10.381175994873047
+ },
+ "dimensions": {
+ "x": 0.9342527389526367,
+ "y": 0.8603132963180542,
+ "z": 0.47802668809890747
+ },
+ "rotation": {
+ "x": -0.017654716968536377,
+ "y": -0.4898908734321594,
+ "z": 0.030106067657470703,
+ "w": 0.8710917234420776
+ },
+ "created": 1614198986205195,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 23.12016487121582,
+ "y": 4.247987270355225,
+ "z": 9.70267105102539,
+ "scale": 1.3570102453231812
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "shapeType": "simple-compound",
+ "modelURL": "qrc:///serverless/Models/seagull-ANI.fbx",
+ "blendshapeCoefficients": "{\n}\n",
+ "animation": {
+ "url": "qrc:///serverless/Models/seagull-ANI.fbx",
+ "allowTranslation": false,
+ "currentFrame": 99.81153869628906,
+ "running": true,
+ "lastFrame": 120
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{7c7f80be-4fa3-4615-86f3-5446c6737350}",
+ "type": "Box",
+ "lastEdited": 1617140739515673,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "visible": false,
+ "name": "Sound Emitter",
+ "locked": true,
+ "userData": "{\"soundURL\":\"qrc:///serverless/Sounds/468407__onderwish__sci-fi-survival-dreamscape.mp3\",\"shouldLoop\":true,\"volume\":0.18,\"refreshInterval\":100,\"grabbableKey\":{\"grabbable\":false}}",
+ "position": {
+ "x": 0,
+ "y": 1.0455207824707031,
+ "z": 0
+ },
+ "dimensions": {
+ "x": 0.20000000298023224,
+ "y": 0.20000000298023224,
+ "z": 0.20000000298023224
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198017837347,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 28.069303512573242,
+ "y": 5.205089092254639,
+ "z": 26.711923599243164,
+ "scale": 0.3464101552963257
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "script": "qrc:///serverless/Scripts/soundEmitter.js",
+ "scriptTimestamp": 1601079357399,
+ "color": {
+ "red": 0,
+ "green": 180,
+ "blue": 239
+ },
+ "shape": "Cube",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{0436152a-b188-4608-abe9-a3fb1c4b283d}",
+ "type": "Model",
+ "lastEdited": 1617140818158676,
+ "name": "Vircadia Sign",
+ "locked": true,
+ "position": {
+ "x": 43.52519226074219,
+ "y": 4.912969589233398,
+ "z": 8.236417770385742
+ },
+ "dimensions": {
+ "x": 4.443090915679932,
+ "y": 0.7363157868385315,
+ "z": 0.16073395311832428
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.7019302845001221,
+ "z": 0.0000152587890625,
+ "w": 0.7122453451156616
+ },
+ "created": 1614198986205729,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 41.271915435791016,
+ "y": 2.659691333770752,
+ "z": 5.983139514923096,
+ "scale": 4.506556510925293
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "modelURL": "qrc:///serverless/Models/VircadiaLogo.fbx",
+ "blendshapeCoefficients": "{\n}\n",
+ "animation": {
+ "allowTranslation": false
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{06b826d4-5385-4c49-92c2-47e24f97b35a}",
+ "type": "Text",
+ "lastEdited": 1617134764395172,
+ "name": "(2)",
+ "locked": true,
+ "description": "mirror text",
+ "position": {
+ "x": 34.17714309692383,
+ "y": 4.050739288330078,
+ "z": 27.204530715942383
+ },
+ "dimensions": {
+ "x": 3.2473599910736084,
+ "y": 0.6462407112121582,
+ "z": 0.009999999776482582
+ },
+ "rotation": {
+ "x": 0.0008392333984375,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 0.999969482421875
+ },
+ "created": 1614453280539951,
+ "lastEditedBy": "{0b759026-5fea-494c-99de-ab6301e73d4c}",
+ "queryAACube": {
+ "x": 32.5216178894043,
+ "y": 2.3952126502990723,
+ "z": 25.54900360107422,
+ "scale": 3.311053514480591
+ },
+ "billboardMode": "yaw",
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "collisionMask": 23,
+ "collidesWith": "static,dynamic,kinematic,otherAvatar,",
+ "text": "Controls",
+ "lineHeight": 0.6000000238418579,
+ "textColor": {
+ "red": 0,
+ "green": 0,
+ "blue": 0
+ },
+ "backgroundAlpha": 0,
+ "unlit": true,
+ "font": "Inconsolata",
+ "textEffect": "outline fill",
+ "textEffectColor": {
+ "red": 0,
+ "green": 208,
+ "blue": 255
+ },
+ "textEffectThickness": 0.30000001192092896,
+ "alignment": "center",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": true,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{159f2743-d862-47e3-9f27-5de062b09941}",
+ "type": "Material",
+ "lastEdited": 1617140810844450,
+ "parentID": "{0436152a-b188-4608-abe9-a3fb1c4b283d}",
+ "parentJointIndex": 0,
+ "name": "VClogo",
+ "locked": true,
+ "userData": "{\"verticalOffset\":0,\"segments\":16,\"updateInterval\":1000}",
+ "position": {
+ "x": -0.00001823902130126953,
+ "y": -0.0002636909484863281,
+ "z": 0.10145187377929688
+ },
+ "rotation": {
+ "x": 0.0012969970703125,
+ "y": 0.0000152587890625,
+ "z": 0.0000457763671875,
+ "w": 0.999969482421875
+ },
+ "created": 1614198986205783,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 47.7151985168457,
+ "y": 1.0358200073242188,
+ "z": 24.254812240600586,
+ "scale": 4.506557464599609
+ },
+ "canCastShadow": false,
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "collisionMask": 23,
+ "collidesWith": "static,dynamic,kinematic,otherAvatar,",
+ "scriptTimestamp": 1597610738986,
+ "materialURL": "materialData",
+ "priority": 3,
+ "parentMaterialName": "[mat::NeonTubes]",
+ "materialMappingPos": {
+ "x": 0.8125,
+ "y": 0
+ },
+ "materialData": "{\"materialVersion\":1,\"materials\":[{\"name\":\"baseMaterial2\",\"model\":\"hifi_pbr\",\"opacity\":1,\"albedo\":[0,0,0],\"roughness\":1,\"metallic\":0,\"emissive\":[2.3,2,2],\"scattering\":0,\"unlit\":false,\"opacityMapMode\":\"OPACITY_MAP_MASK\",\"cullFaceMode\":\"CULL_BACK\",\"defaultFallthrough\":false}]}",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+{
+ "id": "{5b6443c5-ec22-4c8a-9581-85134ceb6856}",
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "type": "Model",
+ "name": "Bowl",
+ "locked": true,
+ "lastEdited": 1617218059378792,
+ "dimensions": {
+ "x": 1.7757656574249268,
+ "y": 1.2933320999145508,
+ "z": 1.7757654190063477
+ },
+ "rotation": {
+ "x": -0.000030517578125,
+ "y": -0.000030517578125,
+ "z": -0.000030517578125,
+ "w": 1
+ },
+ "created": 1617216882976266,
+ "lastEditedBy": "{f72b151a-b325-4c9f-805a-7a7a520f82f7}",
+ "position": {
+ "x": -0.00001823902130126953,
+ "y": -5.1002636909484863281,
+ "z": 0.10145187377929688
+ },
+ "queryAACube": {
+ "x": -1.4123910665512085,
+ "y": -1.4123910665512085,
+ "z": -1.4123910665512085,
+ "scale": 2.824782133102417
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "shapeType": "static-mesh",
+ "modelURL": "qrc:///serverless/Models/bowl2.fbx",
+ "blendshapeCoefficients": "{\n}\n",
+ "animation": {
+ "allowTranslation": false
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{9c451827-4c87-4bf7-8372-aeb6bbd61eaa}",
+ "type": "ParticleEffect",
+ "lastEdited": 1617217817025177,
+ "parentID": "{5b6443c5-ec22-4c8a-9581-85134ceb6856}",
+ "name": "Brew",
+ "locked": true,
+ "position": {
+ "x": 0,
+ "y": 0.44699999690055847,
+ "z": 0
+ },
+ "dimensions": {
+ "x": 16.263307571411133,
+ "y": 16.263307571411133,
+ "z": 16.263307571411133
+ },
+ "rotation": {
+ "x": 8.988587651970192e-12,
+ "y": -0.00008631677337689325,
+ "z": -0.7071500420570374,
+ "w": 0.7070636749267578
+ },
+ "created": 1617216898348298,
+ "lastEditedBy": "{f72b151a-b325-4c9f-805a-7a7a520f82f7}",
+ "queryAACube": {
+ "x": 7.714627265930176,
+ "y": -12.719738006591797,
+ "z": -5.470824241638184,
+ "scale": 28.168874740600586
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "shapeType": "ellipsoid",
+ "color": {
+ "red": 4,
+ "green": 101,
+ "blue": 143
+ },
+ "alpha": 0.30000001192092896,
+ "textures": "qrc:///serverless/Textures/default_particle.png",
+ "maxParticles": 80,
+ "lifespan": 2,
+ "emitRate": 47,
+ "emitSpeed": 0.30000001192092896,
+ "speedSpread": 0,
+ "emitOrientation": {
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "emitDimensions": {
+ "x": 1,
+ "y": 1,
+ "z": 0
+ },
+ "emitRadiusStart": 0,
+ "polarStart": 0.8700000047683716,
+ "polarFinish": 1.2200000286102295,
+ "azimuthStart": 3.0999999046325684,
+ "azimuthFinish": 3.140000104904175,
+ "emitAcceleration": {
+ "x": 0,
+ "y": -0.9900000095367432,
+ "z": 0
+ },
+ "accelerationSpread": {
+ "x": 0.10000000149011612,
+ "y": 0.3400000035762787,
+ "z": 0.10000000149011612
+ },
+ "particleRadius": 1.5,
+ "radiusStart": 0.5,
+ "radiusFinish": 0.30000001192092896,
+ "colorSpread": {
+ "red": 0,
+ "green": 150,
+ "blue": 150
+ },
+ "colorStart": {
+ "red": 0,
+ "green": 0,
+ "blue": 0
+ },
+ "colorFinish": {
+ "red": 0,
+ "green": 0,
+ "blue": 0
+ },
+ "alphaStart": 0.5,
+ "alphaFinish": 0,
+ "emitterShouldTrail": true,
+ "spinStart": null,
+ "spinFinish": null,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{77cbbb3f-e1fe-436c-8b0a-11b45b96181b}",
+ "type": "ParticleEffect",
+ "lastEdited": 1617216897203063,
+ "parentID": "{5b6443c5-ec22-4c8a-9581-85134ceb6856}",
+ "name": "steam",
+ "locked": true,
+ "position": {
+ "x": 0.03824615478515625,
+ "y": 5.34733772277832,
+ "z": 0.057065125554800034
+ },
+ "dimensions": {
+ "x": 14.4042329788208,
+ "y": 14.4042329788208,
+ "z": 14.4042329788208
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1617216882977327,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 9.363174438476562,
+ "y": -6.209394454956055,
+ "z": -3.8040504455566406,
+ "scale": 24.948863983154297
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "shapeType": "ellipsoid",
+ "alpha": 0.014999999664723873,
+ "textures": "qrc:///serverless/Textures/default_particle.png",
+ "maxParticles": 100,
+ "lifespan": 3.069999933242798,
+ "emitSpeed": 0.4000000059604645,
+ "speedSpread": 0.10000000149011612,
+ "emitOrientation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "polarFinish": 3.1415927410125732,
+ "emitAcceleration": {
+ "x": 0,
+ "y": -1,
+ "z": 0
+ },
+ "particleRadius": 1.5,
+ "radiusStart": 0.5,
+ "radiusFinish": 0.4000000059604645,
+ "colorStart": {
+ "red": 0,
+ "green": 0,
+ "blue": 0
+ },
+ "colorFinish": {
+ "red": 0,
+ "green": 0,
+ "blue": 0
+ },
+ "alphaStart": 0.5,
+ "alphaFinish": 0,
+ "emitterShouldTrail": true,
+ "spinStart": null,
+ "spinFinish": null,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{463bad19-9d44-479e-af6c-9d86ee76fc45}",
+ "type": "Light",
+ "lastEdited": 1617217841543322,
+ "parentID": "{5b6443c5-ec22-4c8a-9581-85134ceb6856}",
+ "name": "blacklight",
+ "locked": true,
+ "position": {
+ "x": 0,
+ "y": 1.6233999729156494,
+ "z": 0
+ },
+ "dimensions": {
+ "x": 3.867255687713623,
+ "y": 3.867255687713623,
+ "z": 4.0243144035339355
+ },
+ "rotation": {
+ "x": -0.7071176171302795,
+ "y": 3.849143226375418e-12,
+ "z": -0.000021579189706244506,
+ "w": 0.7070960402488708
+ },
+ "created": 1617217525079443,
+ "lastEditedBy": "{f72b151a-b325-4c9f-805a-7a7a520f82f7}",
+ "queryAACube": {
+ "x": 18.404050827026367,
+ "y": -0.8539872169494629,
+ "z": 5.2184553146362305,
+ "scale": 6.790172100067139
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "isSpotlight": true,
+ "intensity": -25.700000762939453,
+ "exponent": 19.6299991607666,
+ "cutoff": 73.94000244140625,
+ "falloffRadius": 72.4000015258789,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{a80ee618-752e-44e4-a9de-04f089b4fe03}",
+ "type": "Model",
+ "lastEdited": 1617140830643374,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "Dome Glass",
+ "locked": true,
+ "position": {
+ "x": -0.000016799232980702072,
+ "y": 3.1790809631347656,
+ "z": 0.000016798756405478343
+ },
+ "dimensions": {
+ "x": 44.38727569580078,
+ "y": 7.3717122077941895,
+ "z": 44.38727569580078
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986204337,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": -3.359670639038086,
+ "y": -24.09037208557129,
+ "z": -4.717145919799805,
+ "scale": 63.20445251464844
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "shapeType": "static-mesh",
+ "modelURL": "qrc:///serverless/Models/dome2_glass.glb",
+ "blendshapeCoefficients": "{\n}\n",
+ "animation": {
+ "allowTranslation": false
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{d2ef46ed-c85f-4ab5-bef3-14feb46e9091}",
+ "type": "Model",
+ "lastEdited": 1617134717193282,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "trees",
+ "locked": true,
+ "position": {
+ "x": -0.000016800577213871293,
+ "y": -0.5505132675170898,
+ "z": 0.000016800084267742932
+ },
+ "dimensions": {
+ "x": 26.59911346435547,
+ "y": 9.549417495727539,
+ "z": 26.465896606445312
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986202454,
+ "lastEditedBy": "{0b759026-5fea-494c-99de-ab6301e73d4c}",
+ "queryAACube": {
+ "x": 8.883026123046875,
+ "y": -15.577155113220215,
+ "z": 7.525779724121094,
+ "scale": 38.71883010864258
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "modelURL": "qrc:///serverless/Models/Trees1.glb",
+ "blendshapeCoefficients": "{\n}\n",
+ "animation": {
+ "allowTranslation": false
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{f3d87e87-a250-42f8-a285-84cbeb777353}",
+ "type": "Model",
+ "lastEdited": 1617140880548597,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "Panels",
+ "locked": true,
+ "position": {
+ "x": -0.0001735687255859375,
+ "y": -5.685686111450195,
+ "z": 0.00017449550796300173
+ },
+ "dimensions": {
+ "x": 36.70009231567383,
+ "y": 3.3704721927642822,
+ "z": 25.731521606445312
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614377167635894,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": -5.742575168609619,
+ "y": -23.827165603637695,
+ "z": 4.4112548828125,
+ "scale": 59.816864013671875
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "modelURL": "qrc:///serverless/Models/Stands.fbx",
+ "blendshapeCoefficients": "{\n}\n",
+ "useOriginalPivot": true,
+ "animation": {
+ "url": "qrc:///serverless/Models/Stands.fbx",
+ "allowTranslation": false,
+ "currentFrame": 68342.515625,
+ "running": true
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{25638e51-c19c-420a-a9cc-ff02626b62ef}",
+ "type": "Box",
+ "lastEdited": 1617134697724395,
+ "visible": false,
+ "name": "portalCube",
+ "locked": true,
+ "userData": "{\"destination\":\"hifi://172.104.248.237:40102/154.572,-96.8437,-417.945/0,1,0,-1.52586e-05\"}",
+ "position": {
+ "x": 0.06047534942626953,
+ "y": 1.751168131828308,
+ "z": 4.2923126220703125
+ },
+ "dimensions": {
+ "x": 1.6716244220733643,
+ "y": 2.5448203086853027,
+ "z": 0.26420968770980835
+ },
+ "rotation": {
+ "x": 0.0000152587890625,
+ "y": 0.6351872682571411,
+ "z": -0.0000457763671875,
+ "w": 0.772335410118103
+ },
+ "created": 1614454164933827,
+ "lastEditedBy": "{0b759026-5fea-494c-99de-ab6301e73d4c}",
+ "queryAACube": {
+ "x": -1.4676154851913452,
+ "y": 0.22307729721069336,
+ "z": 2.764221668243408,
+ "scale": 3.0561816692352295
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "collisionMask": 23,
+ "collidesWith": "static,dynamic,kinematic,otherAvatar,",
+ "damping": 0,
+ "angularDamping": 0,
+ "script": "qrc:///serverless/Scripts/portal.js",
+ "scriptTimestamp": 1617134674001,
+ "color": {
+ "red": 0,
+ "green": 180,
+ "blue": 239
+ },
+ "shape": "Cube",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{e0261cde-c5e0-44bf-a747-787c4c867d79}",
+ "type": "Light",
+ "lastEdited": 1617140788480898,
+ "name": "mainDomeLight",
+ "locked": true,
+ "position": {
+ "x": 21.799074172973633,
+ "y": 10.247319221496582,
+ "z": 8.613605499267578
+ },
+ "dimensions": {
+ "x": 61.943946838378906,
+ "y": 61.943946838378906,
+ "z": 61.943946838378906
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986202528,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": -31.845956802368164,
+ "y": -43.39771270751953,
+ "z": -45.03142547607422,
+ "scale": 107.2900619506836
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "collisionMask": 23,
+ "collidesWith": "static,dynamic,kinematic,otherAvatar,",
+ "color": {
+ "red": 255,
+ "green": 235,
+ "blue": 87
+ },
+ "intensity": 0.8999999761581421,
+ "exponent": 1,
+ "cutoff": 75,
+ "falloffRadius": 30,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "type": "Model",
+ "lastEdited": 1617134709051164,
+ "name": "Dome",
+ "locked": true,
+ "position": {
+ "x": 21.799192428588867,
+ "y": 5.9566450119018555,
+ "z": 8.613487243652344
+ },
+ "dimensions": {
+ "x": 54.60203552246094,
+ "y": 13.734564781188965,
+ "z": 54.60203552246094
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986203467,
+ "lastEditedBy": "{0b759026-5fea-494c-99de-ab6301e73d4c}",
+ "queryAACube": {
+ "x": -25952.515625,
+ "y": -25921.0625,
+ "z": -25953.87890625,
+ "scale": 51961.5234375
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "shapeType": "static-mesh",
+ "modelURL": "qrc:///serverless/Models/dome2.glb",
+ "blendshapeCoefficients": "{\n}\n",
+ "animation": {
+ "allowTranslation": false
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{52c84c1c-6567-4670-9b2b-9aa9bc1456ea}",
+ "type": "Model",
+ "lastEdited": 1617134574674644,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "locked": true,
+ "position": {
+ "x": 4.238387418808998e-12,
+ "y": -2.3088181018829346,
+ "z": -7.275957614183426e-12
+ },
+ "dimensions": {
+ "x": 5.688337802886963,
+ "y": 7.10263204574585,
+ "z": 5.688361644744873
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986204522,
+ "lastEditedBy": "{78b82b17-4e7a-410f-95ce-1c3ace1cd609}",
+ "queryAACube": {
+ "x": -4.850972652435303,
+ "y": -3.341723680496216,
+ "z": -4.9151411056518555,
+ "scale": 38.45905685424805
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "scriptTimestamp": 1598912452582,
+ "shapeType": "static-mesh",
+ "modelURL": "qrc:///serverless/Models/temple5.glb",
+ "blendshapeCoefficients": "{\n}\n",
+ "animation": {
+ "allowTranslation": false
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{d344138a-adb8-4ae7-9aae-447266a48869}",
+ "type": "Light",
+ "lastEdited": 1617140788480765,
+ "parentID": "{b9444e0f-1cda-4ad3-80e5-9ef3bf0ec6cd}",
+ "name": "mirrorLight",
+ "locked": true,
+ "position": {
+ "x": -0.0015339851379394531,
+ "y": -0.000001519918441772461,
+ "z": 0.26983165740966797
+ },
+ "dimensions": {
+ "x": 3.8637032508850098,
+ "y": 3.8637032508850098,
+ "z": 4
+ },
+ "rotation": {
+ "x": 0.0000152587890625,
+ "y": 1,
+ "z": 0.0000152587890625,
+ "w": -0.0000152587890625
+ },
+ "created": 1614453808970411,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 6.681288719177246,
+ "y": -3.11796498298645,
+ "z": 35.638336181640625,
+ "scale": 6.771735668182373
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "color": {
+ "red": 255,
+ "green": 255,
+ "blue": 235
+ },
+ "isSpotlight": true,
+ "intensity": 0.699999988079071,
+ "exponent": 1,
+ "cutoff": 75,
+ "falloffRadius": 10,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{0d85144d-a15c-4d1b-84a5-b3a379d31798}",
+ "type": "Light",
+ "lastEdited": 1617140731977291,
+ "parentID": "{b9444e0f-1cda-4ad3-80e5-9ef3bf0ec6cd}",
+ "name": "Mirror Light",
+ "locked": true,
+ "position": {
+ "x": 0.08925724029541016,
+ "y": 0.4832591116428375,
+ "z": 0.20032405853271484
+ },
+ "dimensions": {
+ "x": 6.747879505157471,
+ "y": 6.747879505157471,
+ "z": 6.985918998718262
+ },
+ "rotation": {
+ "x": -0.999969482421875,
+ "y": -0.0001373291015625,
+ "z": -0.0000762939453125,
+ "w": 0.00856029987335205
+ },
+ "created": 1614198986203073,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 4.045637607574463,
+ "y": -5.162182331085205,
+ "z": 33.07383346557617,
+ "scale": 11.826699256896973
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "isSpotlight": true,
+ "intensity": 2,
+ "exponent": 1,
+ "cutoff": 75,
+ "falloffRadius": 5.699999809265137,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{89f2cd0b-782f-4e4e-a674-587ae5893f7d}",
+ "type": "Light",
+ "lastEdited": 1617140712801743,
+ "parentID": "{52c84c1c-6567-4670-9b2b-9aa9bc1456ea}",
+ "name": "templeLight",
+ "locked": true,
+ "position": {
+ "x": -0.10364770889282227,
+ "y": 0.5877461433410645,
+ "z": -0.16811557114124298
+ },
+ "dimensions": {
+ "x": 5.481564998626709,
+ "y": 5.481564998626709,
+ "z": 5.481564998626709
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986204117,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 23.39162826538086,
+ "y": -2.135477066040039,
+ "z": 21.969898223876953,
+ "scale": 9.494348526000977
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "color": {
+ "red": 255,
+ "green": 0,
+ "blue": 255
+ },
+ "intensity": 10,
+ "exponent": 1,
+ "cutoff": 75,
+ "falloffRadius": 1,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{3a740728-5d6f-4a3b-a710-49a8c6cb1ae0}",
+ "type": "Zone",
+ "lastEdited": 1617140938876740,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "MainDomeZone",
+ "locked": true,
+ "userData": "{\n \"grabbableKey\": {\n \"grabbable\": false,\n \"ignoreIK\": false\n }\n}",
+ "position": {
+ "x": 0.0006103417836129665,
+ "y": 55.367820739746094,
+ "z": -0.0006103613413870335
+ },
+ "dimensions": {
+ "x": 10000,
+ "y": 10000,
+ "z": 10000
+ },
+ "rotation": {
+ "x": 0.44721001386642456,
+ "y": 0.5232430100440979,
+ "z": 0.06775686889886856,
+ "w": 0.7222389578819275
+ },
+ "created": 1614198986203133,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": -25952.515625,
+ "y": -25921.0625,
+ "z": -25953.87890625,
+ "scale": 51961.5234375
+ },
+ "grab": {
+ "grabbable": false,
+ "grabFollowsController": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "angularVelocity": {
+ "x": 0.008699734695255756,
+ "y": 0.008700265549123287,
+ "z": 8.107145163527285e-12
+ },
+ "angularDamping": 0,
+ "shapeType": "box",
+ "keyLight": {
+ "color": {
+ "red": 158,
+ "green": 127,
+ "blue": 68
+ },
+ "intensity": 1.5,
+ "direction": {
+ "x": 0.20760862529277802,
+ "y": -0.7512804269790649,
+ "z": 0.6264793872833252
+ },
+ "castShadows": true,
+ "shadowBias": 0.20000000298023224,
+ "shadowMaxDistance": 57.79999923706055
+ },
+ "ambientLight": {
+ "ambientIntensity": 0.8999999761581421,
+ "ambientURL": "qrc:///serverless/Textures/galaxySkybox.png"
+ },
+ "skybox": {
+ "color": {
+ "red": 235,
+ "green": 235,
+ "blue": 235
+ },
+ "url": "qrc:///serverless/Textures/galaxySkybox.png"
+ },
+ "haze": {
+ "hazeRange": 50,
+ "hazeColor": {
+ "red": 4,
+ "green": 25,
+ "blue": 94
+ },
+ "hazeGlareColor": {
+ "red": 255,
+ "green": 0,
+ "blue": 255
+ },
+ "hazeEnableGlare": true,
+ "hazeGlareAngle": 27,
+ "hazeAltitudeEffect": true,
+ "hazeCeiling": -75,
+ "hazeBaseRef": -250,
+ "hazeBackgroundBlend": 0.5
+ },
+ "bloom": {
+ "bloomIntensity": 0.4000000059604645,
+ "bloomThreshold": 0.800000011920929,
+ "bloomSize": 1
+ },
+ "keyLightMode": "enabled",
+ "ambientLightMode": "enabled",
+ "skyboxMode": "enabled",
+ "hazeMode": "enabled",
+ "bloomMode": "enabled",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{c5a35dbf-8253-4782-b121-26d0c609aad5}",
+ "type": "Shape",
+ "lastEdited": 1617140925236269,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "MainCollision",
+ "locked": true,
+ "position": {
+ "x": 0.00002288818359375,
+ "y": -6.380376815795898,
+ "z": -0.00002409383887425065
+ },
+ "dimensions": {
+ "x": 54.22285461425781,
+ "y": 0.890187680721283,
+ "z": 54.22285461425781
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986204167,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": -10.101629257202148,
+ "y": -40.391536712646484,
+ "z": -11.458602905273438,
+ "scale": 76.6878662109375
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "color": {
+ "red": 0,
+ "green": 0,
+ "blue": 0
+ },
+ "shape": "Cylinder",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{99f186d7-a623-4339-930e-1689d62a23e0}",
+ "type": "Zone",
+ "lastEdited": 1617134741129783,
+ "parentID": "{b9444e0f-1cda-4ad3-80e5-9ef3bf0ec6cd}",
+ "visible": false,
+ "name": "mirror_zone",
+ "locked": true,
+ "userData": "{\"grabbableKey\":{\"grabbable\":false},\"original\":{\"id\":\"{da1e2fcd-d69b-47d7-b861-25b31f1c7175}\"}}",
+ "position": {
+ "x": -0.01726818084716797,
+ "y": 0.2113490104675293,
+ "z": 1.704751968383789
+ },
+ "dimensions": {
+ "x": 2.8482747077941895,
+ "y": 3.153184413909912,
+ "z": 3.6725244522094727
+ },
+ "rotation": {
+ "x": -0.0161592960357666,
+ "y": 0.0000152587890625,
+ "z": -0.006424069404602051,
+ "w": 0.999847412109375
+ },
+ "created": 1614198986202623,
+ "lastEditedBy": "{0b759026-5fea-494c-99de-ab6301e73d4c}",
+ "queryAACube": {
+ "x": 8.46190071105957,
+ "y": -2.328949451446533,
+ "z": 35.4334716796875,
+ "scale": 5.6162872314453125
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "script": "qrc:///serverless/Scripts/mirrorReflection.js",
+ "scriptTimestamp": 1601084668318,
+ "shapeType": "box",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{33d5305a-641d-4a4f-baa9-23ec22bb9d48}",
+ "type": "Light",
+ "lastEdited": 1617140731977526,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "TreeLight_4",
+ "locked": true,
+ "position": {
+ "x": -8.819656372070312,
+ "y": -0.07544326782226562,
+ "z": -9.190401077270508
+ },
+ "dimensions": {
+ "x": 10.24996280670166,
+ "y": 10.24996280670166,
+ "z": 10.24996280670166
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986202730,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 10.546369552612305,
+ "y": -4.619409561157227,
+ "z": 8.817764282226562,
+ "scale": 17.753456115722656
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "color": {
+ "red": 250,
+ "green": 214,
+ "blue": 32
+ },
+ "intensity": 15,
+ "exponent": 1,
+ "cutoff": 75,
+ "falloffRadius": 26.100000381469727,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{67b2c758-41ea-4448-80eb-f171d792ab5c}",
+ "type": "Box",
+ "lastEdited": 1617140777516274,
+ "visible": false,
+ "name": "LandingPoint",
+ "locked": true,
+ "position": {
+ "x": 21.792818069458008,
+ "y": 0,
+ "z": 25.644922256469727
+ },
+ "dimensions": {
+ "x": 3.2382099628448486,
+ "y": 0.20000000298023224,
+ "z": 1.8551445007324219
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1617140160943861,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 19.924158096313477,
+ "y": -1.8686603307724,
+ "z": 23.776262283325195,
+ "scale": 3.7373206615448
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "color": {
+ "red": 0,
+ "green": 180,
+ "blue": 239
+ },
+ "shape": "Cube",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{a4421b2e-123a-4619-8788-e36eef8029ea}",
+ "type": "Light",
+ "lastEdited": 1617140788480412,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "TreeLight_2",
+ "locked": true,
+ "position": {
+ "x": -8.819664001464844,
+ "y": -0.24757671356201172,
+ "z": 8.97313404083252
+ },
+ "dimensions": {
+ "x": 10.24996280670166,
+ "y": 10.24996280670166,
+ "z": 10.24996280670166
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986202574,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 10.54580307006836,
+ "y": -4.790988445281982,
+ "z": 26.981304168701172,
+ "scale": 17.753456115722656
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "color": {
+ "red": 191,
+ "green": 31,
+ "blue": 255
+ },
+ "intensity": 15,
+ "exponent": 1,
+ "cutoff": 75,
+ "falloffRadius": 26.100000381469727,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{523e1c2d-1603-47bb-80f1-314747b161b0}",
+ "type": "Material",
+ "lastEdited": 1617140991884044,
+ "parentID": "{f3d87e87-a250-42f8-a285-84cbeb777353}",
+ "parentJointIndex": 4,
+ "name": "moveMaterial",
+ "userData": "{\n \"verticalOffset\": 0,\n \"segments\": 64,\n \"updateInterval\": 200\n}",
+ "position": {
+ "x": 0.00000476837158203125,
+ "y": 7.152557373046875e-7,
+ "z": 0.000003814697265625
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000457763671875,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614382837959471,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": -5.742575168609619,
+ "y": -21.97960662841797,
+ "z": 11.547750473022461,
+ "scale": 52.68036651611328
+ },
+ "canCastShadow": false,
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "collisionMask": 23,
+ "collidesWith": "static,dynamic,kinematic,otherAvatar,",
+ "script": "qrc:///serverless/Scripts/materialSequencer.js",
+ "scriptTimestamp": 1601250646975,
+ "materialURL": "materialData",
+ "priority": 3,
+ "parentMaterialName": "[mat::move]",
+ "materialMappingPos": {
+ "x": 0.265625,
+ "y": 0
+ },
+ "materialData": "{\"materialVersion\":1,\"materials\":[{\"name\":\"moveMaterial\",\"model\":\"hifi_pbr\",\"opacity\":0.8,\"albedo\":[1,1,1],\"roughness\":1,\"metallic\":0,\"emissive\":[0,0,0],\"scattering\":0,\"unlit\":false,\"emissiveMap\":\"qrc:///serverless/Textures/gradient1.jpg\",\"albedoMap\":\"qrc:///serverless/Textures/gradient1.jpg\",\"opacityMapMode\":\"OPACITY_MAP_BLEND\",\"cullFaceMode\":\"CULL_NONE\",\"defaultFallthrough\":false}]}",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{35eb5c90-08e6-44de-b6b9-46c9fd36494a}",
+ "type": "Text",
+ "lastEdited": 1617134723640851,
+ "name": "(2)",
+ "locked": true,
+ "description": "mirror text",
+ "position": {
+ "x": 0,
+ "y": 4.090241432189941,
+ "z": 4.291414260864258
+ },
+ "dimensions": {
+ "x": 3.2473599910736084,
+ "y": 0.6462407112121582,
+ "z": 0.009999999776482582
+ },
+ "rotation": {
+ "x": 0.0008392333984375,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 0.999969482421875
+ },
+ "created": 1614453187953099,
+ "lastEditedBy": "{0b759026-5fea-494c-99de-ab6301e73d4c}",
+ "queryAACube": {
+ "x": -1.6555267572402954,
+ "y": 2.4347147941589355,
+ "z": 2.635887622833252,
+ "scale": 3.311053514480591
+ },
+ "billboardMode": "yaw",
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "collisionMask": 23,
+ "collidesWith": "static,dynamic,kinematic,otherAvatar,",
+ "text": "Portal",
+ "lineHeight": 0.6000000238418579,
+ "textColor": {
+ "red": 0,
+ "green": 0,
+ "blue": 0
+ },
+ "backgroundAlpha": 0,
+ "unlit": true,
+ "font": "Inconsolata",
+ "textEffect": "outline fill",
+ "textEffectColor": {
+ "red": 0,
+ "green": 208,
+ "blue": 255
+ },
+ "textEffectThickness": 0.30000001192092896,
+ "alignment": "center",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": true,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{7d040847-617e-494b-9593-05ab35142098}",
+ "type": "Light",
+ "lastEdited": 1617140731977921,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "TreeLight_3",
+ "locked": true,
+ "position": {
+ "x": 9.418960571289062,
+ "y": -0.07544326782226562,
+ "z": -9.190400123596191
+ },
+ "dimensions": {
+ "x": 10.24996280670166,
+ "y": 10.24996280670166,
+ "z": 10.24996280670166
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986202887,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 28.784984588623047,
+ "y": -4.61996603012085,
+ "z": 8.818321228027344,
+ "scale": 17.753456115722656
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "color": {
+ "red": 69,
+ "green": 255,
+ "blue": 69
+ },
+ "intensity": 20.5,
+ "exponent": 1,
+ "cutoff": 75,
+ "falloffRadius": 26.100000381469727,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{c191dc9f-7a8e-4f98-9974-b23c9bb7992d}",
+ "type": "Light",
+ "lastEdited": 1617140788480592,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "TreeLight_1",
+ "locked": true,
+ "position": {
+ "x": 9.000457763671875,
+ "y": -0.2475719451904297,
+ "z": 8.999537467956543
+ },
+ "dimensions": {
+ "x": 10.24996280670166,
+ "y": 10.24996280670166,
+ "z": 10.24996280670166
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986203735,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 28.365924835205078,
+ "y": -4.791526794433594,
+ "z": 27.008251190185547,
+ "scale": 17.753456115722656
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "color": {
+ "red": 69,
+ "green": 106,
+ "blue": 255
+ },
+ "intensity": 17.799999237060547,
+ "exponent": 1,
+ "cutoff": 75,
+ "falloffRadius": 26.100000381469727,
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+},
+ {
+ "id": "{cf666211-2b88-4ee6-af3c-a1a92bd6c513}",
+ "type": "Model",
+ "lastEdited": 1617140858220173,
+ "parentID": "{6c76b816-5064-424c-84b2-dbb478e47d5d}",
+ "name": "Planters",
+ "locked": true,
+ "position": {
+ "x": -0.00016648943710606545,
+ "y": -5.586750030517578,
+ "z": 0.00017049156303983182
+ },
+ "dimensions": {
+ "x": 19.592937469482422,
+ "y": 0.6371747255325317,
+ "z": 19.592937469482422
+ },
+ "rotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "created": 1614198986203890,
+ "lastEditedBy": "{7f097416-1c40-4cba-aa7c-6e20a7281823}",
+ "queryAACube": {
+ "x": 14.384176254272461,
+ "y": -15.1119384765625,
+ "z": 13.02754020690918,
+ "scale": 27.715923309326172
+ },
+ "grab": {
+ "grabbable": false,
+ "equippableLeftRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ },
+ "equippableRightRotation": {
+ "x": -0.0000152587890625,
+ "y": -0.0000152587890625,
+ "z": -0.0000152587890625,
+ "w": 1
+ }
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "shapeType": "static-mesh",
+ "modelURL": "qrc:///serverless/Models/Planter.glb",
+ "blendshapeCoefficients": "{\n}\n",
+ "animation": {
+ "allowTranslation": false
+ },
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+}
+ ],
+ "Id": "{2fef14da-af5c-43f2-855c-b36bfa23d90f}",
+ "Version": 133
+}
diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index 057f32f370..dad22f6b1f 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -1011,7 +1011,7 @@ const bool DEFAULT_HMD_TABLET_BECOMES_TOOLBAR = false;
const bool DEFAULT_PREFER_STYLUS_OVER_LASER = false;
const bool DEFAULT_PREFER_AVATAR_FINGER_OVER_STYLUS = false;
const QString DEFAULT_CURSOR_NAME = "DEFAULT";
-const bool DEFAULT_MINI_TABLET_ENABLED = true;
+const bool DEFAULT_MINI_TABLET_ENABLED = false;
const bool DEFAULT_AWAY_STATE_WHEN_FOCUS_LOST_IN_VR_ENABLED = true;
QSharedPointer getOffscreenUI() {
diff --git a/interface/src/LODManager.cpp b/interface/src/LODManager.cpp
index 4cd5025fc1..1c6ef387f3 100644
--- a/interface/src/LODManager.cpp
+++ b/interface/src/LODManager.cpp
@@ -4,6 +4,7 @@
//
// Created by Clement on 1/16/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
@@ -19,8 +20,12 @@
#include "ui/DialogsManager.h"
#include "InterfaceLogging.h"
-Setting::Handle desktopWorldDetailQuality("desktopWorldDetailQuality", (int)DEFAULT_WORLD_DETAIL_QUALITY);
-Setting::Handle hmdWorldDetailQuality("hmdWorldDetailQuality", (int)DEFAULT_WORLD_DETAIL_QUALITY);
+const QString LOD_SETTINGS_PREFIX { "lodManager/" };
+
+Setting::Handle automaticLODAdjust(LOD_SETTINGS_PREFIX + "automaticLODAdjust", (bool)DEFAULT_LOD_AUTO_ADJUST);
+Setting::Handle lodHalfAngle(LOD_SETTINGS_PREFIX + "lodHalfAngle", (float)getHalfAngleFromVisibilityDistance(DEFAULT_VISIBILITY_DISTANCE_FOR_UNIT_ELEMENT));
+Setting::Handle desktopWorldDetailQuality(LOD_SETTINGS_PREFIX + "desktopWorldDetailQuality", (int)DEFAULT_WORLD_DETAIL_QUALITY);
+Setting::Handle hmdWorldDetailQuality(LOD_SETTINGS_PREFIX + "hmdWorldDetailQuality", (int)DEFAULT_WORLD_DETAIL_QUALITY);
LODManager::LODManager() {
}
@@ -188,12 +193,14 @@ void LODManager::setVisibilityDistance(float distance) {
// Maintain behavior with deprecated _boundaryLevelAdjust property
float userDistance = distance / powf(2.0f, _boundaryLevelAdjust);
_lodHalfAngle = getHalfAngleFromVisibilityDistance(userDistance);
+ saveSettings();
}
void LODManager::setLODAngleDeg(float lodAngle) {
auto newLODAngleDeg = std::max(0.001f, std::min(lodAngle, 90.f));
auto newLODHalfAngle = glm::radians(newLODAngleDeg * 0.5f);
_lodHalfAngle = newLODHalfAngle;
+ saveSettings();
}
void LODManager::setSmoothScale(float t) {
@@ -244,6 +251,7 @@ void LODManager::resetLODAdjust() {
void LODManager::setAutomaticLODAdjust(bool value) {
std::lock_guard { _automaticLODLock };
_automaticLODAdjust = value;
+ saveSettings();
emit autoLODChanged();
}
@@ -330,14 +338,19 @@ void LODManager::loadSettings() {
if (qApp->property(hifi::properties::OCULUS_STORE).toBool() && firstRun.get()) {
hmdQuality = WORLD_DETAIL_HIGH;
}
+
+ _automaticLODAdjust = automaticLODAdjust.get();
+ _lodHalfAngle = lodHalfAngle.get();
setWorldDetailQuality(desktopQuality, false);
setWorldDetailQuality(hmdQuality, true);
}
void LODManager::saveSettings() {
+ automaticLODAdjust.set((bool)_automaticLODAdjust);
desktopWorldDetailQuality.set((int)_desktopWorldDetailQuality);
hmdWorldDetailQuality.set((int)_hmdWorldDetailQuality);
+ lodHalfAngle.set((float)_lodHalfAngle);
}
const float MIN_DECREASE_FPS = 0.5f;
@@ -405,6 +418,7 @@ void LODManager::setWorldDetailQuality(WorldDetailQuality quality, bool isHMDMod
void LODManager::setWorldDetailQuality(WorldDetailQuality quality) {
setWorldDetailQuality(quality, qApp->isHMDMode());
+ saveSettings();
emit worldDetailQualityChanged();
}
diff --git a/interface/src/LODManager.h b/interface/src/LODManager.h
index 16b0529b05..35f80efcda 100644
--- a/interface/src/LODManager.h
+++ b/interface/src/LODManager.h
@@ -4,6 +4,7 @@
//
// Created by Clement on 1/16/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
@@ -44,10 +45,12 @@ enum WorldDetailQuality {
};
Q_DECLARE_METATYPE(WorldDetailQuality);
+const bool DEFAULT_LOD_AUTO_ADJUST = false; // true for auto, false for manual.
+
#ifdef Q_OS_ANDROID
-const float LOD_DEFAULT_QUALITY_LEVEL = 0.2f; // default quality level setting is High (lower framerate)
+const float DEFAULT_LOD_QUALITY_LEVEL = 0.2f; // default quality level setting is High (lower framerate)
#else
-const float LOD_DEFAULT_QUALITY_LEVEL = 0.5f; // default quality level setting is Mid
+const float DEFAULT_LOD_QUALITY_LEVEL = 0.5f; // default quality level setting is Mid
#endif
#ifdef Q_OS_ANDROID
@@ -255,7 +258,6 @@ public:
*/
Q_INVOKABLE float getLODTargetFPS() const;
-
float getPresentTime() const { return _presentTime; }
float getEngineRunTime() const { return _engineRunTime; }
float getBatchTime() const { return _batchTime; }
@@ -351,7 +353,7 @@ private:
void setWorldDetailQuality(WorldDetailQuality quality, bool isHMDMode);
std::mutex _automaticLODLock;
- bool _automaticLODAdjust = true;
+ bool _automaticLODAdjust = DEFAULT_LOD_AUTO_ADJUST;
float _presentTime{ 0.0f }; // msec
float _engineRunTime{ 0.0f }; // msec
@@ -362,7 +364,7 @@ private:
float _smoothScale{ 10.0f }; // smooth is evaluated over 10 times longer than now
float _smoothRenderTime{ 0.0f }; // msec
- float _lodQualityLevel{ LOD_DEFAULT_QUALITY_LEVEL };
+ float _lodQualityLevel{ DEFAULT_LOD_QUALITY_LEVEL };
WorldDetailQuality _desktopWorldDetailQuality { DEFAULT_WORLD_DETAIL_QUALITY };
WorldDetailQuality _hmdWorldDetailQuality { DEFAULT_WORLD_DETAIL_QUALITY };
diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp
index 9589fc26ff..c2f1abdd94 100644
--- a/interface/src/ui/PreferencesDialog.cpp
+++ b/interface/src/ui/PreferencesDialog.cpp
@@ -362,10 +362,10 @@ void setupPreferences() {
auto getter = [myAvatar]()->float { return qApp->getCamera().getSensitivity(); };
auto setter = [myAvatar](float value) { qApp->getCamera().setSensitivity(value); };
auto preference = new SpinnerSliderPreference(VR_MOVEMENT, "Camera Sensitivity", getter, setter);
- preference->setMin(0.01f);
+ preference->setMin(0.1f);
preference->setMax(5.0f);
preference->setStep(0.1f);
- preference->setDecimals(2);
+ preference->setDecimals(1);
preferences->addPreference(preference);
}
{
@@ -385,7 +385,7 @@ void setupPreferences() {
preference->setMin(6.0f);
preference->setMax(30.0f);
preference->setStep(1);
- preference->setDecimals(2);
+ preference->setDecimals(0);
preferences->addPreference(preference);
}
{
@@ -465,8 +465,8 @@ void setupPreferences() {
auto preference = new SpinnerPreference(VR_MOVEMENT, "User real-world height (meters)", getter, setter);
preference->setMin(1.0f);
preference->setMax(2.2f);
- preference->setDecimals(3);
- preference->setStep(0.001f);
+ preference->setDecimals(2);
+ preference->setStep(0.01f);
preferences->addPreference(preference);
}
@@ -478,7 +478,7 @@ void setupPreferences() {
preference->setMin(1.0f);
preference->setMax(360.0f);
preference->setStep(1);
- preference->setDecimals(1);
+ preference->setDecimals(0);
preferences->addPreference(preference);
}
{
@@ -488,7 +488,7 @@ void setupPreferences() {
preference->setMin(1.0f);
preference->setMax(360.0f);
preference->setStep(1);
- preference->setDecimals(1);
+ preference->setDecimals(0);
preferences->addPreference(preference);
}
diff --git a/interface/src/ui/Snapshot.cpp b/interface/src/ui/Snapshot.cpp
index 4882d6e5da..6266e24d40 100644
--- a/interface/src/ui/Snapshot.cpp
+++ b/interface/src/ui/Snapshot.cpp
@@ -47,7 +47,7 @@
const QString FILENAME_PATH_FORMAT = "vircadia-snap-by-%1-on-%2.jpg";
const QString DATETIME_FORMAT = "yyyy-MM-dd_hh-mm-ss";
const QString SNAPSHOTS_DIRECTORY = "Snapshots";
-const QString URL = "highfidelity_url";
+const QString URL = "vircadia_url";
static const int SNAPSHOT_360_TIMER_INTERVAL = 350;
static const QList SUPPORTED_IMAGE_FORMATS = { "jpg", "jpeg", "png" };
diff --git a/libraries/animation/CMakeLists.txt b/libraries/animation/CMakeLists.txt
index 1ab54ed342..d962d9e222 100644
--- a/libraries/animation/CMakeLists.txt
+++ b/libraries/animation/CMakeLists.txt
@@ -1,6 +1,6 @@
set(TARGET_NAME animation)
setup_hifi_library(Network Script)
-link_hifi_libraries(shared graphics fbx)
+link_hifi_libraries(shared graphics model-serializers)
include_hifi_library_headers(networking)
include_hifi_library_headers(gpu)
include_hifi_library_headers(hfm)
diff --git a/libraries/avatars-renderer/CMakeLists.txt b/libraries/avatars-renderer/CMakeLists.txt
index deba2913c1..0175d1113a 100644
--- a/libraries/avatars-renderer/CMakeLists.txt
+++ b/libraries/avatars-renderer/CMakeLists.txt
@@ -4,7 +4,7 @@ link_hifi_libraries(shared shaders gpu graphics animation material-networking mo
include_hifi_library_headers(avatars)
include_hifi_library_headers(networking)
include_hifi_library_headers(hfm)
-include_hifi_library_headers(fbx)
+include_hifi_library_headers(model-serializers)
include_hifi_library_headers(recording)
include_hifi_library_headers(ktx)
include_hifi_library_headers(procedural)
diff --git a/libraries/baking/CMakeLists.txt b/libraries/baking/CMakeLists.txt
index 4350f386ab..12fb192877 100644
--- a/libraries/baking/CMakeLists.txt
+++ b/libraries/baking/CMakeLists.txt
@@ -1,7 +1,7 @@
set(TARGET_NAME baking)
setup_hifi_library(Concurrent)
-link_hifi_libraries(shared shaders graphics networking procedural graphics-scripting ktx image fbx model-baker task)
+link_hifi_libraries(shared shaders graphics networking procedural graphics-scripting ktx image model-serializers model-baker task)
include_hifi_library_headers(gpu)
include_hifi_library_headers(hfm)
-include_hifi_library_headers(material-networking)
\ No newline at end of file
+include_hifi_library_headers(material-networking)
diff --git a/libraries/display-plugins/CMakeLists.txt b/libraries/display-plugins/CMakeLists.txt
index cdc6263025..07b70c310f 100644
--- a/libraries/display-plugins/CMakeLists.txt
+++ b/libraries/display-plugins/CMakeLists.txt
@@ -7,7 +7,7 @@ include_hifi_library_headers(model-networking)
include_hifi_library_headers(networking)
include_hifi_library_headers(graphics)
include_hifi_library_headers(hfm)
-include_hifi_library_headers(fbx)
+include_hifi_library_headers(model-serializers)
include_hifi_library_headers(image)
include_hifi_library_headers(ktx)
include_hifi_library_headers(render)
diff --git a/libraries/entities-renderer/CMakeLists.txt b/libraries/entities-renderer/CMakeLists.txt
index e1896cf674..5f40c8d5fe 100644
--- a/libraries/entities-renderer/CMakeLists.txt
+++ b/libraries/entities-renderer/CMakeLists.txt
@@ -9,7 +9,7 @@ include_hifi_library_headers(audio)
include_hifi_library_headers(physics)
include_hifi_library_headers(animation)
include_hifi_library_headers(hfm)
-include_hifi_library_headers(fbx)
+include_hifi_library_headers(model-serializers)
include_hifi_library_headers(entities)
include_hifi_library_headers(avatars)
include_hifi_library_headers(controllers)
diff --git a/libraries/entities/CMakeLists.txt b/libraries/entities/CMakeLists.txt
index 3157a6552b..bddd4b5e67 100644
--- a/libraries/entities/CMakeLists.txt
+++ b/libraries/entities/CMakeLists.txt
@@ -1,8 +1,8 @@
set(TARGET_NAME entities)
setup_hifi_library(Network Script)
-target_include_directories(${TARGET_NAME} PRIVATE "${OPENSSL_INCLUDE_DIR}")
+target_include_directories(${TARGET_NAME} PRIVATE "${OPENSSL_INCLUDE_DIR}")
include_hifi_library_headers(hfm)
-include_hifi_library_headers(fbx)
+include_hifi_library_headers(model-serializers)
include_hifi_library_headers(gpu)
include_hifi_library_headers(image)
include_hifi_library_headers(ktx)
diff --git a/libraries/gpu-gl/CMakeLists.txt b/libraries/gpu-gl/CMakeLists.txt
index 01f097df87..de651e5116 100644
--- a/libraries/gpu-gl/CMakeLists.txt
+++ b/libraries/gpu-gl/CMakeLists.txt
@@ -1,9 +1,9 @@
set(TARGET_NAME gpu-gl)
setup_hifi_library(Concurrent)
link_hifi_libraries(shared gl gpu gpu-gl-common shaders)
-if (UNIX)
+if (UNIX AND NOT VIRCADIA_THREAD_DEBUGGING)
target_link_libraries(${TARGET_NAME} pthread)
-endif(UNIX)
+endif(UNIX AND NOT VIRCADIA_THREAD_DEBUGGING)
GroupSources("src")
set(OpenGL_GL_PREFERENCE "LEGACY")
diff --git a/libraries/graphics-scripting/CMakeLists.txt b/libraries/graphics-scripting/CMakeLists.txt
index 9bb34adda1..3542704fc8 100644
--- a/libraries/graphics-scripting/CMakeLists.txt
+++ b/libraries/graphics-scripting/CMakeLists.txt
@@ -1,4 +1,4 @@
set(TARGET_NAME graphics-scripting)
setup_hifi_library()
-link_hifi_libraries(shared networking graphics fbx image material-networking model-networking script-engine)
+link_hifi_libraries(shared networking graphics model-serializers image material-networking model-networking script-engine)
include_hifi_library_headers(gpu)
diff --git a/libraries/model-networking/CMakeLists.txt b/libraries/model-networking/CMakeLists.txt
index b71d125586..9a7ce47b8e 100644
--- a/libraries/model-networking/CMakeLists.txt
+++ b/libraries/model-networking/CMakeLists.txt
@@ -1,9 +1,9 @@
set(TARGET_NAME model-networking)
setup_hifi_library()
-link_hifi_libraries(shared shaders networking graphics fbx procedural model-baker)
+link_hifi_libraries(shared shaders networking graphics model-serializers procedural model-baker)
include_hifi_library_headers(hfm)
include_hifi_library_headers(task)
include_hifi_library_headers(gpu)
include_hifi_library_headers(image)
include_hifi_library_headers(ktx)
-include_hifi_library_headers(material-networking)
\ No newline at end of file
+include_hifi_library_headers(material-networking)
diff --git a/libraries/fbx/CMakeLists.txt b/libraries/model-serializers/CMakeLists.txt
similarity index 79%
rename from libraries/fbx/CMakeLists.txt
rename to libraries/model-serializers/CMakeLists.txt
index 2006d23c60..76775896dc 100644
--- a/libraries/fbx/CMakeLists.txt
+++ b/libraries/model-serializers/CMakeLists.txt
@@ -1,4 +1,4 @@
-set(TARGET_NAME fbx)
+set(TARGET_NAME model-serializers)
setup_hifi_library()
link_hifi_libraries(shared graphics networking image hfm)
diff --git a/libraries/fbx/src/FBX.h b/libraries/model-serializers/src/FBX.h
similarity index 97%
rename from libraries/fbx/src/FBX.h
rename to libraries/model-serializers/src/FBX.h
index 362ae93e99..3c4234e14b 100644
--- a/libraries/fbx/src/FBX.h
+++ b/libraries/model-serializers/src/FBX.h
@@ -1,6 +1,6 @@
//
// FBX.h
-// libraries/fbx/src
+// libraries/model-serializers/src
//
// Created by Ryan Huffman on 9/5/17.
// Copyright 2017 High Fidelity, Inc.
diff --git a/libraries/fbx/src/FBXSerializer.cpp b/libraries/model-serializers/src/FBXSerializer.cpp
similarity index 99%
rename from libraries/fbx/src/FBXSerializer.cpp
rename to libraries/model-serializers/src/FBXSerializer.cpp
index 9c700be607..a18e305a80 100644
--- a/libraries/fbx/src/FBXSerializer.cpp
+++ b/libraries/model-serializers/src/FBXSerializer.cpp
@@ -1,6 +1,6 @@
//
// FBXSerializer.cpp
-// libraries/fbx/src
+// libraries/model-serializers/src
//
// Created by Andrzej Kapolka on 9/18/13.
// Copyright 2013 High Fidelity, Inc.
@@ -404,7 +404,7 @@ HFMModel* FBXSerializer::extractHFMModel(const hifi::VariantHash& mapping, const
QVector blendshapes;
QHash fbxModels;
- QHash clusters;
+ QHash clusters;
QHash animationCurves;
QHash typeFlags;
@@ -1236,7 +1236,7 @@ HFMModel* FBXSerializer::extractHFMModel(const hifi::VariantHash& mapping, const
// models with clusters must be parented to the cluster top
// Unless the model is a root node.
bool isARootNode = !modelIDs.contains(_connectionParentMap.value(fbxModel.key()));
- if (!isARootNode) {
+ if (!isARootNode) {
foreach(const QString& deformerID, _connectionChildMap.values(fbxModel.key())) {
foreach(const QString& clusterID, _connectionChildMap.values(deformerID)) {
if (!clusters.contains(clusterID)) {
diff --git a/libraries/fbx/src/FBXSerializer.h b/libraries/model-serializers/src/FBXSerializer.h
similarity index 99%
rename from libraries/fbx/src/FBXSerializer.h
rename to libraries/model-serializers/src/FBXSerializer.h
index 7d41f98444..e528885754 100644
--- a/libraries/fbx/src/FBXSerializer.h
+++ b/libraries/model-serializers/src/FBXSerializer.h
@@ -1,6 +1,6 @@
//
// FBXSerializer.h
-// libraries/fbx/src
+// libraries/model-serializers/src
//
// Created by Andrzej Kapolka on 9/18/13.
// Copyright 2013 High Fidelity, Inc.
@@ -69,7 +69,7 @@ public:
useMaterial(true),
isDefault(true)
{}
-
+
TextureParam(const TextureParam& src) :
cropping(src.cropping),
UVSet(src.UVSet),
@@ -81,7 +81,7 @@ public:
useMaterial(src.useMaterial),
isDefault(src.isDefault)
{}
-
+
};
class MaterialParam {
diff --git a/libraries/fbx/src/FBXSerializer_Material.cpp b/libraries/model-serializers/src/FBXSerializer_Material.cpp
similarity index 99%
rename from libraries/fbx/src/FBXSerializer_Material.cpp
rename to libraries/model-serializers/src/FBXSerializer_Material.cpp
index 8b170eba1b..81f9ca45e3 100644
--- a/libraries/fbx/src/FBXSerializer_Material.cpp
+++ b/libraries/model-serializers/src/FBXSerializer_Material.cpp
@@ -1,6 +1,6 @@
//
// FBXSerializer_Material.cpp
-// interface/src/fbx
+// libraries/model-serializers/src
//
// Created by Sam Gateau on 8/27/2015.
// Copyright 2015 High Fidelity, Inc.
diff --git a/libraries/fbx/src/FBXSerializer_Mesh.cpp b/libraries/model-serializers/src/FBXSerializer_Mesh.cpp
similarity index 99%
rename from libraries/fbx/src/FBXSerializer_Mesh.cpp
rename to libraries/model-serializers/src/FBXSerializer_Mesh.cpp
index f74a960dc8..8d270d8320 100644
--- a/libraries/fbx/src/FBXSerializer_Mesh.cpp
+++ b/libraries/model-serializers/src/FBXSerializer_Mesh.cpp
@@ -1,6 +1,6 @@
//
// FBXSerializer_Mesh.cpp
-// interface/src/fbx
+// libraries/model-serializers/src
//
// Created by Sam Gateau on 8/27/2015.
// Copyright 2015 High Fidelity, Inc.
@@ -106,7 +106,7 @@ void appendIndex(MeshData& data, QVector& indices, int index, bool deduplic
}
Vertex vertex;
vertex.originalIndex = vertexIndex;
-
+
glm::vec3 position;
if (vertexIndex < data.vertices.size()) {
position = data.vertices.at(vertexIndex);
@@ -114,7 +114,7 @@ void appendIndex(MeshData& data, QVector& indices, int index, bool deduplic
glm::vec3 normal;
int normalIndex = data.normalsByVertex ? vertexIndex : index;
- if (data.normalIndices.isEmpty()) {
+ if (data.normalIndices.isEmpty()) {
if (normalIndex < data.normals.size()) {
normal = data.normals.at(normalIndex);
}
@@ -130,7 +130,7 @@ void appendIndex(MeshData& data, QVector& indices, int index, bool deduplic
bool hasColors = (data.colors.size() > 0);
if (hasColors) {
int colorIndex = data.colorsByVertex ? vertexIndex : index;
- if (data.colorIndices.isEmpty()) {
+ if (data.colorIndices.isEmpty()) {
if (colorIndex < data.colors.size()) {
color = data.colors.at(colorIndex);
}
@@ -152,7 +152,7 @@ void appendIndex(MeshData& data, QVector& indices, int index, bool deduplic
vertex.texCoord = data.texCoords.at(texCoordIndex);
}
}
-
+
bool hasMoreTexcoords = (data.attributes.size() > 1);
if (hasMoreTexcoords) {
if (data.attributes[1].texCoordIndices.empty()) {
@@ -222,7 +222,7 @@ ExtractedMesh FBXSerializer::extractMesh(const FBXNode& object, unsigned int& me
} else if (subdata.name == "MappingInformationType" && subdata.properties.at(0) == BY_VERTICE) {
data.normalsByVertex = true;
-
+
} else if (subdata.name == "ReferenceInformationType" && subdata.properties.at(0) == INDEX_TO_DIRECT) {
indexToDirect = true;
}
@@ -242,7 +242,7 @@ ExtractedMesh FBXSerializer::extractMesh(const FBXNode& object, unsigned int& me
} else if (subdata.name == "MappingInformationType" && subdata.properties.at(0) == BY_VERTICE) {
data.colorsByVertex = true;
-
+
} else if (subdata.name == "ReferenceInformationType" && subdata.properties.at(0) == INDEX_TO_DIRECT) {
indexToDirect = true;
}
@@ -264,7 +264,7 @@ ExtractedMesh FBXSerializer::extractMesh(const FBXNode& object, unsigned int& me
qCDebug(modelformat) << "LayerElementColor has an average value of 0.0f... let's forget it.";
}
#endif
-
+
} else if (child.name == "LayerElementUV") {
if (child.properties.at(0).toInt() == 0) {
AttributeData attrib;
@@ -278,7 +278,7 @@ ExtractedMesh FBXSerializer::extractMesh(const FBXNode& object, unsigned int& me
attrib.texCoordIndices = getIntVector(subdata);
} else if (subdata.name == "Name") {
attrib.name = subdata.properties.at(0).toString();
- }
+ }
#if defined(DEBUG_FBXSERIALIZER)
else {
int unknown = 0;
@@ -579,6 +579,6 @@ ExtractedMesh FBXSerializer::extractMesh(const FBXNode& object, unsigned int& me
}
}
}
-
+
return data.extracted;
}
diff --git a/libraries/fbx/src/FBXSerializer_Node.cpp b/libraries/model-serializers/src/FBXSerializer_Node.cpp
similarity index 99%
rename from libraries/fbx/src/FBXSerializer_Node.cpp
rename to libraries/model-serializers/src/FBXSerializer_Node.cpp
index a2772d02d7..f662f10c1a 100644
--- a/libraries/fbx/src/FBXSerializer_Node.cpp
+++ b/libraries/model-serializers/src/FBXSerializer_Node.cpp
@@ -1,6 +1,6 @@
//
// FBXSerializer_Node.cpp
-// interface/src/fbx
+// libraries/model-serializers/src
//
// Created by Sam Gateau on 8/27/2015.
// Copyright 2015 High Fidelity, Inc.
@@ -183,7 +183,7 @@ FBXNode parseBinaryFBXNode(QDataStream& in, int& position, bool has64BitPosition
// FBX 2016 and beyond uses 64bit positions in the node headers, pre-2016 used 32bit values
// our code generally doesn't care about the size that much, so we will use 64bit values
- // from here on out, but if the file is an older format we read the stream into temp 32bit
+ // from here on out, but if the file is an older format we read the stream into temp 32bit
// values and then assign to our actual 64bit values.
if (has64BitPositions) {
in >> endOffset;
@@ -335,8 +335,8 @@ FBXNode parseTextFBXNode(Tokenizer& tokenizer) {
if ((token = tokenizer.nextToken()) == ':') {
tokenizer.ungetChar(':');
tokenizer.pushBackToken(Tokenizer::DATUM_TOKEN);
- return node;
-
+ return node;
+
} else {
tokenizer.pushBackToken(token);
node.properties.append(datum);
diff --git a/libraries/fbx/src/FBXToJSON.cpp b/libraries/model-serializers/src/FBXToJSON.cpp
similarity index 98%
rename from libraries/fbx/src/FBXToJSON.cpp
rename to libraries/model-serializers/src/FBXToJSON.cpp
index 195b7f5f90..f7431e1f61 100644
--- a/libraries/fbx/src/FBXToJSON.cpp
+++ b/libraries/model-serializers/src/FBXToJSON.cpp
@@ -1,6 +1,6 @@
//
// FBXToJSON.cpp
-// libraries/fbx/src
+// libraries/model-serializers/src
//
// Created by Simon Walton on 5/4/2018.
// Copyright 2018 High Fidelity, Inc.
@@ -61,7 +61,7 @@ FBXToJSON& FBXToJSON::operator<<(const FBXNode& fbxNode) {
case QMetaType::QByteArray:
*this << '"' << stringEscape(prop.toByteArray().toStdString()) << '"';
break;
-
+
default:
if (prop.canConvert>()) {
*this << prop.value>();
@@ -95,7 +95,7 @@ FBXToJSON& FBXToJSON::operator<<(const FBXNode& fbxNode) {
string FBXToJSON::stringEscape(const string& in) {
string out;
out.reserve(in.length());
-
+
for (unsigned char inChar: in) {
if (inChar == '"') {
out.append(R"(\")");
diff --git a/libraries/fbx/src/FBXToJSON.h b/libraries/model-serializers/src/FBXToJSON.h
similarity index 95%
rename from libraries/fbx/src/FBXToJSON.h
rename to libraries/model-serializers/src/FBXToJSON.h
index e6b8efe51d..f36235abca 100644
--- a/libraries/fbx/src/FBXToJSON.h
+++ b/libraries/model-serializers/src/FBXToJSON.h
@@ -1,6 +1,6 @@
//
// FBXToJSON.h
-// libraries/fbx/src
+// libraries/model-serializers/src
//
// Created by Simon Walton on 5/4/2018.
// Copyright 2018 High Fidelity, Inc.
diff --git a/libraries/fbx/src/FBXWriter.cpp b/libraries/model-serializers/src/FBXWriter.cpp
similarity index 99%
rename from libraries/fbx/src/FBXWriter.cpp
rename to libraries/model-serializers/src/FBXWriter.cpp
index 4504898e32..efc94461aa 100644
--- a/libraries/fbx/src/FBXWriter.cpp
+++ b/libraries/model-serializers/src/FBXWriter.cpp
@@ -1,6 +1,6 @@
//
// FBXWriter.cpp
-// libraries/fbx/src
+// libraries/model-serializers/src
//
// Created by Ryan Huffman on 9/5/17.
// Copyright 2017 High Fidelity, Inc.
diff --git a/libraries/fbx/src/FBXWriter.h b/libraries/model-serializers/src/FBXWriter.h
similarity index 94%
rename from libraries/fbx/src/FBXWriter.h
rename to libraries/model-serializers/src/FBXWriter.h
index f20d208cb1..f7f4e647c6 100644
--- a/libraries/fbx/src/FBXWriter.h
+++ b/libraries/model-serializers/src/FBXWriter.h
@@ -1,6 +1,6 @@
//
// FBXWriter.h
-// libraries/fbx/src
+// libraries/model-serializers/src
//
// Created by Ryan Huffman on 9/5/17.
// Copyright 2017 High Fidelity, Inc.
diff --git a/libraries/fbx/src/FST.cpp b/libraries/model-serializers/src/FST.cpp
similarity index 100%
rename from libraries/fbx/src/FST.cpp
rename to libraries/model-serializers/src/FST.cpp
diff --git a/libraries/fbx/src/FST.h b/libraries/model-serializers/src/FST.h
similarity index 100%
rename from libraries/fbx/src/FST.h
rename to libraries/model-serializers/src/FST.h
diff --git a/libraries/fbx/src/FSTReader.cpp b/libraries/model-serializers/src/FSTReader.cpp
similarity index 100%
rename from libraries/fbx/src/FSTReader.cpp
rename to libraries/model-serializers/src/FSTReader.cpp
diff --git a/libraries/fbx/src/FSTReader.h b/libraries/model-serializers/src/FSTReader.h
similarity index 100%
rename from libraries/fbx/src/FSTReader.h
rename to libraries/model-serializers/src/FSTReader.h
diff --git a/libraries/fbx/src/GLTFSerializer.cpp b/libraries/model-serializers/src/GLTFSerializer.cpp
similarity index 97%
rename from libraries/fbx/src/GLTFSerializer.cpp
rename to libraries/model-serializers/src/GLTFSerializer.cpp
index 0916316ec1..9b0145c112 100755
--- a/libraries/fbx/src/GLTFSerializer.cpp
+++ b/libraries/model-serializers/src/GLTFSerializer.cpp
@@ -1,6 +1,6 @@
//
// GLTFSerializer.cpp
-// libraries/fbx/src
+// libraries/model-serializers/src
//
// Created by Luis Cuenca on 8/30/17.
// Copyright 2017 High Fidelity, Inc.
@@ -148,7 +148,7 @@ bool GLTFSerializer::getObjectArrayVal(const QJsonObject& object, const QString&
}
hifi::ByteArray GLTFSerializer::setGLBChunks(const hifi::ByteArray& data) {
- int byte = 4;
+ int byte = 4;
int jsonStart = data.indexOf("JSON", Qt::CaseSensitive);
int binStart = data.indexOf("BIN", Qt::CaseSensitive);
int jsonLength, binLength;
@@ -271,7 +271,7 @@ bool GLTFSerializer::setAsset(const QJsonObject& object) {
QJsonObject jsAsset;
bool isAssetDefined = getObjectVal(object, "asset", jsAsset, _file.defined);
if (isAssetDefined) {
- if (!getStringVal(jsAsset, "version", _file.asset.version,
+ if (!getStringVal(jsAsset, "version", _file.asset.version,
_file.asset.defined) || _file.asset.version != "2.0") {
return false;
}
@@ -318,7 +318,7 @@ GLTFAccessor::GLTFAccessorSparse GLTFSerializer::createAccessorSparse(const QJso
bool GLTFSerializer::addAccessor(const QJsonObject& object) {
GLTFAccessor accessor;
-
+
getIntVal(object, "bufferView", accessor.bufferView, accessor.defined);
getIntVal(object, "byteOffset", accessor.byteOffset, accessor.defined);
getIntVal(object, "componentType", accessor.componentType, accessor.defined);
@@ -344,7 +344,7 @@ bool GLTFSerializer::addAccessor(const QJsonObject& object) {
bool GLTFSerializer::addAnimation(const QJsonObject& object) {
GLTFAnimation animation;
-
+
QJsonArray channels;
if (getObjectArrayVal(object, "channels", channels, animation.defined)) {
foreach(const QJsonValue & v, channels) {
@@ -355,7 +355,7 @@ bool GLTFSerializer::addAnimation(const QJsonObject& object) {
if (getObjectVal(v.toObject(), "target", jsChannel, channel.defined)) {
getIntVal(jsChannel, "node", channel.target.node, channel.target.defined);
getIntVal(jsChannel, "path", channel.target.path, channel.target.defined);
- }
+ }
}
}
}
@@ -374,7 +374,7 @@ bool GLTFSerializer::addAnimation(const QJsonObject& object) {
}
}
}
-
+
_file.animations.push_back(animation);
return true;
@@ -382,20 +382,20 @@ bool GLTFSerializer::addAnimation(const QJsonObject& object) {
bool GLTFSerializer::addBufferView(const QJsonObject& object) {
GLTFBufferView bufferview;
-
+
getIntVal(object, "buffer", bufferview.buffer, bufferview.defined);
getIntVal(object, "byteLength", bufferview.byteLength, bufferview.defined);
getIntVal(object, "byteOffset", bufferview.byteOffset, bufferview.defined);
getIntVal(object, "target", bufferview.target, bufferview.defined);
-
+
_file.bufferviews.push_back(bufferview);
-
+
return true;
}
bool GLTFSerializer::addBuffer(const QJsonObject& object) {
GLTFBuffer buffer;
-
+
getIntVal(object, "byteLength", buffer.byteLength, buffer.defined);
if (_url.path().endsWith("glb")) {
@@ -411,13 +411,13 @@ bool GLTFSerializer::addBuffer(const QJsonObject& object) {
}
}
_file.buffers.push_back(buffer);
-
+
return true;
}
bool GLTFSerializer::addCamera(const QJsonObject& object) {
GLTFCamera camera;
-
+
QJsonObject jsPerspective;
QJsonObject jsOrthographic;
QString type;
@@ -437,15 +437,15 @@ bool GLTFSerializer::addCamera(const QJsonObject& object) {
} else if (getStringVal(object, "type", type, camera.defined)) {
camera.type = getCameraType(type);
}
-
+
_file.cameras.push_back(camera);
-
+
return true;
}
bool GLTFSerializer::addImage(const QJsonObject& object) {
GLTFImage image;
-
+
QString mime;
getStringVal(object, "uri", image.uri, image.defined);
if (image.uri.contains("data:image/png;base64,")) {
@@ -455,9 +455,9 @@ bool GLTFSerializer::addImage(const QJsonObject& object) {
}
if (getStringVal(object, "mimeType", mime, image.defined)) {
image.mimeType = getImageMimeType(mime);
- }
+ }
getIntVal(object, "bufferView", image.bufferView, image.defined);
-
+
_file.images.push_back(image);
return true;
@@ -489,20 +489,20 @@ bool GLTFSerializer::addMaterial(const QJsonObject& object) {
getDoubleVal(object, "alphaCutoff", material.alphaCutoff, material.defined);
QJsonObject jsMetallicRoughness;
if (getObjectVal(object, "pbrMetallicRoughness", jsMetallicRoughness, material.defined)) {
- getDoubleArrayVal(jsMetallicRoughness, "baseColorFactor",
- material.pbrMetallicRoughness.baseColorFactor,
+ getDoubleArrayVal(jsMetallicRoughness, "baseColorFactor",
+ material.pbrMetallicRoughness.baseColorFactor,
material.pbrMetallicRoughness.defined);
- getIndexFromObject(jsMetallicRoughness, "baseColorTexture",
- material.pbrMetallicRoughness.baseColorTexture,
+ getIndexFromObject(jsMetallicRoughness, "baseColorTexture",
+ material.pbrMetallicRoughness.baseColorTexture,
material.pbrMetallicRoughness.defined);
- getDoubleVal(jsMetallicRoughness, "metallicFactor",
- material.pbrMetallicRoughness.metallicFactor,
+ getDoubleVal(jsMetallicRoughness, "metallicFactor",
+ material.pbrMetallicRoughness.metallicFactor,
material.pbrMetallicRoughness.defined);
- getDoubleVal(jsMetallicRoughness, "roughnessFactor",
- material.pbrMetallicRoughness.roughnessFactor,
+ getDoubleVal(jsMetallicRoughness, "roughnessFactor",
+ material.pbrMetallicRoughness.roughnessFactor,
material.pbrMetallicRoughness.defined);
- getIndexFromObject(jsMetallicRoughness, "metallicRoughnessTexture",
- material.pbrMetallicRoughness.metallicRoughnessTexture,
+ getIndexFromObject(jsMetallicRoughness, "metallicRoughnessTexture",
+ material.pbrMetallicRoughness.metallicRoughnessTexture,
material.pbrMetallicRoughness.defined);
}
_file.materials.push_back(material);
@@ -524,7 +524,7 @@ bool GLTFSerializer::addMesh(const QJsonObject& object) {
getIntVal(jsPrimitive, "mode", primitive.mode, primitive.defined);
getIntVal(jsPrimitive, "indices", primitive.indices, primitive.defined);
getIntVal(jsPrimitive, "material", primitive.material, primitive.defined);
-
+
QJsonObject jsAttributes;
if (getObjectVal(jsPrimitive, "attributes", jsAttributes, primitive.defined)) {
QStringList attrKeys = jsAttributes.keys();
@@ -550,7 +550,7 @@ bool GLTFSerializer::addMesh(const QJsonObject& object) {
primitive.targets.push_back(target);
}
}
- }
+ }
mesh.primitives.push_back(primitive);
}
}
@@ -561,8 +561,8 @@ bool GLTFSerializer::addMesh(const QJsonObject& object) {
if (getObjectVal(object, "extras", jsExtras, mesh.defined)) {
QJsonArray jsTargetNames;
if (getObjectArrayVal(jsExtras, "targetNames", jsTargetNames, extras.defined)) {
- foreach (const QJsonValue& tarName, jsTargetNames) {
- extras.targetNames.push_back(tarName.toString());
+ foreach (const QJsonValue& tarName, jsTargetNames) {
+ extras.targetNames.push_back(tarName.toString());
}
}
mesh.extras = extras;
@@ -575,7 +575,7 @@ bool GLTFSerializer::addMesh(const QJsonObject& object) {
bool GLTFSerializer::addNode(const QJsonObject& object) {
GLTFNode node;
-
+
getStringVal(object, "name", node.name, node.defined);
getIntVal(object, "camera", node.camera, node.defined);
getIntVal(object, "mesh", node.mesh, node.defined);
@@ -630,10 +630,10 @@ bool GLTFSerializer::addSkin(const QJsonObject& object) {
}
bool GLTFSerializer::addTexture(const QJsonObject& object) {
- GLTFTexture texture;
+ GLTFTexture texture;
getIntVal(object, "sampler", texture.sampler, texture.defined);
getIntVal(object, "source", texture.source, texture.defined);
-
+
_file.textures.push_back(texture);
return true;
@@ -646,8 +646,8 @@ bool GLTFSerializer::parseGLTF(const hifi::ByteArray& data) {
if (_url.path().endsWith("glb") && data.indexOf("glTF") == 0 && data.contains("JSON")) {
jsonChunk = setGLBChunks(data);
- }
-
+ }
+
QJsonDocument d = QJsonDocument::fromJson(jsonChunk);
QJsonObject jsFile = d.object();
@@ -769,7 +769,7 @@ bool GLTFSerializer::parseGLTF(const hifi::ByteArray& data) {
}
}
}
- }
+ }
return success;
}
@@ -789,13 +789,13 @@ glm::mat4 GLTFSerializer::getModelTransform(const GLTFNode& node) {
s = glm::scale(s, scale);
tmat = s * tmat;
}
-
+
if (node.defined["rotation"] && node.rotation.size() == 4) {
//quat(x,y,z,w) to quat(w,x,y,z)
glm::quat rotquat = glm::quat(node.rotation[3], node.rotation[0], node.rotation[1], node.rotation[2]);
tmat = glm::mat4_cast(rotquat) * tmat;
}
-
+
if (node.defined["translation"] && node.translation.size() == 3) {
glm::vec3 trans = glm::vec3(node.translation[0], node.translation[1], node.translation[2]);
glm::mat4 t = glm::mat4(1.0);
@@ -842,7 +842,7 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash&
sortedNodes.push_back(nodecount);
++nodecount;
}
-
+
// Build transforms
nodecount = 0;
@@ -965,8 +965,8 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash&
std::vector& value = inverseBindValues[s];
int matrixCount = 16 * matrixIndex;
jointInverseBindTransforms[jointIndex] =
- glm::mat4(value[matrixCount], value[matrixCount + 1], value[matrixCount + 2], value[matrixCount + 3],
- value[matrixCount + 4], value[matrixCount + 5], value[matrixCount + 6], value[matrixCount + 7],
+ glm::mat4(value[matrixCount], value[matrixCount + 1], value[matrixCount + 2], value[matrixCount + 3],
+ value[matrixCount + 4], value[matrixCount + 5], value[matrixCount + 6], value[matrixCount + 7],
value[matrixCount + 8], value[matrixCount + 9], value[matrixCount + 10], value[matrixCount + 11],
value[matrixCount + 12], value[matrixCount + 13], value[matrixCount + 14], value[matrixCount + 15]);
} else {
@@ -1008,7 +1008,7 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash&
setHFMMaterial(hfmMaterial, _file.materials[i]);
}
-
+
// Build meshes
nodecount = 0;
hfmModel.meshExtents.reset();
@@ -1061,7 +1061,7 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash&
qWarning(modelformat) << "Indices accessor index is out of bounds for model " << _url;
continue;
}
-
+
GLTFAccessor& indicesAccessor = _file.accessors[indicesAccessorIdx];
// Buffers
@@ -1404,7 +1404,7 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash&
if (colors.size() == partVerticesCount * colorStride) {
for (int n = 0; n < colors.size(); n += colorStride) {
- mesh.colors.push_back(glm::vec3(colors[n], colors[n + 1], colors[n + 2]));
+ mesh.colors.push_back(ColorUtils::tosRGBVec3(glm::vec3(colors[n], colors[n + 1], colors[n + 2])));
}
} else {
if (meshAttributes.contains("COLOR_0")) {
@@ -1550,7 +1550,6 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash&
typedef QPair WeightedIndex;
hifi::VariantHash blendshapeMappings = mapping.value("bs").toHash();
QMultiHash blendshapeIndices;
-
for (int i = 0;; ++i) {
auto blendshapeName = QString(BLENDSHAPE_NAMES[i]);
if (blendshapeName.isEmpty()) {
@@ -1561,7 +1560,7 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash&
// Use blendshape from mapping.
foreach(const QVariant& mapping, mappings) {
auto blendshapeMapping = mapping.toList();
- blendshapeIndices.insert(blendshapeMapping.at(0).toString(),
+ blendshapeIndices.insert(blendshapeMapping.at(0).toString(),
WeightedIndex(i, blendshapeMapping.at(1).toFloat()));
}
} else {
@@ -1572,6 +1571,32 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash&
}
}
+ // If an FST isn't being used and the model is likely from ReadyPlayerMe, add blendshape synonyms.
+ auto fileTargetNames = _file.meshes[node.mesh].extras.targetNames;
+ bool likelyReadyPlayerMeFile =
+ fileTargetNames.contains("browOuterUpLeft")
+ && fileTargetNames.contains("browInnerUp")
+ && fileTargetNames.contains("browDownLeft")
+ && fileTargetNames.contains("eyeBlinkLeft")
+ && fileTargetNames.contains("eyeWideLeft")
+ && fileTargetNames.contains("mouthLeft")
+ && fileTargetNames.contains("viseme_O")
+ && fileTargetNames.contains("mouthShrugLower");
+ if (blendshapeMappings.count() == 0 && likelyReadyPlayerMeFile) {
+ QHash>::const_iterator synonym
+ = READYPLAYERME_BLENDSHAPES_MAP.constBegin();
+ while (synonym != READYPLAYERME_BLENDSHAPES_MAP.constEnd()) {
+ if (fileTargetNames.contains(synonym.key())) {
+ auto blendshape = BLENDSHAPE_LOOKUP_MAP.find(synonym.value().first);
+ if (blendshape != BLENDSHAPE_LOOKUP_MAP.end()) {
+ blendshapeIndices.insert(synonym.key(),
+ WeightedIndex(blendshape.value(), synonym.value().second));
+ }
+ }
+ ++synonym;
+ }
+ }
+
// Create blendshapes.
if (!blendshapeIndices.isEmpty()) {
mesh.blendshapes.resize((int)Blendshapes::BlendshapeCount);
@@ -1627,7 +1652,7 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::VariantHash&
glm::vec3 transformedVertex = glm::vec3(globalTransforms[nodeIndex] * glm::vec4(vertex, 1.0f));
mesh.meshExtents.addPoint(transformedVertex);
hfmModel.meshExtents.addPoint(transformedVertex);
- }
+ }
}
// Mesh extents must be at least a minimum size, in particular for blendshapes to work on planar meshes.
@@ -1664,7 +1689,7 @@ std::unique_ptr GLTFSerializer::getFactory() const {
HFMModel::Pointer GLTFSerializer::read(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url) {
_url = url;
-
+
// Normalize url for local files
hifi::URL normalizeUrl = DependencyManager::get()->normalizeURL(_url);
if (normalizeUrl.scheme().isEmpty() || (normalizeUrl.scheme() == "file")) {
@@ -1699,7 +1724,7 @@ bool GLTFSerializer::readBinary(const QString& url, hifi::ByteArray& outdata) {
hifi::URL binaryUrl = _url.resolved(url);
std::tie(success, outdata) = requestData(binaryUrl);
}
-
+
return success;
}
@@ -1732,7 +1757,7 @@ std::tuple GLTFSerializer::requestData(hifi::URL& url) {
}
hifi::ByteArray GLTFSerializer::requestEmbeddedData(const QString& url) {
- QString binaryUrl = url.split(",")[1];
+ QString binaryUrl = url.split(",")[1];
return binaryUrl.isEmpty() ? hifi::ByteArray() : QByteArray::fromBase64(binaryUrl.toUtf8());
}
@@ -1764,7 +1789,7 @@ QNetworkReply* GLTFSerializer::request(hifi::URL& url, bool isTest) {
HFMTexture GLTFSerializer::getHFMTexture(const GLTFTexture& texture) {
HFMTexture fbxtex = HFMTexture();
fbxtex.texcoordSet = 0;
-
+
if (texture.defined["source"]) {
QString url = _file.images[texture.source].uri;
@@ -1775,7 +1800,7 @@ HFMTexture GLTFSerializer::getHFMTexture(const GLTFTexture& texture) {
if (_url.path().endsWith("glb") && !_glbBinary.isEmpty()) {
int bufferView = _file.images[texture.source].bufferView;
-
+
GLTFBufferView& imagesBufferview = _file.bufferviews[bufferView];
int offset = imagesBufferview.byteOffset;
int length = imagesBufferview.byteLength;
@@ -1785,7 +1810,7 @@ HFMTexture GLTFSerializer::getHFMTexture(const GLTFTexture& texture) {
}
if (url.contains("data:image/jpeg;base64,") || url.contains("data:image/png;base64,")) {
- fbxtex.content = requestEmbeddedData(url);
+ fbxtex.content = requestEmbeddedData(url);
}
}
return fbxtex;
@@ -1815,12 +1840,12 @@ void GLTFSerializer::setHFMMaterial(HFMMaterial& hfmMat, const GLTFMaterial& mat
hfmMat.emissiveTexture = getHFMTexture(_file.textures[material.emissiveTexture]);
hfmMat.useEmissiveMap = true;
}
-
+
if (material.defined["normalTexture"]) {
hfmMat.normalTexture = getHFMTexture(_file.textures[material.normalTexture]);
hfmMat.useNormalMap = true;
}
-
+
if (material.defined["occlusionTexture"]) {
hfmMat.occlusionTexture = getHFMTexture(_file.textures[material.occlusionTexture]);
hfmMat.useOcclusionMap = true;
@@ -1848,7 +1873,7 @@ void GLTFSerializer::setHFMMaterial(HFMMaterial& hfmMat, const GLTFMaterial& mat
if (material.pbrMetallicRoughness.defined["roughnessFactor"]) {
hfmMat._material->setRoughness(material.pbrMetallicRoughness.roughnessFactor);
}
- if (material.pbrMetallicRoughness.defined["baseColorFactor"] &&
+ if (material.pbrMetallicRoughness.defined["baseColorFactor"] &&
material.pbrMetallicRoughness.baseColorFactor.size() == 4) {
glm::vec3 dcolor =
glm::vec3(material.pbrMetallicRoughness.baseColorFactor[0], material.pbrMetallicRoughness.baseColorFactor[1],
@@ -1864,7 +1889,7 @@ void GLTFSerializer::setHFMMaterial(HFMMaterial& hfmMat, const GLTFMaterial& mat
template
bool GLTFSerializer::readArray(const hifi::ByteArray& bin, int byteOffset, int count,
QVector& outarray, int accessorType, bool normalized) {
-
+
QDataStream blobstream(bin);
blobstream.setByteOrder(QDataStream::LittleEndian);
blobstream.setVersion(QDataStream::Qt_5_9);
@@ -1904,7 +1929,7 @@ bool GLTFSerializer::readArray(const hifi::ByteArray& bin, int byteOffset, int c
if (normalized) {
scale = (float)(std::numeric_limits::max)();
}
-
+
for (int i = 0; i < count; ++i) {
for (int j = 0; j < bufferCount; ++j) {
if (!blobstream.atEnd()) {
@@ -1928,7 +1953,7 @@ bool GLTFSerializer::readArray(const hifi::ByteArray& bin, int byteOffset, int c
template
bool GLTFSerializer::addArrayOfType(const hifi::ByteArray& bin, int byteOffset, int count,
QVector& outarray, int accessorType, int componentType, bool normalized) {
-
+
switch (componentType) {
case GLTFAccessorComponentType::BYTE: {}
case GLTFAccessorComponentType::UNSIGNED_BYTE: {
@@ -1996,7 +2021,7 @@ bool GLTFSerializer::addArrayFromAccessor(GLTFAccessor& accessor, QVector& ou
if (success) {
for (int i = 0; i < accessor.sparse.count; ++i) {
- if ((i * 3) + 2 < out_sparse_values_array.size()) {
+ if ((i * 3) + 2 < out_sparse_values_array.size()) {
if ((out_sparse_indices_array[i] * 3) + 2 < outarray.length()) {
for (int j = 0; j < 3; ++j) {
outarray[(out_sparse_indices_array[i] * 3) + j] = out_sparse_values_array[(i * 3) + j];
@@ -2018,8 +2043,8 @@ bool GLTFSerializer::addArrayFromAccessor(GLTFAccessor& accessor, QVector& ou
return success;
}
-void GLTFSerializer::retriangulate(const QVector& inIndices, const QVector& in_vertices,
- const QVector& in_normals, QVector& outIndices,
+void GLTFSerializer::retriangulate(const QVector& inIndices, const QVector& in_vertices,
+ const QVector& in_normals, QVector& outIndices,
QVector& out_vertices, QVector& out_normals) {
for (int i = 0; i < inIndices.size(); i = i + 3) {
diff --git a/libraries/fbx/src/GLTFSerializer.h b/libraries/model-serializers/src/GLTFSerializer.h
similarity index 98%
rename from libraries/fbx/src/GLTFSerializer.h
rename to libraries/model-serializers/src/GLTFSerializer.h
index 040ccb413b..3ce38ead5e 100755
--- a/libraries/fbx/src/GLTFSerializer.h
+++ b/libraries/model-serializers/src/GLTFSerializer.h
@@ -1,6 +1,6 @@
//
// GLTFSerializer.h
-// libraries/fbx/src
+// libraries/model-serializers/src
//
// Created by Luis Cuenca on 8/30/17.
// Copyright 2017 High Fidelity, Inc.
@@ -343,7 +343,7 @@ struct GLTFCamera {
QString name;
GLTFCameraPerspective perspective; //required (or)
GLTFCameraOrthographic orthographic; //required (or)
- int type;
+ int type;
QMap defined;
void dump() {
if (defined["name"]) {
@@ -519,7 +519,7 @@ struct GLTFAccessor {
QMap defined;
void dump() {
-
+
}
};
int bufferView;
@@ -778,26 +778,26 @@ private:
bool buildGeometry(HFMModel& hfmModel, const hifi::VariantHash& mapping, const hifi::URL& url);
bool parseGLTF(const hifi::ByteArray& data);
-
- bool getStringVal(const QJsonObject& object, const QString& fieldname,
+
+ bool getStringVal(const QJsonObject& object, const QString& fieldname,
QString& value, QMap& defined);
- bool getBoolVal(const QJsonObject& object, const QString& fieldname,
+ bool getBoolVal(const QJsonObject& object, const QString& fieldname,
bool& value, QMap& defined);
- bool getIntVal(const QJsonObject& object, const QString& fieldname,
+ bool getIntVal(const QJsonObject& object, const QString& fieldname,
int& value, QMap& defined);
- bool getDoubleVal(const QJsonObject& object, const QString& fieldname,
+ bool getDoubleVal(const QJsonObject& object, const QString& fieldname,
double& value, QMap& defined);
- bool getObjectVal(const QJsonObject& object, const QString& fieldname,
+ bool getObjectVal(const QJsonObject& object, const QString& fieldname,
QJsonObject& value, QMap& defined);
- bool getIntArrayVal(const QJsonObject& object, const QString& fieldname,
+ bool getIntArrayVal(const QJsonObject& object, const QString& fieldname,
QVector& values, QMap& defined);
- bool getDoubleArrayVal(const QJsonObject& object, const QString& fieldname,
+ bool getDoubleArrayVal(const QJsonObject& object, const QString& fieldname,
QVector& values, QMap& defined);
- bool getObjectArrayVal(const QJsonObject& object, const QString& fieldname,
+ bool getObjectArrayVal(const QJsonObject& object, const QString& fieldname,
QJsonArray& objects, QMap& defined);
hifi::ByteArray setGLBChunks(const hifi::ByteArray& data);
-
+
graphics::MaterialKey::OpacityMapMode getMaterialAlphaMode(const QString& type);
int getAccessorType(const QString& type);
int getAnimationSamplerInterpolation(const QString& interpolation);
@@ -805,7 +805,7 @@ private:
int getImageMimeType(const QString& mime);
int getMeshPrimitiveRenderingMode(const QString& type);
- bool getIndexFromObject(const QJsonObject& object, const QString& field,
+ bool getIndexFromObject(const QJsonObject& object, const QString& field,
int& outidx, QMap& defined);
bool setAsset(const QJsonObject& object);
@@ -841,8 +841,8 @@ private:
template
bool addArrayFromAccessor(GLTFAccessor& accessor, QVector& outarray);
- void retriangulate(const QVector& in_indices, const QVector& in_vertices,
- const QVector& in_normals, QVector& out_indices,
+ void retriangulate(const QVector& in_indices, const QVector& in_vertices,
+ const QVector& in_normals, QVector& out_indices,
QVector& out_vertices, QVector& out_normals);
std::tuple requestData(hifi::URL& url);
@@ -857,4 +857,4 @@ private:
void glTFDebugDump();
};
-#endif // hifi_GLTFSerializer_h
\ No newline at end of file
+#endif // hifi_GLTFSerializer_h
diff --git a/libraries/fbx/src/OBJSerializer.cpp b/libraries/model-serializers/src/OBJSerializer.cpp
similarity index 99%
rename from libraries/fbx/src/OBJSerializer.cpp
rename to libraries/model-serializers/src/OBJSerializer.cpp
index 416f343a47..7acc663828 100644
--- a/libraries/fbx/src/OBJSerializer.cpp
+++ b/libraries/model-serializers/src/OBJSerializer.cpp
@@ -1,6 +1,6 @@
//
// OBJSerializer.cpp
-// libraries/fbx/src/
+// libraries/model-serializers/src
//
// Created by Seth Alves on 3/7/15.
// Copyright 2013 High Fidelity, Inc.
@@ -15,7 +15,7 @@
#include "OBJSerializer.h"
#include // .obj files are not locale-specific. The C/ASCII charset applies.
-#include
+#include
#include
#include
@@ -263,16 +263,16 @@ void OBJSerializer::parseMaterialLibrary(QIODevice* device) {
default:
materials[matName] = currentMaterial;
#ifdef WANT_DEBUG
- qCDebug(modelformat) <<
+ qCDebug(modelformat) <<
"OBJSerializer Last material illumination model:" << currentMaterial.illuminationModel <<
- " shininess:" << currentMaterial.shininess <<
+ " shininess:" << currentMaterial.shininess <<
" opacity:" << currentMaterial.opacity <<
- " diffuse color:" << currentMaterial.diffuseColor <<
- " specular color:" << currentMaterial.specularColor <<
- " emissive color:" << currentMaterial.emissiveColor <<
- " diffuse texture:" << currentMaterial.diffuseTextureFilename <<
- " specular texture:" << currentMaterial.specularTextureFilename <<
- " emissive texture:" << currentMaterial.emissiveTextureFilename <<
+ " diffuse color:" << currentMaterial.diffuseColor <<
+ " specular color:" << currentMaterial.specularColor <<
+ " emissive color:" << currentMaterial.emissiveColor <<
+ " diffuse texture:" << currentMaterial.diffuseTextureFilename <<
+ " specular texture:" << currentMaterial.specularTextureFilename <<
+ " emissive texture:" << currentMaterial.emissiveTextureFilename <<
" bump texture:" << currentMaterial.bumpTextureFilename <<
" opacity texture:" << currentMaterial.opacityTextureFilename;
#endif
@@ -352,7 +352,7 @@ void OBJSerializer::parseMaterialLibrary(QIODevice* device) {
}
}
}
-}
+}
void OBJSerializer::parseTextureLine(const hifi::ByteArray& textureLine, hifi::ByteArray& filename, OBJMaterialTextureOptions& textureOptions) {
// Texture options reference http://paulbourke.net/dataformats/mtl/
@@ -803,7 +803,7 @@ HFMModel::Pointer OBJSerializer::read(const hifi::ByteArray& data, const hifi::V
n0 = checked_at(normals, face.normalIndices[0]);
n1 = checked_at(normals, face.normalIndices[1]);
n2 = checked_at(normals, face.normalIndices[2]);
- } else {
+ } else {
// generate normals from triangle plane if not provided
n0 = n1 = n2 = glm::cross(v1 - v0, v2 - v0);
}
@@ -932,7 +932,7 @@ HFMModel::Pointer OBJSerializer::read(const hifi::ByteArray& data, const hifi::V
bool applyNonMetallic = false;
bool fresnelOn = false;
- // Illumination model reference http://paulbourke.net/dataformats/mtl/
+ // Illumination model reference http://paulbourke.net/dataformats/mtl/
switch (objMaterial.illuminationModel) {
case 0: // Color on and Ambient off
// We don't support ambient = do nothing?
@@ -976,7 +976,7 @@ HFMModel::Pointer OBJSerializer::read(const hifi::ByteArray& data, const hifi::V
case 10: // Casts shadows onto invisible surfaces
// Do nothing?
break;
- }
+ }
if (applyTransparency) {
hfmMaterial.opacity = std::max(hfmMaterial.opacity, ILLUMINATION_MODEL_MIN_OPACITY);
diff --git a/libraries/fbx/src/OBJSerializer.h b/libraries/model-serializers/src/OBJSerializer.h
similarity index 99%
rename from libraries/fbx/src/OBJSerializer.h
rename to libraries/model-serializers/src/OBJSerializer.h
index 6fdd95e2c3..20633e90e4 100644
--- a/libraries/fbx/src/OBJSerializer.h
+++ b/libraries/model-serializers/src/OBJSerializer.h
@@ -1,6 +1,6 @@
//
// OBJSerializer.h
-// libraries/fbx/src/
+// libraries/model-serializers/src
//
// Created by Seth Alves on 3/6/15.
// Copyright 2015 High Fidelity, Inc.
@@ -93,7 +93,7 @@ class OBJSerializer: public QObject, public HFMSerializer { // QObject so we can
public:
MediaType getMediaType() const override;
std::unique_ptr getFactory() const override;
-
+
typedef QVector FaceGroup;
QVector vertices;
QVector vertexColors;
@@ -102,7 +102,7 @@ public:
QVector faceGroups;
QString currentMaterialName;
QHash materials;
-
+
HFMModel::Pointer read(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url = hifi::URL()) override;
private:
diff --git a/libraries/fbx/src/OBJWriter.cpp b/libraries/model-serializers/src/OBJWriter.cpp
similarity index 99%
rename from libraries/fbx/src/OBJWriter.cpp
rename to libraries/model-serializers/src/OBJWriter.cpp
index b2e191bcbf..dec35c7aac 100644
--- a/libraries/fbx/src/OBJWriter.cpp
+++ b/libraries/model-serializers/src/OBJWriter.cpp
@@ -1,6 +1,6 @@
//
// OBJWriter.cpp
-// libraries/fbx/src/
+// libraries/model-serializers/src
//
// Created by Seth Alves on 2017-1-27.
// Copyright 2017 High Fidelity, Inc.
diff --git a/libraries/fbx/src/OBJWriter.h b/libraries/model-serializers/src/OBJWriter.h
similarity index 94%
rename from libraries/fbx/src/OBJWriter.h
rename to libraries/model-serializers/src/OBJWriter.h
index 536e8cf837..34f6d93658 100644
--- a/libraries/fbx/src/OBJWriter.h
+++ b/libraries/model-serializers/src/OBJWriter.h
@@ -1,6 +1,6 @@
//
// OBJWriter.h
-// libraries/fbx/src/
+// libraries/model-serializers/src
//
// Created by Seth Alves on 2017-1-27.
// Copyright 2017 High Fidelity, Inc.
diff --git a/libraries/networking/src/FingerprintUtils.cpp b/libraries/networking/src/FingerprintUtils.cpp
index 83a4f19703..cab8cde832 100644
--- a/libraries/networking/src/FingerprintUtils.cpp
+++ b/libraries/networking/src/FingerprintUtils.cpp
@@ -32,12 +32,25 @@
#include
#endif //Q_OS_MAC
+// Number of iterations to apply to the hash, for stretching.
+// The number is arbitrary and has the only purpose of slowing down brute-force
+// attempts. The number here should be low enough not to cause any trouble for
+// low-end hardware.
+//
+// Changing this results in different hardware IDs being computed.
+static const int HASH_ITERATIONS = 65535;
+
+// Salt string for the hardware ID, makes our IDs unique to our project.
+// Changing this results in different hardware IDs being computed.
+static const QByteArray HASH_SALT{"Vircadia"};
+
static const QString FALLBACK_FINGERPRINT_KEY = "fallbackFingerprint";
QUuid FingerprintUtils::_machineFingerprint { QUuid() };
QString FingerprintUtils::getMachineFingerprintString() {
- QString uuidString;
+ QCryptographicHash hash(QCryptographicHash::Keccak_256);
+
#ifdef Q_OS_LINUX
// As per the documentation:
// https://man7.org/linux/man-pages/man5/machine-id.5.html
@@ -45,8 +58,6 @@ QString FingerprintUtils::getMachineFingerprintString() {
// we use the machine id as a base, but add an application-specific key to it.
// If machine-id isn't available, we try hardware networking devices instead.
- QCryptographicHash hash(QCryptographicHash::Keccak_256);
-
QFile machineIdFile("/etc/machine-id");
if (!machineIdFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
// No machine ID, probably no systemd.
@@ -58,7 +69,7 @@ QString FingerprintUtils::getMachineFingerprintString() {
if (netDevicesInfo.empty()) {
// Let getMachineFingerprint handle this contingency
qCWarning(networking) << "Failed to find any hardware networking devices";
- return "";
+ return QUuid().toString();
}
for(auto& fileInfo : netDevicesInfo) {
@@ -84,49 +95,20 @@ QString FingerprintUtils::getMachineFingerprintString() {
hash.addData(data);
}
- // Makes this hash unique to us
- hash.addData("Vircadia");
-
- // Stretching
- for (int i=0; i < 65535; i++) {
- hash.addData(hash.result());
- }
-
- QByteArray result = hash.result();
- result.resize(128 / 8); // GUIDs are 128 bit numbers
-
- // Set UUID version to 4, ensuring it's a valid UUID
- result[6] = (result[6] & 0x0F) | 0x40;
-
- // Of course, Qt couldn't be nice and just parse something like:
- // 1b1b9d6d45c2473bac13dc3011ff58d6
- //
- // So we have to turn it into:
- // {1b1b9d6d-45c2-473b-ac13-dc3011ff58d6}
-
- uuidString = result.toHex();
- uuidString.insert(20, '-');
- uuidString.insert(16, '-');
- uuidString.insert(12, '-');
- uuidString.insert(8, '-');
- uuidString.prepend("{");
- uuidString.append("}");
-
- qCDebug(networking) << "Linux machine fingerprint:" << uuidString;
#endif //Q_OS_LINUX
#ifdef Q_OS_MAC
io_registry_entry_t ioRegistryRoot = IORegistryEntryFromPath(kIOMasterPortDefault, "IOService:/");
CFStringRef uuidCf = (CFStringRef) IORegistryEntryCreateCFProperty(ioRegistryRoot, CFSTR(kIOPlatformUUIDKey), kCFAllocatorDefault, 0);
IOObjectRelease(ioRegistryRoot);
- uuidString = QString::fromCFString(uuidCf);
+ hash.addData(QString::fromCFString(uuidCf).toUtf8());
CFRelease(uuidCf);
- qCDebug(networking) << "Mac serial number: " << uuidString;
#endif //Q_OS_MAC
#ifdef Q_OS_WIN
HKEY cryptoKey;
-
+ bool success = false;
+
// try and open the key that contains the machine GUID
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", 0, KEY_READ, &cryptoKey) == ERROR_SUCCESS) {
DWORD type;
@@ -143,7 +125,8 @@ QString FingerprintUtils::getMachineFingerprintString() {
if (RegQueryValueEx(cryptoKey, MACHINE_GUID_KEY, NULL, NULL,
reinterpret_cast(&machineGUID[0]), &guidSize) == ERROR_SUCCESS) {
- uuidString = QString::fromStdString(machineGUID);
+ hash.addData(QString::fromStdString(machineGUID).toUtf8());
+ success = true;
}
}
}
@@ -151,10 +134,43 @@ QString FingerprintUtils::getMachineFingerprintString() {
RegCloseKey(cryptoKey);
}
+ if (!success) {
+ // Let getMachineFingerprint handle this contingency
+ return QUuid().toString();
+ }
#endif //Q_OS_WIN
- return uuidString;
+ // Makes this hash unique to us
+ hash.addData(HASH_SALT);
+ // Stretching
+ for (int i = 0; i < HASH_ITERATIONS; i++) {
+ hash.addData(hash.result());
+ }
+
+ QByteArray result = hash.result();
+ result.resize(128 / 8); // GUIDs are 128 bit numbers
+
+ // Set UUID version to 4, ensuring it's a valid UUID
+ result[6] = (result[6] & 0x0F) | 0x40;
+
+ // Of course, Qt couldn't be nice and just parse something like:
+ // 1b1b9d6d45c2473bac13dc3011ff58d6
+ //
+ // So we have to turn it into:
+ // {1b1b9d6d-45c2-473b-ac13-dc3011ff58d6}
+
+ QString uuidString = result.toHex();
+ uuidString.insert(20, '-');
+ uuidString.insert(16, '-');
+ uuidString.insert(12, '-');
+ uuidString.insert(8, '-');
+ uuidString.prepend("{");
+ uuidString.append("}");
+
+ qCDebug(networking) << "Final machine fingerprint:" << uuidString;
+
+ return uuidString;
}
QUuid FingerprintUtils::getMachineFingerprint() {
diff --git a/libraries/networking/src/NetworkingConstants.h b/libraries/networking/src/NetworkingConstants.h
index ccdb9ea75c..d5ad90a6f4 100644
--- a/libraries/networking/src/NetworkingConstants.h
+++ b/libraries/networking/src/NetworkingConstants.h
@@ -26,7 +26,7 @@ namespace NetworkingConstants {
// if you manually generate a personal access token for the domains scope
// at https://staging.highfidelity.com/user/tokens/new?for_domain_server=true
- const QString WEB_ENGINE_VERSION = "Chrome/69.0.3497.113";
+ const QString WEB_ENGINE_VERSION = "Chrome/83.0.4103.122";
// For now we only have one Metaverse server.
const QUrl METAVERSE_SERVER_URL_STABLE { "https://metaverse.vircadia.com/live" };
diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp
index 87bd7941d3..f7c1192886 100644
--- a/libraries/networking/src/udt/PacketHeaders.cpp
+++ b/libraries/networking/src/udt/PacketHeaders.cpp
@@ -24,7 +24,7 @@ int packetTypeMetaTypeId = qRegisterMetaType();
PacketVersion versionForPacketType(PacketType packetType) {
switch (packetType) {
- case PacketType::StunResponse:
+ case PacketType::DomainConnectRequestPending: // keeping the old version to maintain the protocol hash
return 17;
case PacketType::DomainList:
return static_cast(DomainListVersion::HasConnectReason);
diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h
index 1d96969035..819551045a 100644
--- a/libraries/networking/src/udt/PacketHeaders.h
+++ b/libraries/networking/src/udt/PacketHeaders.h
@@ -33,7 +33,7 @@ public:
// This enum must hold 256 or fewer packet types (so the value is <= 255) since it is statically typed as a uint8_t
enum class Value : uint8_t {
Unknown,
- StunResponse,
+ DomainConnectRequestPending,
DomainList,
Ping,
PingReply,
@@ -170,7 +170,7 @@ public:
const static QSet getNonSourcedPackets() {
const static QSet NON_SOURCED_PACKETS = QSet()
- << PacketTypeEnum::Value::StunResponse << PacketTypeEnum::Value::CreateAssignment
+ << PacketTypeEnum::Value::DomainConnectRequestPending << PacketTypeEnum::Value::CreateAssignment
<< PacketTypeEnum::Value::RequestAssignment << PacketTypeEnum::Value::DomainServerRequireDTLS
<< PacketTypeEnum::Value::DomainConnectRequest << PacketTypeEnum::Value::DomainList
<< PacketTypeEnum::Value::DomainConnectionDenied << PacketTypeEnum::Value::DomainServerPathQuery
diff --git a/libraries/physics/CMakeLists.txt b/libraries/physics/CMakeLists.txt
index c1410a6bfc..ad4900e4ba 100644
--- a/libraries/physics/CMakeLists.txt
+++ b/libraries/physics/CMakeLists.txt
@@ -12,7 +12,7 @@ include_hifi_library_headers(image)
include_hifi_library_headers(ktx)
include_hifi_library_headers(gpu)
include_hifi_library_headers(hfm)
-include_hifi_library_headers(fbx)
+include_hifi_library_headers(model-serializers)
include_hifi_library_headers(graphics)
target_bullet()
diff --git a/libraries/render-utils/CMakeLists.txt b/libraries/render-utils/CMakeLists.txt
index 833d78bb74..4c444bcd15 100644
--- a/libraries/render-utils/CMakeLists.txt
+++ b/libraries/render-utils/CMakeLists.txt
@@ -3,7 +3,7 @@ set(TARGET_NAME render-utils)
# pull in the resources.qrc file
qt5_add_resources(QT_RESOURCES_FILE "${CMAKE_CURRENT_SOURCE_DIR}/res/fonts/fonts.qrc")
setup_hifi_library(Gui Network Qml Quick Script)
-link_hifi_libraries(shared task ktx gpu shaders graphics graphics-scripting material-networking model-networking render animation fbx image procedural)
+link_hifi_libraries(shared task ktx gpu shaders graphics graphics-scripting material-networking model-networking render animation model-serializers image procedural)
include_hifi_library_headers(audio)
include_hifi_library_headers(networking)
include_hifi_library_headers(octree)
diff --git a/libraries/script-engine/CMakeLists.txt b/libraries/script-engine/CMakeLists.txt
index 9052cb89e9..6def6c185f 100644
--- a/libraries/script-engine/CMakeLists.txt
+++ b/libraries/script-engine/CMakeLists.txt
@@ -7,7 +7,7 @@ if (NOT ANDROID)
target_quazip()
endif ()
-link_hifi_libraries(shared networking shaders material-networking model-networking recording avatars fbx entities controllers animation audio midi)
+link_hifi_libraries(shared networking shaders material-networking model-networking recording avatars model-serializers entities controllers animation audio midi)
include_hifi_library_headers(gl)
include_hifi_library_headers(hfm)
include_hifi_library_headers(gpu)
diff --git a/libraries/shared/src/BlendshapeConstants.cpp b/libraries/shared/src/BlendshapeConstants.cpp
index 9035b10529..01f8c2db19 100644
--- a/libraries/shared/src/BlendshapeConstants.cpp
+++ b/libraries/shared/src/BlendshapeConstants.cpp
@@ -77,10 +77,47 @@ const char* BLENDSHAPE_NAMES[] = {
""
};
-const QMap BLENDSHAPE_LOOKUP_MAP = [] {
- QMap toReturn;
+const QHash BLENDSHAPE_LOOKUP_MAP = [] {
+ QHash toReturn;
for (int i = 0; i < (int)Blendshapes::BlendshapeCount; i++) {
toReturn[BLENDSHAPE_NAMES[i]] = i;
}
return toReturn;
}();
+
+const QHash> READYPLAYERME_BLENDSHAPES_MAP = {
+ // ReadyPlayerMe blendshape default mapping.
+ { "mouthOpen", { "JawOpen", 1.0f } },
+ { "eyeBlinkLeft", { "EyeBlink_L", 1.0f } },
+ { "eyeBlinkRight", { "EyeBlink_R", 1.0f } },
+ { "eyeSquintLeft", { "EyeSquint_L", 1.0f } },
+ { "eyeSquintRight", { "EyeSquint_R", 1.0f } },
+ { "eyeWideLeft", { "EyeOpen_L", 1.0f } },
+ { "eyeWideRight", { "EyeOpen_R", 1.0f } },
+ { "browDownLeft", { "BrowsD_L", 1.0f } },
+ { "browDownRight", { "BrowsD_R", 1.0f } },
+ { "browInnerUp", { "BrowsU_C", 1.0f } },
+ { "browOuterUpLeft", { "BrowsU_L", 1.0f } },
+ { "browOuterUpRight", { "BrowsU_R", 1.0f } },
+ { "mouthFrownLeft", { "MouthFrown_L", 1.0f } },
+ { "mouthFrownRight", { "MouthFrown_R", 1.0f } },
+ { "mouthPucker", { "LipsPucker", 1.0f } },
+ { "jawForward", { "JawFwd", 1.0f } },
+ { "jawLeft", { "JawLeft", 1.0f } },
+ { "jawRight", { "JawRight", 1.0f } },
+ { "mouthLeft", { "MouthLeft", 1.0f } },
+ { "mouthRight", { "MouthRight", 1.0f } },
+ { "noseSneerLeft", { "NoseSneer_L", 1.0f } },
+ { "noseSneerRight", { "NoseSneer_R", 1.0f } },
+ { "mouthLowerDownLeft", { "MouthLowerDown_L", 1.0f } },
+ { "mouthLowerDownRight", { "MouthLowerDown_R", 1.0f } },
+ { "mouthShrugLower", { "MouthShrugLower", 1.0f } },
+ { "mouthShrugUpper", { "MouthShrugUpper", 1.0f } },
+ { "viseme_sil", { "MouthClose", 1.0f } },
+ { "mouthSmile", { "MouthSmile_L", 1.0f } },
+ { "mouthSmile", { "MouthSmile_R", 1.0f } },
+ { "viseme_CH", { "LipsFunnel", 1.0f } },
+ { "viseme_PP", { "LipsUpperClose", 1.0f } },
+ { "mouthShrugLower", { "LipsLowerClose", 1.0f } },
+ { "viseme_FF", { "Puff", 1.0f } }
+};
diff --git a/libraries/shared/src/BlendshapeConstants.h b/libraries/shared/src/BlendshapeConstants.h
index 1c37892088..5dd1f0abbb 100644
--- a/libraries/shared/src/BlendshapeConstants.h
+++ b/libraries/shared/src/BlendshapeConstants.h
@@ -12,14 +12,15 @@
#ifndef hifi_BlendshapeConstants_h
#define hifi_BlendshapeConstants_h
-#include
+#include
#include
#include
/// The names of the supported blendshapes, terminated with an empty string.
extern const char* BLENDSHAPE_NAMES[];
-extern const QMap BLENDSHAPE_LOOKUP_MAP;
+extern const QHash BLENDSHAPE_LOOKUP_MAP;
+extern const QHash> READYPLAYERME_BLENDSHAPES_MAP;
enum class Blendshapes : int {
EyeBlink_L = 0,
@@ -87,16 +88,6 @@ enum class Blendshapes : int {
BlendshapeCount
};
-enum class LegacyBlendshpaes : int {
- JawChew, // not in ARKit
- LipsUpperUp, // split in ARKit
- LipsLowerDown, // split in ARKit
- ChinLowerRaise, // not in ARKit
- ChinUpperRaise, // not in ARKit
- Sneer, // split in ARKit
- LegacyBlendshapeCount
-};
-
// Original blendshapes were per Faceshift.
// NEW in ARKit
diff --git a/libraries/shared/src/Preferences.h b/libraries/shared/src/Preferences.h
index 9147117792..a195dc457f 100644
--- a/libraries/shared/src/Preferences.h
+++ b/libraries/shared/src/Preferences.h
@@ -153,7 +153,7 @@ class FloatPreference : public Preference {
Q_PROPERTY(float min READ getMin CONSTANT)
Q_PROPERTY(float max READ getMax CONSTANT)
Q_PROPERTY(float step READ getStep CONSTANT)
- Q_PROPERTY(float decimals READ getDecimals CONSTANT)
+ Q_PROPERTY(uint decimals READ getDecimals CONSTANT)
public:
using Getter = std::function;
@@ -194,10 +194,10 @@ protected:
const Getter _getter;
const Setter _setter;
- float _decimals { 0 };
+ uint _decimals { 0 };
float _min { 0 };
float _max { 1 };
- float _step { 0.1f };
+ float _step { 1 };
};
class IntPreference : public Preference {
diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt
index a72371f544..195021e2fe 100644
--- a/plugins/CMakeLists.txt
+++ b/plugins/CMakeLists.txt
@@ -47,11 +47,14 @@ endif()
# server-side plugins
set(DIR "pcmCodec")
add_subdirectory(${DIR})
-set(DIR "hifiCodec")
-add_subdirectory(${DIR})
set(DIR "opusCodec")
add_subdirectory(${DIR})
+if (NOT CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
+ set(DIR "hifiCodec")
+ add_subdirectory(${DIR})
+endif()
+
# example plugins
set(DIR "JSAPIExample")
add_subdirectory(${DIR})
diff --git a/plugins/openvr/CMakeLists.txt b/plugins/openvr/CMakeLists.txt
index 9690ee3fb5..0b9358242d 100644
--- a/plugins/openvr/CMakeLists.txt
+++ b/plugins/openvr/CMakeLists.txt
@@ -10,9 +10,9 @@
if ((WIN32 OR UNIX AND NOT APPLE) AND NOT USE_GLES)
set(TARGET_NAME openvr)
setup_hifi_plugin(Gui Qml Multimedia)
- link_hifi_libraries(shared task gl qml networking controllers ui
+ link_hifi_libraries(shared task gl qml networking controllers ui
plugins display-plugins ui-plugins input-plugins script-engine
- audio-client render-utils graphics shaders gpu render material-networking model-networking model-baker hfm fbx ktx image procedural ${PLATFORM_GL_BACKEND})
+ audio-client render-utils graphics shaders gpu render material-networking model-networking model-baker hfm model-serializers ktx image procedural ${PLATFORM_GL_BACKEND})
include_hifi_library_headers(octree)
target_openvr()
diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js
index 1650cb60f4..c9942afd48 100644
--- a/scripts/system/miniTablet.js
+++ b/scripts/system/miniTablet.js
@@ -563,7 +563,7 @@
// Tablet targets.
isGoto = false,
- TABLET_ADDRESS_DIALOG = "hifi/tablet/TabletAddressDialog.qml",
+ TABLET_EXPLORE_APP_UI = Script.resolvePath("../communityScripts/explore/explore.html"),
// Trigger values.
leftTriggerOn = 0,
@@ -907,7 +907,7 @@
var miniTabletProperties;
if (isGoto) {
- tablet.loadQMLSource(TABLET_ADDRESS_DIALOG);
+ tablet.gotoWebScreen(TABLET_EXPLORE_APP_UI);
} else {
tablet.gotoHomeScreen();
}
diff --git a/server-console/CMakeLists.txt b/server-console/CMakeLists.txt
index 49742cacf0..03432ab08d 100644
--- a/server-console/CMakeLists.txt
+++ b/server-console/CMakeLists.txt
@@ -1,5 +1,10 @@
set(TARGET_NAME packaged-server-console)
+if (CLIENT_ONLY AND APPLE)
+ # Don't include Console.app in client-only OSX DMGs.
+ return()
+endif()
+
if (PRODUCTION_BUILD)
set(PRODUCTION_OPTION "--production")
endif()
@@ -24,7 +29,11 @@ set_target_properties(${TARGET_NAME}-npm-install PROPERTIES FOLDER "hidden/Serve
# add a dependency from the package target to the server components
if (BUILD_CLIENT)
- add_dependencies(${TARGET_NAME} interface)
+ if (APPLE)
+ add_dependencies(${TARGET_NAME} Vircadia)
+ else()
+ add_dependencies(${TARGET_NAME} interface)
+ endif()
endif()
if (BUILD_SERVER)
diff --git a/tests-manual/controllers/CMakeLists.txt b/tests-manual/controllers/CMakeLists.txt
index 03043c79f2..932826c8de 100644
--- a/tests-manual/controllers/CMakeLists.txt
+++ b/tests-manual/controllers/CMakeLists.txt
@@ -7,6 +7,7 @@ setup_hifi_project(Script Qml)
set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Tests/manual-tests/")
setup_memory_debugger()
+setup_thread_debugger()
# link in the shared libraries
link_hifi_libraries(shared gl script-engine plugins render-utils ui-plugins input-plugins display-plugins controllers)
diff --git a/tests-manual/entities/CMakeLists.txt b/tests-manual/entities/CMakeLists.txt
index 6d0bf9f149..a6eed4f234 100644
--- a/tests-manual/entities/CMakeLists.txt
+++ b/tests-manual/entities/CMakeLists.txt
@@ -4,6 +4,7 @@ set(TARGET_NAME "entities-test")
# This is not a testcase -- just set it up as a regular hifi project
setup_hifi_project(Network Script)
setup_memory_debugger()
+setup_thread_debugger()
set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Tests/manual-tests/")
# link in the shared libraries
diff --git a/tests-manual/gl/CMakeLists.txt b/tests-manual/gl/CMakeLists.txt
index 40bb64be1c..5b738a6e39 100644
--- a/tests-manual/gl/CMakeLists.txt
+++ b/tests-manual/gl/CMakeLists.txt
@@ -2,6 +2,7 @@ set(TARGET_NAME gl-test)
# This is not a testcase -- just set it up as a regular hifi project
setup_hifi_project(Quick Gui OpenGL)
setup_memory_debugger()
+setup_thread_debugger()
set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Tests/manual-tests/")
link_hifi_libraries(shared gl)
package_libraries_for_deployment()
diff --git a/tests-manual/gpu-textures/CMakeLists.txt b/tests-manual/gpu-textures/CMakeLists.txt
index 907690748a..d148b0cd21 100644
--- a/tests-manual/gpu-textures/CMakeLists.txt
+++ b/tests-manual/gpu-textures/CMakeLists.txt
@@ -2,6 +2,7 @@ set(TARGET_NAME gpu-textures-tests)
# This is not a testcase -- just set it up as a regular hifi project
setup_hifi_project(Quick Gui Script)
setup_memory_debugger()
+setup_thread_debugger()
set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Tests/manual-tests/")
link_hifi_libraries(
shared shaders task networking gl
diff --git a/tests-manual/gpu/CMakeLists.txt b/tests-manual/gpu/CMakeLists.txt
index 6e3781acff..dc7bfbe75e 100644
--- a/tests-manual/gpu/CMakeLists.txt
+++ b/tests-manual/gpu/CMakeLists.txt
@@ -2,6 +2,7 @@ set(TARGET_NAME gpu-test)
# This is not a testcase -- just set it up as a regular hifi project
setup_hifi_project(Quick Gui Script)
setup_memory_debugger()
+setup_thread_debugger()
set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Tests/manual-tests/")
link_hifi_libraries(
shared task networking gl
diff --git a/tests-manual/qml/CMakeLists.txt b/tests-manual/qml/CMakeLists.txt
index f56b8c4533..1b56927713 100644
--- a/tests-manual/qml/CMakeLists.txt
+++ b/tests-manual/qml/CMakeLists.txt
@@ -1,6 +1,7 @@
set(TARGET_NAME qml-test)
setup_hifi_project(Quick Qml Gui OpenGL)
setup_memory_debugger()
+setup_thread_debugger()
set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Tests/manual-tests/")
link_hifi_libraries(shared networking gl qml)
diff --git a/tests-manual/render-perf/CMakeLists.txt b/tests-manual/render-perf/CMakeLists.txt
index 9e7d826d03..67d3ac2d86 100644
--- a/tests-manual/render-perf/CMakeLists.txt
+++ b/tests-manual/render-perf/CMakeLists.txt
@@ -6,6 +6,7 @@ if (WIN32)
endif()
setup_memory_debugger()
+setup_thread_debugger()
# This is not a testcase -- just set it up as a regular hifi project
setup_hifi_project(Quick Gui)
diff --git a/tests-manual/render-texture-load/CMakeLists.txt b/tests-manual/render-texture-load/CMakeLists.txt
index 2e939e931a..77afdfa5d0 100644
--- a/tests-manual/render-texture-load/CMakeLists.txt
+++ b/tests-manual/render-texture-load/CMakeLists.txt
@@ -6,6 +6,7 @@ if (WIN32)
endif()
setup_memory_debugger()
+setup_thread_debugger()
# This is not a testcase -- just set it up as a regular hifi project
setup_hifi_project(Quick Gui)
diff --git a/tests-manual/render-utils/CMakeLists.txt b/tests-manual/render-utils/CMakeLists.txt
index 9f575ee8ca..e5548de2b2 100644
--- a/tests-manual/render-utils/CMakeLists.txt
+++ b/tests-manual/render-utils/CMakeLists.txt
@@ -6,6 +6,7 @@ setup_hifi_project(Quick Gui)
set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Tests/manual-tests/")
setup_memory_debugger()
+setup_thread_debugger()
# link in the shared libraries
link_hifi_libraries(render-utils shaders gl gpu shared ${PLATFORM_GL_BACKEND})
diff --git a/tests/recording/CMakeLists.txt b/tests/recording/CMakeLists.txt
index dbb942a27a..a0925aaf6d 100644
--- a/tests/recording/CMakeLists.txt
+++ b/tests/recording/CMakeLists.txt
@@ -3,6 +3,7 @@ set(TARGET_NAME recording-test)
setup_hifi_project(Test)
set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Tests/manual-tests/")
setup_memory_debugger()
+setup_thread_debugger()
link_hifi_libraries(shared recording)
if (WIN32)
target_link_libraries(${TARGET_NAME} Winmm.lib)
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
index 4942ecbd63..5de2f6fdf8 100644
--- a/tools/CMakeLists.txt
+++ b/tools/CMakeLists.txt
@@ -21,20 +21,27 @@ endfunction()
if (BUILD_TOOLS)
set(ALL_TOOLS
udt-test
- vhacd-util
gpu-frame-player
ice-client
ktx-tool
ac-client
skeleton-dump
atp-client
- oven
)
+ # Don't include oven or vhacd-til in OSX client-only DMGs.
+ if (NOT CLIENT_ONLY OR NOT APPLE)
+ list(APPEND ALL_TOOLS oven)
+ list(APPEND ALL_TOOLS vhacd-util)
+ endif()
+
# Allow different tools for stable builds
if (STABLE_BUILD)
else()
- list(APPEND ALL_TOOLS nitpick)
+ # Don't include nitpick in OSX client-only DMGs.
+ if (NOT APPLE OR NOT CLIENT_ONLY)
+ list(APPEND ALL_TOOLS nitpick)
+ endif()
endif()
foreach(TOOL ${ALL_TOOLS})
diff --git a/tools/ac-client/CMakeLists.txt b/tools/ac-client/CMakeLists.txt
index ad16187dcb..fe878b3cb4 100644
--- a/tools/ac-client/CMakeLists.txt
+++ b/tools/ac-client/CMakeLists.txt
@@ -1,4 +1,5 @@
set(TARGET_NAME ac-client)
setup_hifi_project(Core)
setup_memory_debugger()
+setup_thread_debugger()
link_hifi_libraries(shared networking)
diff --git a/tools/atp-client/CMakeLists.txt b/tools/atp-client/CMakeLists.txt
index 19c70597f7..0ed5969cb6 100644
--- a/tools/atp-client/CMakeLists.txt
+++ b/tools/atp-client/CMakeLists.txt
@@ -1,4 +1,5 @@
set(TARGET_NAME atp-client)
setup_hifi_project(Core)
setup_memory_debugger()
+setup_thread_debugger()
link_hifi_libraries(shared networking)
diff --git a/tools/dissectors/1-hfudt.lua b/tools/dissectors/1-hfudt.lua
index 9a51cc8d7c..5a03331fc6 100644
--- a/tools/dissectors/1-hfudt.lua
+++ b/tools/dissectors/1-hfudt.lua
@@ -53,7 +53,7 @@ local message_positions = {
local packet_types = {
[0] = "Unknown",
- [1] = "StunResponse",
+ [1] = "DomainConnectRequestPending",
[2] = "DomainList",
[3] = "Ping",
[4] = "PingReply",
diff --git a/tools/gpu-frame-player/CMakeLists.txt b/tools/gpu-frame-player/CMakeLists.txt
index cb20cdde25..e3611e1068 100644
--- a/tools/gpu-frame-player/CMakeLists.txt
+++ b/tools/gpu-frame-player/CMakeLists.txt
@@ -2,6 +2,7 @@
set(TARGET_NAME gpu-frame-player)
setup_memory_debugger()
+setup_thread_debugger()
if (APPLE)
set(CMAKE_MACOSX_BUNDLE TRUE)
diff --git a/tools/ice-client/CMakeLists.txt b/tools/ice-client/CMakeLists.txt
index 64ec6b131d..ebd573ebb5 100644
--- a/tools/ice-client/CMakeLists.txt
+++ b/tools/ice-client/CMakeLists.txt
@@ -1,4 +1,5 @@
set(TARGET_NAME ice-client)
setup_hifi_project(Core)
setup_memory_debugger()
+setup_thread_debugger()
link_hifi_libraries(shared networking)
diff --git a/tools/jsdoc/plugins/hifi.js b/tools/jsdoc/plugins/hifi.js
index 3c1ec08bb0..d757a4d5cb 100644
--- a/tools/jsdoc/plugins/hifi.js
+++ b/tools/jsdoc/plugins/hifi.js
@@ -44,7 +44,7 @@ exports.handlers = {
'../../libraries/controllers/src/controllers/impl/',
'../../libraries/display-plugins/src/display-plugins/',
'../../libraries/entities/src',
- '../../libraries/fbx/src',
+ '../../libraries/model-serializers/src',
'../../libraries/graphics/src/graphics/',
'../../libraries/graphics-scripting/src/graphics-scripting/',
'../../libraries/image/src/image',
diff --git a/tools/ktx-tool/CMakeLists.txt b/tools/ktx-tool/CMakeLists.txt
index 6bb09e0a9e..0c824cc2e7 100644
--- a/tools/ktx-tool/CMakeLists.txt
+++ b/tools/ktx-tool/CMakeLists.txt
@@ -7,6 +7,7 @@ link_hifi_libraries(shared networking image gl shaders gpu ktx)
target_gli()
setup_memory_debugger()
+setup_thread_debugger()
if (WIN32)
package_libraries_for_deployment()
diff --git a/tools/nitpick/CMakeLists.txt b/tools/nitpick/CMakeLists.txt
index d65505415d..8b4a5d03df 100644
--- a/tools/nitpick/CMakeLists.txt
+++ b/tools/nitpick/CMakeLists.txt
@@ -31,6 +31,7 @@ source_group("UI Files" FILES ${QT_UI_FILES})
qt5_wrap_ui(QT_UI_HEADERS "${QT_UI_FILES}")
setup_memory_debugger()
+setup_thread_debugger()
# add them to the nitpick source files
set(NITPICK_SRCS ${NITPICK_SRCS} "${QT_UI_HEADERS}" "${QT_RESOURCES}")
@@ -138,7 +139,7 @@ include_directories("${PROJECT_SOURCE_DIR}/src")
if (UNIX AND NOT ANDROID)
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
# Linux
- target_link_libraries(${TARGET_NAME} pthread atomic)
+ target_link_libraries(${TARGET_NAME} atomic pthread)
else ()
# OSX
target_link_libraries(${TARGET_NAME} pthread)
diff --git a/tools/nitpick/icon/nitpick-beta.icns b/tools/nitpick/icon/nitpick-beta.icns
new file mode 100644
index 0000000000..9044dbfbf7
Binary files /dev/null and b/tools/nitpick/icon/nitpick-beta.icns differ
diff --git a/tools/nitpick/icon/nitpick-beta.ico b/tools/nitpick/icon/nitpick-beta.ico
new file mode 100644
index 0000000000..5c279fd5c1
Binary files /dev/null and b/tools/nitpick/icon/nitpick-beta.ico differ
diff --git a/tools/nitpick/icon/nitpick.icns b/tools/nitpick/icon/nitpick.icns
index 332539af2a..4e4df39d69 100644
Binary files a/tools/nitpick/icon/nitpick.icns and b/tools/nitpick/icon/nitpick.icns differ
diff --git a/tools/nitpick/icon/nitpick.ico b/tools/nitpick/icon/nitpick.ico
index e3d852cb41..d0d5c4ac96 100644
Binary files a/tools/nitpick/icon/nitpick.ico and b/tools/nitpick/icon/nitpick.ico differ
diff --git a/tools/oven/CMakeLists.txt b/tools/oven/CMakeLists.txt
index 49cf9fb6ab..4f48570428 100644
--- a/tools/oven/CMakeLists.txt
+++ b/tools/oven/CMakeLists.txt
@@ -2,9 +2,10 @@ set(TARGET_NAME oven)
setup_hifi_project(Widgets Gui Concurrent)
-link_hifi_libraries(shared shaders image gpu ktx fbx hfm baking graphics networking procedural material-networking model-baker task)
+link_hifi_libraries(shared shaders image gpu ktx model-serializers hfm baking graphics networking procedural material-networking model-baker task)
setup_memory_debugger()
+setup_thread_debugger()
if (WIN32)
package_libraries_for_deployment()
diff --git a/tools/qt-builder/README.md b/tools/qt-builder/README.md
index 75f085f8ea..6b12580cb4 100644
--- a/tools/qt-builder/README.md
+++ b/tools/qt-builder/README.md
@@ -1,250 +1,317 @@
# General
-This document describes the process to build Qt 5.12.3.
-Note that there are several patches.
-* The first (to qfloat16.h) is needed to compile QT 5.12.3 on Visual Studio 2017 due to a bug in Visual Studio (*bitset* will not compile. Note that there is a change in CMakeLists.txt to support this.
-* The second patch is to OpenSL ES audio and allow audio echo cancelllation on Android.
-* The third is a patch to QScriptEngine to prevent crashes in QScriptEnginePrivate::reportAdditionalMemoryCost, during garbage collection. See https://bugreports.qt.io/browse/QTBUG-76176
-* The fourth is a patch which fixes video playback on WebEngineViews on mac. See https://bugreports.qt.io/browse/QTBUG-70967
+This document describes the process to build Qt 5.15.2.
+
+Reference: https://doc.qt.io/qt-5/build-sources.html
+
+Note that there are patches.
+* *win-qtwebengine.diff* fixes building with Visual Studio 2019 16.8.0. See https://bugreports.qt.io/browse/QTBUG-88625.
+
+
## Requirements
+
### Windows
-1. Visual Studio 2017
- If you don’t have Community or Professional edition of Visual Studio 2017, download [Visual Studio Community 2017](https://www.visualstudio.com/downloads/).
+1. Visual Studio 2019
+If you don’t have Community or Professional edition of Visual Studio 2019, download [Visual Studio Community 2019](https://www.visualstudio.com/downloads/).
Install with C++ support.
-
-1. python 2.7.16
-Check if needed running `python --version` - should return python 2.7.x
-Install from https://www.python.org/ftp/python/2.7.16/python-2.7.16.amd64.msi
-Add path to python executable to PATH.
-
-NOTE: REMOVE python 3 from PATH. Our regular build uses python 3. This will still work, because HIFI_PYTHON_EXEC points to the python 3 executable.
-
-Verify that python runs python 2.7 (run “python --version”)
-1. git >= 1.6
-Check if needed `git --version`
-Download from https://git-scm.com/download/win
-Verify by entering `git --version`
-1. perl >= 5.14
-Install from Strawberry Perl - http://strawberryperl.com/ - 5.28.1.1 64 bit to C:\Strawberry\
-Verify by running `perl --version`
-1. flex and bison
-Download from https://sourceforge.net/projects/winflexbison/files/latest/download
-Uncompress in C:\flex_bison
-Rename win-bison.exe to bison.exe and win-flex.exe to flex.exe
-Add C:\flex_bison to PATH
-Verify by running `flex --version`
-Verify by running `bison --version`
-1. gperf
-Install from http://gnuwin32.sourceforge.net/downlinks/gperf.php
-Add C:\Program Files (x86)\GnuWin32\bin to PATH
-Verify by running `gperf --version`
-1. 7-zip
-Download from https://www.7-zip.org/download.html
-1. Bash shell
-From *Settings* select *Update & Security*
-Select *For Developers*
-Enable *Developer mode*
-Restart PC
-Open Control Panel and select *Programs and Features*
-Select *Turn Windows features on or off*
-Check *Windows Subsystem for Linux*
-Click *Restart now*
-Download from the Microsoft Store - Search for *bash* and choose the latest Ubuntu version
-[First run will take a few minutes]
-Enter a user name - all small letters (this is used for *sudo* commands)
+1. python 2.7.x >= 2.7.16
+Download MSI installer from https://www.python.org/ and add directory of the python executable to PATH.
+NOTE: REMOVE python 3 from PATH. (Regular Vircadia builds use python 3, however these will still work because
+the make files automatically handle this.)
+Verify by running `python.exe --version`
+1. git >= 1.6
+Download from https://git-scm.com/download/win
+Verify by running `git --version`
+1. perl >= 5.14
+Install from Strawberry Perl - http://strawberryperl.com/ - 5.28.1.1 64 bit to C:\Strawberry\
+Verify by running `perl --version`
+1. flex and bison
+These are provided as part of the Qt repository in the gnuwin32/bin folder, which is prepended to the command prompt PATH when
+`tq5vars.bat` is run (see below).
+Alternatively, you can download it from https://sourceforge.net/projects/winflexbison/files/latest/download and...
+: Uncompress in C:\flex_bison
+: Rename win-bison.exe to bison.exe and win-flex.exe to flex.exe
+: Add C:\flex_bison to PATH
+Verify by running `flex --version`
+Verify by running `bison --version`
+1. gperf
+This is provided as part of the Qt repository in the gnuwin32/bin folder, which is prepended to the command prompt PATH when
+`tq5vars.bat` is run (see below).
+alternatively, you can install from http://gnuwin32.sourceforge.net/downlinks/gperf.php and...
+: Add C:\Program Files (x86)\GnuWin32\bin to PATH
+Verify by running `gperf --version`
+1. 7-zip
+Download from https://www.7-zip.org/download.html and install.
+1. Bash shell
+Open Control Panel and select *Programs and Features*
+Select *Turn Windows features on or off*
+Check *Windows Subsystem for Linux*
+Click *Restart now*
+Download from the Microsoft Store - Search for *bash* and choose the latest Ubuntu version
+[First run will take a few minutes]
+Enter a user name - all small letters (this is used for *sudo* commands)
Choose a password
-1. Jom
-jom is a clone of nmake to support the execution of multiple independent commands in parallel.
-https://wiki.qt.io/Jom
+1. Jom
+jom is a clone of nmake to support the execution of multiple independent commands in parallel.
+https://wiki.qt.io/Jom
+Install in C:\Jom and add directory to PATH.
+
### Linux
-Tested on Ubuntu 16.04 and 18.04.
-**16.04 NEEDED FOR JENKINS~~ **
-1. qt5 requirements
-edit /etc/apt/sources.list (edit as root)
-replace all *# deb-src* with *deb-src* (in vi `1,$s/# deb-src/deb-src/`)
-`sudo apt-get update -y`
-`sudo apt-get upgrade -y`
-`sudo apt-get build-dep qt5-default -y`
-1. git >= 1.6
-Check if needed `git --version`
-`sudo apt-get install git -y`
-Verify again
-1. python
-Check if needed `python --version` - should return python 2.7.x
-`sudo apt-get install python -y` (not python 3!)
-Verify again
-1. gperf
-Check if needed `gperf --version`
-`sudo apt-get install gperf -y`
-Verify again
-1. bison and flex
-Check if needed `flex --version` and `bison --version`
-`sudo apt-get install flex bison -y`
-Verify again
-1. pkg-config (needed for qtwebengine)
-Check if needed `pkg-config --version`
-`sudo apt-get install pkg-config -y`
-Verify again
-1. OpenGL
-Verify (first install mesa-utils - `sudo apt install mesa-utils -y`) by `glxinfo | grep "OpenGL version"`
-`sudo apt-get install libgl1-mesa-dev -y`
-`sudo ln -s /usr/lib/x86_64-linux-gnu/libGL.so.346.35 /usr/lib/x86_64-linux-gnu/libGL.so.1.2.0`
-Verify again
-1. make
-Check if needed `make --version`
-`sudo apt-get install make -y`
-Verify again
-1. g++
-Check if needed
- `g++ --version`
-`sudo apt-get install g++ -y`
-Verify again
-1. dbus-1 (needed for qtwebengine)
-`sudo apt-get install libdbus-glib-1-dev -y`
-1. nss (needed for qtwebengine)
-`sudo apt-get install libnss3-dev -y`
+1. qt5 requirements
+On Ubuntu based systems you can just have apt install the dependencies for the qt5-default package:
+Edit /etc/apt/sources.list (edit as root) and uncomment all source repositories by replacing all `# deb-src` with `deb-src`.
+```bash
+sudo apt update
+sudo apt upgrade
+sudo apt build-dep qt5-default
+```
+
+2. git >= 1.6
+3. python 2.7.x
+4. gperf
+5. bison and flex
+6. pkg-config (needed for qtwebengine)
+7. OpenGL
+8. make
+9. g++
+10. dbus-1 (needed for qtwebengine)
+11. nss (needed for qtwebengine)
+
+On Ubuntu based systems you can install all these dependencies with:
+```bash
+sudo apt install git python gperf flex bison pkg-config mesa-utils libgl1-mesa-dev make g++ libdbus-glib-1-dev libnss3-dev
+```
+Make sure that python 2.7.x is the system standard by checking if `python --version` returns python 2.7.x
+
+Qt also provides a dependency list for some major Linux distributions here: https://wiki.qt.io/Building_Qt_5_from_Git#Linux.2FX11
+
### Mac
-1. git >= 1.6
-Check if needed `git --version`
-Install from https://git-scm.com/download/mac
-Verify again
-1. pkg-config
-brew fontconfig dbus-glib stall pkg-config
-1. dbus-1
-brew install dbus-glib
+1. git >= 1.6
+Check if needed `git --version`
+Install from https://git-scm.com/download/mac
+Verify again
+1. install pkg-config, dbug-glib, and fontconfig
+brew install fontconfig dbus-glib pkg-config
+
+
## Build Process
+
+
### General
-qt is cloned to the qt5 folder.
-The build is performed in the qt5-build folder.
-Build products are installed to the qt5-install folder.
-Before running configure, make sure that the qt5-build folder is empty.
+Qt is cloned to a qt5 folder.
+The build is performed in a qt5/qt5-build folder.
+Build products are installed to the qt5/qt5-install folder.
+Before running configure, make sure that the qt5-build folder is empty.
+
-**Only run the git patches once!!!**
### Windows
-Before building, verify that **HIFI_VCPKG_BASE_VERSION** points to a *vcpkg* folder containing *packages\openssl-windows_x64-windows*.
-If not, follow https://github.com/highfidelity/vcpkg to install *vcpkg* and then *openssl*.
-Also, make sure the directory that you are using to build qt is not deeply nested. It is quite possible to run into the windows MAX_PATH limit when building chromium. For example: `c:\msys64\home\ajt\code\hifi\tools\qt-builder\qt5-build` is too long. `c:\q\qt5-build\` is a better choice.
+Make sure that the directory you are using to build Qt is not deeply nested. It is quite possible to run into the windows MAX_PATH limit when building chromium. For example: `c:\msys64\home\ajt\code\hifi\tools\qt-builder\qt5-build` is too long. `c:\q\qt5-build\` is a better choice.
+
+#### Preparing OpenSSL
+
+Do one of the following to provide OpenSSL for building against:
+a. If you have installed a local copy of Qt 5.15.2 and have built Vircadia against that, including OpenSSL, find the
+**HIFI_VCPKG_BASE** subdirectory used in your build and make an environment variable **HIFI_VCPKG_BASE_DIR** point to the
+*installed\x64-windows* folder.
+a. Follow https://github.com/vircadia/vcpkg to install *vcpkg* and then *openssl*.
+Then make an environment variable **HIFI_VCPKG_BASE_DIR** point to the *packages\openssl-windows_x64-windows* vcpkg folder.
+
#### Preparing source files
-`git clone --recursive https://code.qt.io/qt/qt5.git -b 5.12.3 --single-branch`
-
-* Copy the **patches** folder to qt5
-* Copy the **qt5vars.bat** file to qt5
-* Apply the patches to Qt
+Get the source:
+`git clone --recursive https://code.qt.io/qt/qt5.git -b 5.15.2 --single-branch`
-`cd qt5`
-`git apply --ignore-space-change --ignore-whitespace patches/qfloat16.patch`
-`git apply --ignore-space-change --ignore-whitespace patches/aec.patch`
-`git apply --ignore-space-change --ignore-whitespace patches/qtscript-crash-fix.patch`
-`cd ..`
-#### Configuring
-`mkdir qt5-install`
-`mkdir qt5-build`
-`cd qt5-build`
+Apply patches:
+* Copy the **patches** folder to qt5
+* Apply the patches to Qt
+`cd qt5`
+`git apply --ignore-space-change --ignore-whitespace patches/win-qtwebengine.diff`
+`cd ..`
-run `..\qt5\qt5vars.bat`
-`cd ..\..\qt5-build`
+Set up configuration batch file:
+* Copy the **qt5vars.bat** file to qt5.
+* Edit the **qt5vars.bat** file per the instructions in it.
+
+#### Configuring
+
+Do the following in a Visual Studio 2019 Command Prompt window.
+
+Set up the build directories:
+`cd qt5`
+`mkdir qt5-build`
+`mkdir qt5-install`
+`cd qt5-build`
+
+Set up the environment variables:
+`..\qt5vars`
+
+Note: If you need to rebuild, wipe the *qt5-build* and *qt5-install* directories and re-run `qt5vars`.
+
+Configure the Qt build:
+
+`..\configure -force-debug-info -opensource -confirm-license -opengl desktop -platform win32-msvc -openssl-linked -I %HIFI_VCPKG_BASE_DIR%\include -L %HIFI_VCPKG_BASE_DIR%\lib OPENSSL_LIBS="-llibcrypto -llibssl" -nomake examples -nomake tests -skip qttranslations -skip qtserialport -skip qt3d -skip qtlocation -skip qtwayland -skip qtsensors -skip qtgamepad -skip qtcharts -skip qtx11extras -skip qtmacextras -skip qtvirtualkeyboard -skip qtpurchasing -skip qtdatavis3d -no-warnings-are-errors -no-pch -prefix ..\qt5-install`
+
+Copy the files *zlib1.dll* and *zlib.pdb* from the %HIFI_VCPKG_BASE_DIR%\bin directory to *qt5-build\qtbase\bin* (which is on
+the PATH used by the `jom` command).
+FIXME: Why aren't these zlib files automatically provided / found for use by rcc.exe?
-`..\qt5\configure -force-debug-info -opensource -confirm-license -opengl desktop -platform win32-msvc -openssl-linked OPENSSL_LIBS="-lssleay32 -llibeay32" -I %HIFI_VCPKG_BASE_VERSION%\packages\openssl-windows_x64-windows\include -L %HIFI_VCPKG_BASE_VERSION%\packages\openssl-windows_x64-windows\lib -nomake examples -nomake tests -skip qttranslations -skip qtserialport -skip qt3d -skip qtlocation -skip qtwayland -skip qtsensors -skip qtgamepad -skip qtspeech -skip qtcharts -skip qtx11extras -skip qtmacextras -skip qtvirtualkeyboard -skip qtpurchasing -skip qtdatavis3d -no-warnings-are-errors -no-pch -prefix ..\qt5-install`
#### Make
-`jom`
-`jom install`
+
+Build Qt:
+`jom`
+`jom install`
+
#### Fixing
-The *.prl* files have an absolute path that needs to be removed (see http://www.linuxfromscratch.org/blfs/view/stable-systemd/x/qtwebengine.html)
-1. Open a bash terminal
-1. `cd` to the *qt5-install* folder (e.g. `cd /mnt/d/qt5-install/`)
-1. Run the following command
-`find . -name \*.prl -exec sed -i -e '/^QMAKE_PRL_BUILD_DIR/d' {} \;`
-1. Copy *qt.conf* to *qt5-install\bin*
+
+The *.prl* files have an absolute path that needs to be removed (see http://www.linuxfromscratch.org/blfs/view/stable-systemd/x/qtwebengine.html)
+1. `cd` to the *qt5-install* folder.
+1. Open a bash terminal. (Run `bash` in command prompt.)
+1. Run the following command:
+`find . -name \*.prl -exec sed -i -e '/^QMAKE_PRL_BUILD_DIR/d' {} \;`
+
+Add a *qt.conf* file.
+1. Copy the file *qt5-build\qtbase\bin\qt.conf* to *qt5-install\bin*.
+1. Edit the *qt.conf* file: replace all absolute URLs with relative URLs.
+
+Copy the files *zlib1.dll* and *zlib.pdb* from *qt5-build\qtbase\bin* to *qt5-install\bin*.
+FIXME: Why aren't these zlib files automatically included?
+
+
#### Uploading
-Create a tar file called qt5-install-5.12.3-windows.tar.gz from the qt5-install folder.
-Upload qt5-install-5.12.3-windows.tar.gz to our Amazon S3 vircadia-public bucket, under the dependencies/vckpg directory.
-Update hifi_vcpkg.py to use this new URL. Additionally, you should make a small change to any file in the hifi/cmake/ports directory to force the re-download of the qt-install.tar.gz during the build process for hifi.
+
+Create a Gzip tar file called qt5-install-5.15.2-windows.tar.gz from the qt5-install folder.
+
+Using 7-Zip:
+* `cd` to the *qt5* folder.
+* `7z a -ttar qt5-install-5.15.2-windows.tar qt5-install`
+* `7z a -tgzip qt5-install-5.15.2-windows.tar.gz qt5-install-5.15.2-windows.tar`
+
+Upload qt5-install-5.15.2-windows.tar.gz to the Amazon S3 vircadia-public bucket, under the dependencies/vckpg directory.
+Update hifi_vcpkg.py to use this new URL. Additionally, you should make a small change to any file in the vircadia/cmake/ports
+directory to force the re-download of the qt-install.tar.gz during the build process for Vircadia.
+
#### Preparing Symbols
-Run `python3 prepare-windows-symbols-for-backtrace.py qt5-install` to scan the qt5-install directory for any dlls and pdbs. After running this command the backtrace directory will be created. Zip this directory up, but make sure that all dlls and pdbs are in the root of the zip file, not under a sub-directory. This file can then be uploaded to backtrace here: https://highfidelity.sp.backtrace.io/p/Interface/settings/symbol/upload
+
+Using Python 3, Run the following command in the *qt5* folder, substituting in paths as required. The
+*prepare-windows-symbols-for-backtrace.py* file is in the Vircadia repository's *tools\qt-builder* folder.
+`python prepare-windows-symbols-for-backtrace.py qt5-install`
+
+This scans the qt5-install directory for dlls and pdbs, and copies them to a *backtrace* directory.
+Check that all dlls and pdbs are in the root of the directory.
+
+Zip up this directory and upload it to Backtrace or other crash log handlng tool.
+
+
### Linux
#### Preparing source files
-`git clone --recursive git://code.qt.io/qt/qt5.git -b 5.12.3 --single-branch`
-
-* Copy the **patches** folder to qt5
-* Apply patches to Qt
-`cd qt5`
-`git apply --ignore-space-change --ignore-whitespace patches/aec.patch`
-`git apply --ignore-space-change --ignore-whitespace patches/qtscript-crash-fix.patch`
-`cd ..`
+```bash
+git clone --recursive git://code.qt.io/qt/qt5.git -b 5.15.2 --single-branch
+```
+
#### Configuring
-`mkdir qt5-install`
-`mkdir qt5-build`
-`cd qt5-build`
+```bash
+mkdir qt5-install
+mkdir qt5-build
+cd qt5-build
+```
-*Ubuntu 16.04*
-`../qt5/configure -opensource -confirm-license -platform linux-g++-64 -qt-zlib -qt-libjpeg -qt-libpng -qt-xcb -qt-freetype -qt-pcre -qt-harfbuzz -nomake examples -nomake tests -skip qttranslations -skip qtserialport -skip qt3d -skip qtlocation -skip qtwayland -skip qtsensors -skip qtgamepad -skip qtspeech -skip qtcharts -skip qtmacextras -skip qtvirtualkeyboard -skip qtpurchasing -skip qtdatavis3d -no-warnings-are-errors -no-pch -no-egl -no-icu -prefix ../qt5-install`
+amd64:
+```bash
+../qt5/configure -force-debug-info -release -opensource -confirm-license -platform linux-g++-64 -recheck-all -nomake tests -nomake examples -skip qttranslations -skip qtserialport -skip qt3d -skip qtlocation -skip qtwayland -skip qtsensors -skip qtgamepad -skip qtcharts -skip qtx11extras -skip qtmacextras -skip qtvirtualkeyboard -skip qtpurchasing -skip qtdatavis3d -skip qtlottie -skip qtquick3d -skip qtpim -skip qtdocgallery -no-warnings-are-errors -no-pch -no-egl -no-icu -prefix ../qt5-install
+```
+If libX11 or libGL aren't found, you will need to manually provide those locations. Search for `libX11.so` and `libGL.so` respectively and provide paths to their folders inside `qt5/qtbase/mkdspecs/linux-g++-64/qmake.conf`.
+On Ubuntu 18.04 both are in `/usr/lib/x86_64-linux-gnu`
-*Ubuntu 18.04*
-`../qt5/configure -force-debug-info -release -opensource -confirm-license -gdb-index -recheck-all -nomake tests -nomake examples -skip qttranslations -skip qtserialport -skip qt3d -skip qtlocation -skip qtwayland -skip qtsensors -skip qtgamepad -skip qtspeech -skip qtcharts -skip qtx11extras -skip qtmacextras -skip qtvirtualkeyboard -skip qtpurchasing -skip qtdatavis3d -no-warnings-are-errors -no-pch -c++std c++14 -prefix ../qt5-install`
+aarch64:
+```bash
+../qt5/configure -force-debug-info -release -opensource -confirm-license -platform linux-g++ -recheck-all -nomake tests -nomake examples -skip qttranslations -skip qtserialport -skip qt3d -skip qtlocation -skip qtwayland -skip qtsensors -skip qtgamepad -skip qtcharts -skip qtx11extras -skip qtmacextras -skip qtvirtualkeyboard -skip qtpurchasing -skip qtdatavis3d -skip qtlottie -skip qtquick3d -skip qtpim -skip qtdocgallery -no-warnings-are-errors -no-pch -no-icu -prefix ../qt5-install
+```
+You can accelerate the build process by installing some of the optional system dependencies.
-
-???`../qt5/configure -opensource -confirm-license -gdb-index -nomake examples -nomake tests -skip qttranslations -skip qtserialport -skip qt3d -skip qtlocation -skip qtwayland -skip qtsensors -skip qtgamepad -skip qtspeech -skip qtcharts -skip qtmacextras -skip qtvirtualkeyboard -skip qtpurchasing -skip qtdatavis3d -no-warnings-are-errors -no-pch -prefix ../qt5-install`
-#### Make
-`make`
-
-????*Ubuntu 18.04 only*
-????`make module-qtwebengine`
-????`make module-qtscript`
-
-*Both*
-`make install`
-#### Fixing
-1. The *.prl* files have an absolute path that needs to be removed (see http://www.linuxfromscratch.org/blfs/view/stable-systemd/x/qtwebengine.html)
-`cd ../qt5-install`
-`find . -name \*.prl -exec sed -i -e '/^QMAKE_PRL_BUILD_DIR/d' {} \;`
-1. Copy *qt.conf* to *qt5-install\bin*
-#### Uploading
-*Ubuntu 16.04*
-1. Return to the home folder
-`cd ..`
-1. Open a python 3 shell
-`python3`
-1. Run the following snippet:
-`import os`
-`import tarfile`
-`filename=tarfile.open("qt5-install.tar.gz", "w:gz")`
-`filename.add("qt5-install", os.path.basename("qt5-install"))`
-`exit()`
-1. Upload qt5-install.tar.gz to https://hifi-qa.s3.amazonaws.com/qt5/Ubuntu/16.04
-
-*Ubuntu 18.04*
-``tar -zcvf qt5-install.tar.gz qt5-install`
-1. Upload qt5-install.tar.gz to https://hifi-qa.s3.amazonaws.com/qt5/Ubuntu/18.04
-
-### Mac
-#### Preparing source files
-git clone --recursive git://code.qt.io/qt/qt5.git -b 5.12.3 --single-branch
-
-* Copy the **patches** folder to qt5
-* Apply the patches to Qt
-`cd qt5`
-`git apply --ignore-space-change --ignore-whitespace patches/aec.patch`
-`git apply --ignore-space-change --ignore-whitespace patches/qtscript-crash-fix.patch`
-`git apply --ignore-space-change --ignore-whitespace patches/mac-web-video.patch`
-`cd ..`
-#### Configuring
-`mkdir qt5-install`
-`mkdir qt5-build`
-`cd ../qt5-build`
-
-`../qt5/configure -force-debug-info -opensource -confirm-license -qt-zlib -qt-libjpeg -qt-libpng -qt-freetype -qt-pcre -qt-harfbuzz -nomake examples -nomake tests -skip qttranslations -skip qtserialport -skip qt3d -skip qtlocation -skip qtwayland -skip qtsensors -skip qtgamepad -skip qtspeech -skip qtcharts -skip qtx11extras -skip qtmacextras -skip qtvirtualkeyboard -skip qtpurchasing -skip qtdatavis3d -no-warnings-are-errors -no-pch -prefix ../qt5-install`
#### Make
-`make`
-`make install`
+Replace `4` with the number of threads you want to use. Keep in mind that the Qt build process uses a lot of memory. It is recommended to have at least 1.2 GiB per thread.
+```bash
+NINJAFLAGS='-j4' make -j4
+```
+
+On some systems qtscript, qtwebengine, qtwebchannel and qtspeech will be build by `make` without you manually specifying it, while others require you to build modules individually.
+Check the folders of each needed module for binary files, to make sure that they have actually been built.
+If a module has not been built, make the module "manually":
+```bash
+make -j4 module-qtscript
+NINJAFLAGS='-j4' make -j4 module-qtwebengine
+make -j4 module-qtspeech
+make -j4 module-qtwebchannel
+```
+
+Now Qt can be installed to qt5-install:
+```bash
+make -j4 install
+```
+
+If some modules were missing in previous steps, it is needed to install them individually as well:
+```bash
+cd qtwebengine
+make -j4 install
+cd ../qtscript
+make -j4 install
+cd ../qtspeech
+make -j4 install
+cd ../qtwebchannel
+make -j4 install
+```
+If one of the make commands fails, running it a second time sometimes clears the issue.
+
#### Fixing
-1. The *.prl* files have an absolute path that needs to be removed (see http://www.linuxfromscratch.org/blfs/view/stable-systemd/x/qtwebengine.html)
-`cd ../qt5-install`
-`find . -name \*.prl -exec sed -i -e '/^QMAKE_PRL_BUILD_DIR/d' {} \;`
-`cd ..`
-1. Copy *qt.conf* to *qt5-install\bin*
+1. The *.prl* files have an absolute path that needs to be removed (see http://www.linuxfromscratch.org/blfs/view/stable-systemd/x/qtwebengine.html)
+```bash
+cd ../qt5-install
+find . -name \*.prl -exec sed -i -e '/^QMAKE_PRL_BUILD_DIR/d' {} \;
+```
+2. Copy *qt.conf* to *qt5-install\bin*
+
#### Uploading
-`tar -zcvf qt5-install-5.13.2-macos.tar.gz qt5-install`
-Upload qt5-install-5.13.2-macos.tar.gz to our Amazon S3 vircadia-public bucket, under the dependencies/vckpg directory
-#### Creating symbols
-Run `python3 prepare-mac-symbols-for-backtrace.py qt5-install` to scan the qt5-build directory for any dylibs and execute dsymutil to create dSYM bundles. After running this command the backtrace directory will be created. Zip this directory up, but make sure that all dylibs and dSYM fiels are in the root of the zip file, not under a sub-directory. This file can then be uploaded to backtrace here: https://highfidelity.sp.backtrace.io/p/Interface/settings/symbol/upload
+1. Tar and xz qt5-install to create the package. Replace `ubuntu-18.04` with the relevant system and `amd64` with the relevant architecture.
+```bash
+tar -Jcvf qt5-install-5.15.2-ubuntu-18.04-amd64.tar.xz qt5-install
+```
+2. Upload qt5-install-5.15.2-ubuntu-18.04-amd64.tar.xz to https://athena-public.s3.amazonaws.com/dependencies/vcpkg/
+
+
+
+### Mac
+
+#### Preparing source files
+git clone --recursive git://code.qt.io/qt/qt5.git -b 5.15.2 --single-branch
+
+* If you are compiling with MacOSX11.1.SDK or greater, edit qt5/qtwebengine/src/3rdparty/chromium/build/mac/find_sdk.py line 91 and replace "MacOSX(10" with "MacOSX(11".
+
+#### Configuring
+`mkdir qt5-install`
+`mkdir qt5-build`
+`cd ../qt5-build`
+
+`../configure -force-debug-info -opensource -confirm-license -qt-zlib -qt-libjpeg -qt-libpng -qt-freetype -qt-pcre -qt-harfbuzz -nomake examples -nomake tests -skip qttranslations -skip qtserialport -skip qt3d -skip qtlocation -skip qtwayland -skip qtsensors -skip qtgamepad -skip qtcharts -skip qtx11extras -skip qtmacextras -skip qtvirtualkeyboard -skip qtpurchasing -skip qtdatavis3d -no-warnings-are-errors -no-pch -prefix ../qt5-install`
+
+#### Make
+`make`
+`make install`
+
+#### Fixing
+1. The *.prl* files have an absolute path that needs to be removed (see http://www.linuxfromscratch.org/blfs/view/stable-systemd/x/qtwebengine.html)
+`cd` to the `qt5-install directory`
+`find . -name \*.prl -exec sed -i -e '/^QMAKE_PRL_BUILD_DIR/d' {} \;`
+`cd ..`
+1. Note: you may have additional files in qt5-install/lib and qt5-install/lib/pkg/pkgconfig that have your local build absolute path included. Optionally you can fix these as well, but it will not effect the build if left alone.
+
+Add a *qt.conf* file.
+1. Copy the file *qt5-build\qtbase\bin\qt.conf* to *qt5-install\bin*
+1. Edit the *qt.conf* file: replace all absolute URLs with relative URLs (beginning with .. or .)
+
+#### Uploading
+`tar -zcvf qt5-install-5.15.2-macos.tar.gz qt5-install`
+Upload qt5-install-5.15.2-macos.tar.gz to our Amazon S3 vircadia-public bucket, under the dependencies/vckpg directory
+
+#### Creating symbols (optional)
+Run `python3 prepare-mac-symbols-for-backtrace.py qt5-install` to scan the qt5-build directory for any dylibs and execute dsymutil to create dSYM bundles. After running this command the backtrace directory will be created. Zip this directory up, but make sure that all dylibs and dSYM fiels are in the root of the zip file, not under a sub-directory. This file can then be uploaded to backtrace or other crash log handling tool.
+
## Problems
*configure* errors, if any, may be viewed in **config.log** and **config.summary**
diff --git a/tools/qt-builder/patches/aec.patch b/tools/qt-builder/patches/aec.patch
deleted file mode 100644
index be159d857a..0000000000
--- a/tools/qt-builder/patches/aec.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-diff --git a/qtmultimedia/src/plugins/opensles/qopenslesaudioinput.cpp b/qtmultimedia/src/plugins/opensles/qopenslesaudioinput.cpp
-index ad87cb0..54ed18a 100644
---- a/qtmultimedia/src/plugins/opensles/qopenslesaudioinput.cpp
-+++ b/qtmultimedia/src/plugins/opensles/qopenslesaudioinput.cpp
-@@ -117,6 +117,8 @@ QOpenSLESAudioInput::QOpenSLESAudioInput(const QByteArray &device)
- m_recorderPreset = SL_ANDROID_RECORDING_PRESET_CAMCORDER;
- else if (qstrcmp(device, QT_ANDROID_PRESET_VOICE_RECOGNITION) == 0)
- m_recorderPreset = SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION;
-+ else if (qstrcmp(device, QT_ANDROID_PRESET_VOICE_COMMUNICATION) == 0)
-+ m_recorderPreset = SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION;
- else
- m_recorderPreset = SL_ANDROID_RECORDING_PRESET_GENERIC;
- #endif
-diff --git a/qtmultimedia/src/plugins/opensles/qopenslesaudioinput.h b/qtmultimedia/src/plugins/opensles/qopenslesaudioinput.h
-index ad84db0..35cc379 100644
---- a/qtmultimedia/src/plugins/opensles/qopenslesaudioinput.h
-+++ b/qtmultimedia/src/plugins/opensles/qopenslesaudioinput.h
-@@ -50,6 +50,7 @@
- #define QT_ANDROID_PRESET_MIC "mic"
- #define QT_ANDROID_PRESET_CAMCORDER "camcorder"
- #define QT_ANDROID_PRESET_VOICE_RECOGNITION "voicerecognition"
-+#define QT_ANDROID_PRESET_VOICE_COMMUNICATION "voicecommunication"
-
- #endif
-
-diff --git a/qtmultimedia/src/plugins/opensles/qopenslesengine.cpp b/qtmultimedia/src/plugins/opensles/qopenslesengine.cpp
-index 1a16cc2..2577fb3 100644
---- a/qtmultimedia/src/plugins/opensles/qopenslesengine.cpp
-+++ b/qtmultimedia/src/plugins/opensles/qopenslesengine.cpp
-@@ -114,7 +114,8 @@ QList QOpenSLESEngine::availableDevices(QAudio::Mode mode) const
- #ifdef ANDROID
- devices << QT_ANDROID_PRESET_MIC
- << QT_ANDROID_PRESET_CAMCORDER
-- << QT_ANDROID_PRESET_VOICE_RECOGNITION;
-+ << QT_ANDROID_PRESET_VOICE_RECOGNITION
-+ << QT_ANDROID_PRESET_VOICE_COMMUNICATION;
- #else
- devices << "default";
- #endif
-
\ No newline at end of file
diff --git a/tools/qt-builder/patches/mac-web-video.patch b/tools/qt-builder/patches/mac-web-video.patch
deleted file mode 100644
index 2ea81ce18b..0000000000
--- a/tools/qt-builder/patches/mac-web-video.patch
+++ /dev/null
@@ -1,247 +0,0 @@
-Submodule qtwebengine contains modified content
-diff --git a/qtwebengine/src/core/stream_video_node.cpp b/qtwebengine/src/core/stream_video_node.cpp
-index 29922f86..baa39d3b 100644
---- a/qtwebengine/src/core/stream_video_node.cpp
-+++ b/qtwebengine/src/core/stream_video_node.cpp
-@@ -62,38 +62,45 @@ protected:
- const char *vertexShader() const override {
- // Keep in sync with cc::VertexShaderVideoTransform
- static const char *shader =
-- "attribute highp vec4 a_position;\n"
-- "attribute mediump vec2 a_texCoord;\n"
-- "uniform highp mat4 matrix;\n"
-- "uniform highp mat4 texMatrix;\n"
-- "varying mediump vec2 v_texCoord;\n"
-- "void main() {\n"
-- " gl_Position = matrix * a_position;\n"
-- " v_texCoord = vec4(texMatrix * vec4(a_texCoord.x, 1.0 - a_texCoord.y, 0.0, 1.0)).xy;\n"
-- "}";
-+ R"SHADER(#version 150 core
-+in vec4 a_position;
-+in vec2 a_texCoord;
-+uniform mat4 matrix;
-+uniform mat4 texMatrix;
-+out vec2 v_texCoord;
-+void main() {
-+ gl_Position = matrix * a_position;
-+ v_texCoord = vec4(texMatrix * vec4(a_texCoord.x, 1.0 - a_texCoord.y, 0.0, 1.0)).xy;
-+}
-+ )SHADER";
- return shader;
- }
-
- const char *fragmentShader() const override {
- // Keep in sync with cc::FragmentShaderRGBATexAlpha
- static const char *shaderExternal =
-- "#extension GL_OES_EGL_image_external : require\n"
-- "varying mediump vec2 v_texCoord;\n"
-- "uniform samplerExternalOES s_texture;\n"
-- "uniform lowp float alpha;\n"
-- "void main() {\n"
-- " lowp vec4 texColor = texture2D(s_texture, v_texCoord);\n"
-- " gl_FragColor = texColor * alpha;\n"
-- "}";
-+ R"SHADER(#version 150 core
-+#extension GL_OES_EGL_image_external : require
-+in vec2 v_texCoord;
-+uniform samplerExternalOES s_texture;
-+uniform float alpha;
-+out vec4 fragColor;
-+void main() {
-+ vec4 texColor = texture(s_texture, v_texCoord);
-+ fragColor = texColor * alpha;
-+}
-+ )SHADER";
- static const char *shader2DRect =
-- "#extension GL_ARB_texture_rectangle : require\n"
-- "varying mediump vec2 v_texCoord;\n"
-- "uniform sampler2DRect s_texture;\n"
-- "uniform lowp float alpha;\n"
-- "void main() {\n"
-- " lowp vec4 texColor = texture2DRect(s_texture, v_texCoord);\n"
-- " gl_FragColor = texColor * alpha;\n"
-- "}";
-+ R"SHADER(#version 150 core
-+in vec2 v_texCoord;
-+uniform sampler2D s_texture;
-+uniform float alpha;
-+out vec4 fragColor;
-+void main() {
-+ vec4 texColor = texture(s_texture, v_texCoord);
-+ fragColor = texColor * alpha;
-+}
-+ )SHADER";
- if (m_target == ExternalTarget)
- return shaderExternal;
- else
-diff --git a/qtwebengine/src/core/yuv_video_node.cpp b/qtwebengine/src/core/yuv_video_node.cpp
-index 4a436d95..dc4b6ff9 100644
---- a/qtwebengine/src/core/yuv_video_node.cpp
-+++ b/qtwebengine/src/core/yuv_video_node.cpp
-@@ -59,39 +59,41 @@ public:
- YUVVideoMaterialShader(const gfx::ColorSpace &colorSpace)
- {
- static const char *shaderHead =
-- "varying mediump vec2 v_yaTexCoord;\n"
-- "varying mediump vec2 v_uvTexCoord;\n"
-- "uniform sampler2D y_texture;\n"
-- "uniform sampler2D u_texture;\n"
-- "uniform sampler2D v_texture;\n"
-- "uniform mediump float alpha;\n"
-- "uniform mediump vec4 ya_clamp_rect;\n"
-- "uniform mediump vec4 uv_clamp_rect;\n";
-- static const char *shader =
-- "void main() {\n"
-- " mediump vec2 ya_clamped =\n"
-- " max(ya_clamp_rect.xy, min(ya_clamp_rect.zw, v_yaTexCoord));\n"
-- " mediump float y_raw = texture2D(y_texture, ya_clamped).x;\n"
-- " mediump vec2 uv_clamped =\n"
-- " max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord));\n"
-- " mediump float u_unsigned = texture2D(u_texture, uv_clamped).x;\n"
-- " mediump float v_unsigned = texture2D(v_texture, uv_clamped).x;\n"
-- " mediump vec3 yuv = vec3(y_raw, u_unsigned, v_unsigned);\n"
-- " mediump vec3 rgb = DoColorConversion(yuv);\n"
-- " gl_FragColor = vec4(rgb, 1.0) * alpha;\n"
-- "}";
-+ R"SHADER(#version 150 core
-+in vec2 v_yaTexCoord;
-+in vec2 v_uvTexCoord;
-+uniform sampler2D y_texture;
-+uniform sampler2D u_texture;
-+uniform sampler2D v_texture;
-+uniform float alpha;
-+uniform vec4 ya_clamp_rect;
-+uniform vec4 uv_clamp_rect;
-+out vec4 fragColor;
-+ )SHADER";
-+
-+ static const char *shader = R"SHADER(
-+void main() {
-+ vec2 ya_clamped =
-+ max(ya_clamp_rect.xy, min(ya_clamp_rect.zw, v_yaTexCoord));
-+ float y_raw = texture(y_texture, ya_clamped).x;
-+ vec2 uv_clamped =
-+ max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord));
-+ float u_unsigned = texture(u_texture, uv_clamped).x;
-+ float v_unsigned = texture(v_texture, uv_clamped).x;
-+ vec3 yuv = vec3(y_raw, u_unsigned, v_unsigned);
-+ vec3 rgb = DoColorConversion(yuv);
-+ fragColor = vec4(rgb, 1.0) * alpha;
-+}
-+ )SHADER";
-+
- // Invalid or unspecified color spaces should be treated as REC709.
- gfx::ColorSpace src = colorSpace.IsValid() ? colorSpace : gfx::ColorSpace::CreateREC709();
- gfx::ColorSpace dst = gfx::ColorSpace::CreateSRGB();
- std::unique_ptr transform =
- gfx::ColorTransform::NewColorTransform(src, dst, gfx::ColorTransform::Intent::INTENT_PERCEPTUAL);
-
-- QByteArray header(shaderHead);
-- if (QOpenGLContext::currentContext()->isOpenGLES())
-- header = QByteArray("precision mediump float;\n") + header;
--
- m_csShader = QByteArray::fromStdString(transform->GetShaderSource());
-- m_fragmentShader = header + m_csShader + QByteArray(shader);
-+ m_fragmentShader = QByteArray(shaderHead) + m_csShader + QByteArray(shader);
- }
- void updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override;
-
-@@ -108,20 +110,22 @@ protected:
- const char *vertexShader() const override {
- // Keep in sync with logic in VertexShader in components/viz/service/display/shader.cc
- const char *shader =
-- "attribute highp vec4 a_position;\n"
-- "attribute mediump vec2 a_texCoord;\n"
-- "uniform highp mat4 matrix;\n"
-- "varying mediump vec2 v_yaTexCoord;\n"
-- "varying mediump vec2 v_uvTexCoord;\n"
-- "uniform mediump vec2 yaTexScale;\n"
-- "uniform mediump vec2 yaTexOffset;\n"
-- "uniform mediump vec2 uvTexScale;\n"
-- "uniform mediump vec2 uvTexOffset;\n"
-- "void main() {\n"
-- " gl_Position = matrix * a_position;\n"
-- " v_yaTexCoord = a_texCoord * yaTexScale + yaTexOffset;\n"
-- " v_uvTexCoord = a_texCoord * uvTexScale + uvTexOffset;\n"
-- "}";
-+ R"SHADER(#version 150 core
-+in vec4 a_position;
-+in vec2 a_texCoord;
-+uniform mat4 matrix;
-+out vec2 v_yaTexCoord;
-+out vec2 v_uvTexCoord;
-+uniform vec2 yaTexScale;
-+uniform vec2 yaTexOffset;
-+uniform vec2 uvTexScale;
-+uniform vec2 uvTexOffset;
-+void main() {
-+ gl_Position = matrix * a_position;
-+ v_yaTexCoord = a_texCoord * yaTexScale + yaTexOffset;
-+ v_uvTexCoord = a_texCoord * uvTexScale + uvTexOffset;
-+}
-+ )SHADER";
- return shader;
- }
-
-@@ -168,33 +172,35 @@ public:
- YUVAVideoMaterialShader(const gfx::ColorSpace &colorSpace) : YUVVideoMaterialShader(colorSpace)
- {
- static const char *shaderHead =
-- "varying mediump vec2 v_yaTexCoord;\n"
-- "varying mediump vec2 v_uvTexCoord;\n"
-- "uniform sampler2D y_texture;\n"
-- "uniform sampler2D u_texture;\n"
-- "uniform sampler2D v_texture;\n"
-- "uniform sampler2D a_texture;\n"
-- "uniform mediump float alpha;\n"
-- "uniform mediump vec4 ya_clamp_rect;\n"
-- "uniform mediump vec4 uv_clamp_rect;\n";
-+ R"SHADER(#version 150 core
-+in vec2 v_yaTexCoord;
-+in vec2 v_uvTexCoord;
-+uniform sampler2D y_texture;
-+uniform sampler2D u_texture;
-+uniform sampler2D v_texture;
-+uniform sampler2D a_texture;
-+uniform float alpha;
-+uniform vec4 ya_clamp_rect;
-+uniform vec4 uv_clamp_rect;
-+out vec4 fragColor;
-+ )SHADER";
- static const char *shader =
-- "void main() {\n"
-- " mediump vec2 ya_clamped =\n"
-- " max(ya_clamp_rect.xy, min(ya_clamp_rect.zw, v_yaTexCoord));\n"
-- " mediump float y_raw = texture2D(y_texture, ya_clamped).x;\n"
-- " mediump vec2 uv_clamped =\n"
-- " max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord));\n"
-- " mediump float u_unsigned = texture2D(u_texture, uv_clamped).x;\n"
-- " mediump float v_unsigned = texture2D(v_texture, uv_clamped).x;\n"
-- " mediump float a_raw = texture2D(a_texture, ya_clamped).x;\n"
-- " mediump vec3 yuv = vec3(y_raw, u_unsigned, v_unsigned);\n"
-- " mediump vec3 rgb = DoColorConversion(yuv);\n"
-- " gl_FragColor = vec4(rgb, 1.0) * (alpha * a_raw);\n"
-- "}";
-- QByteArray header(shaderHead);
-- if (QOpenGLContext::currentContext()->isOpenGLES())
-- header = QByteArray("precision mediump float;\n") + header;
-- m_fragmentShader = header + m_csShader + QByteArray(shader);
-+ R"SHADER(
-+void main() {
-+ vec2 ya_clamped =
-+ max(ya_clamp_rect.xy, min(ya_clamp_rect.zw, v_yaTexCoord));
-+ float y_raw = texture(y_texture, ya_clamped).x;
-+ vec2 uv_clamped =
-+ max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord));
-+ float u_unsigned = texture(u_texture, uv_clamped).x;
-+ float v_unsigned = texture(v_texture, uv_clamped).x;
-+ float a_raw = texture(a_texture, ya_clamped).x;
-+ vec3 yuv = vec3(y_raw, u_unsigned, v_unsigned);
-+ vec3 rgb = DoColorConversion(yuv);
-+ fragColor = vec4(rgb, 1.0) * (alpha * a_raw);
-+}
-+ )SHADER";
-+ m_fragmentShader = QByteArray(shaderHead) + m_csShader + QByteArray(shader);
- }
- void updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override;
-
diff --git a/tools/qt-builder/patches/qfloat16.patch b/tools/qt-builder/patches/qfloat16.patch
deleted file mode 100644
index 2773573264..0000000000
--- a/tools/qt-builder/patches/qfloat16.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-diff --git a/qtbase/src/corelib/global/qfloat16.h b/qtbase/src/corelib/global/qfloat16.h
-index 3e50ad8467..2453ff8847 100644
---- a/qtbase/src/corelib/global/qfloat16.h
-+++ b/qtbase/src/corelib/global/qfloat16.h
-@@ -83,7 +83,9 @@ private:
- Q_CORE_EXPORT static const quint32 shifttable[];
-
- friend bool qIsNull(qfloat16 f) Q_DECL_NOTHROW;
-+#if ! defined(QT_NO_FLOAT16_OPERATORS)
- friend qfloat16 operator-(qfloat16 a) Q_DECL_NOTHROW;
-+#endif
- };
-
- Q_DECLARE_TYPEINFO(qfloat16, Q_PRIMITIVE_TYPE);
-@@ -165,6 +167,7 @@ inline qfloat16::operator float() const Q_DECL_NOTHROW
- }
- #endif
-
-+#if ! defined(QT_NO_FLOAT16_OPERATORS)
- inline qfloat16 operator-(qfloat16 a) Q_DECL_NOTHROW
- {
- qfloat16 f;
-@@ -206,11 +209,12 @@ QF16_MAKE_ARITH_OP_INT(-)
- QF16_MAKE_ARITH_OP_INT(*)
- QF16_MAKE_ARITH_OP_INT(/)
- #undef QF16_MAKE_ARITH_OP_INT
--
-+#endif
- QT_WARNING_PUSH
- QT_WARNING_DISABLE_CLANG("-Wfloat-equal")
- QT_WARNING_DISABLE_GCC("-Wfloat-equal")
-
-+#if ! defined(QT_NO_FLOAT16_OPERATORS)
- inline bool operator>(qfloat16 a, qfloat16 b) Q_DECL_NOTHROW { return static_cast(a) > static_cast(b); }
- inline bool operator<(qfloat16 a, qfloat16 b) Q_DECL_NOTHROW { return static_cast(a) < static_cast(b); }
- inline bool operator>=(qfloat16 a, qfloat16 b) Q_DECL_NOTHROW { return static_cast(a) >= static_cast(b); }
-@@ -244,6 +248,7 @@ QF16_MAKE_BOOL_OP_INT(<=)
- QF16_MAKE_BOOL_OP_INT(==)
- QF16_MAKE_BOOL_OP_INT(!=)
- #undef QF16_MAKE_BOOL_OP_INT
-+#endif
-
- QT_WARNING_POP
-
diff --git a/tools/qt-builder/patches/qtscript-crash-fix.patch b/tools/qt-builder/patches/qtscript-crash-fix.patch
deleted file mode 100644
index 0a659fe9e3..0000000000
--- a/tools/qt-builder/patches/qtscript-crash-fix.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-diff --git a/qtscript/src/script/api/qscriptengine.cpp b/qtscript/src/script/api/qscriptengine.cpp
-index c5f437b..942833e 100644
---- a/qtscript/src/script/api/qscriptengine.cpp
-+++ b/qtscript/src/script/api/qscriptengine.cpp
-@@ -1332,8 +1332,10 @@ void QScriptEnginePrivate::collectGarbage()
-
- void QScriptEnginePrivate::reportAdditionalMemoryCost(int size)
- {
-- if (size > 0)
-+ if (size > 0) {
-+ QScript::APIShim shim(this);
- globalData->heap.reportExtraMemoryCost(size);
-+ }
- }
-
- QScript::TimeoutCheckerProxy *QScriptEnginePrivate::timeoutChecker() const
diff --git a/tools/qt-builder/patches/win-qtwebengine.diff b/tools/qt-builder/patches/win-qtwebengine.diff
new file mode 100644
index 0000000000..8fc72c2f85
--- /dev/null
+++ b/tools/qt-builder/patches/win-qtwebengine.diff
@@ -0,0 +1,67 @@
+From 138a7203f16cf356e9d4dac697920a22437014b0 Mon Sep 17 00:00:00 2001
+From: Peter Varga
+Date: Fri, 13 Nov 2020 11:09:23 +0100
+Subject: [PATCH] Fix build with msvc2019 16.8.0
+
+Fixes: QTBUG-88708
+Change-Id: I3554ceec0437801b4861f68edd504d01fc01cf93
+Reviewed-by: Allan Sandfeld Jensen
+---
+
+diff --git a/qtwebengine/src/3rdparty/chromium/third_party/angle/src/common/mathutil.cpp b/qtwebengine/src/3rdparty/chromium/third_party/angle/src/common/mathutil.cpp
+index 306cde1..d4f1034 100644
+--- a/qtwebengine/src/3rdparty/chromium/third_party/angle/src/common/mathutil.cpp
++++ b/qtwebengine/src/3rdparty/chromium/third_party/angle/src/common/mathutil.cpp
+@@ -72,11 +72,11 @@
+ const RGB9E5Data *inputData = reinterpret_cast(&input);
+
+ *red =
+- inputData->R * pow(2.0f, (int)inputData->E - g_sharedexp_bias - g_sharedexp_mantissabits);
++ inputData->R * (float)pow(2.0f, (int)inputData->E - g_sharedexp_bias - g_sharedexp_mantissabits);
+ *green =
+- inputData->G * pow(2.0f, (int)inputData->E - g_sharedexp_bias - g_sharedexp_mantissabits);
++ inputData->G * (float)pow(2.0f, (int)inputData->E - g_sharedexp_bias - g_sharedexp_mantissabits);
+ *blue =
+- inputData->B * pow(2.0f, (int)inputData->E - g_sharedexp_bias - g_sharedexp_mantissabits);
++ inputData->B * (float)pow(2.0f, (int)inputData->E - g_sharedexp_bias - g_sharedexp_mantissabits);
+ }
+
+ } // namespace gl
+diff --git a/qtwebengine/src/3rdparty/chromium/third_party/blink/renderer/platform/graphics/lab_color_space.h b/qtwebengine/src/3rdparty/chromium/third_party/blink/renderer/platform/graphics/lab_color_space.h
+index 78c316e..136c796 100644
+--- a/qtwebengine/src/3rdparty/chromium/third_party/blink/renderer/platform/graphics/lab_color_space.h
++++ b/qtwebengine/src/3rdparty/chromium/third_party/blink/renderer/platform/graphics/lab_color_space.h
+@@ -130,7 +130,7 @@
+ // https://en.wikipedia.org/wiki/CIELAB_color_space#Forward_transformation.
+ FloatPoint3D toXYZ(const FloatPoint3D& lab) const {
+ auto invf = [](float x) {
+- return x > kSigma ? pow(x, 3) : 3 * kSigma2 * (x - 4.0f / 29.0f);
++ return x > kSigma ? (float)pow(x, 3) : 3 * kSigma2 * (x - 4.0f / 29.0f);
+ };
+
+ FloatPoint3D v = {clamp(lab.X(), 0.0f, 100.0f),
+diff --git a/qtwebengine/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/timestamped_trace_piece.h b/qtwebengine/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/timestamped_trace_piece.h
+index 02363d0..8860287 100644
+--- a/qtwebengine/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/timestamped_trace_piece.h
++++ b/qtwebengine/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/timestamped_trace_piece.h
+@@ -198,6 +198,20 @@
+ return *this;
+ }
+
++#if PERFETTO_BUILDFLAG(PERFETTO_COMPILER_MSVC)
++ TimestampedTracePiece& operator=(TimestampedTracePiece&& ttp) const
++ {
++ if (this != &ttp) {
++ // First invoke the destructor and then invoke the move constructor
++ // inline via placement-new to implement move-assignment.
++ this->~TimestampedTracePiece();
++ new (const_cast(this)) TimestampedTracePiece(std::move(ttp));
++ }
++
++ return const_cast(*this);
++ }
++#endif // PERFETTO_BUILDFLAG(PERFETTO_COMPILER_MSVC)
++
+ ~TimestampedTracePiece() {
+ switch (type) {
+ case Type::kInvalid:
diff --git a/tools/qt-builder/qt5vars.bat b/tools/qt-builder/qt5vars.bat
index 22a976827b..e3111478a3 100644
--- a/tools/qt-builder/qt5vars.bat
+++ b/tools/qt-builder/qt5vars.bat
@@ -1,9 +1,9 @@
@echo off
-REM Set up \Microsoft Visual Studio 2017, where is \c amd64, \c x86, etc.
-CALL "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
+REM Set up \Microsoft Visual Studio 2019, where is \c amd64, \c x86, etc.
+CALL "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
-REM Edit this location to point to the source code of Qt
+REM Edit the following line to point to the drive and path of the Qt source code
SET _ROOT=..\qt5
SET PATH=%_ROOT%\qtbase\bin;%_ROOT%\gnuwin32\bin;%PATH%
diff --git a/tools/skeleton-dump/CMakeLists.txt b/tools/skeleton-dump/CMakeLists.txt
index 7d4248d171..38aaa3832b 100644
--- a/tools/skeleton-dump/CMakeLists.txt
+++ b/tools/skeleton-dump/CMakeLists.txt
@@ -1,6 +1,7 @@
set(TARGET_NAME skeleton-dump)
setup_hifi_project(Core)
setup_memory_debugger()
-link_hifi_libraries(shared fbx hfm graphics gpu gl animation)
+setup_thread_debugger()
+link_hifi_libraries(shared model-serializers hfm graphics gpu gl animation)
include_hifi_library_headers(image)
diff --git a/tools/vhacd-util/CMakeLists.txt b/tools/vhacd-util/CMakeLists.txt
index cc8760fa2d..5d7fba79e3 100644
--- a/tools/vhacd-util/CMakeLists.txt
+++ b/tools/vhacd-util/CMakeLists.txt
@@ -1,12 +1,13 @@
set(TARGET_NAME vhacd-util)
setup_hifi_project(Core)
-link_hifi_libraries(shared fbx hfm graphics gpu gl)
+link_hifi_libraries(shared model-serializers hfm graphics gpu gl)
include_hifi_library_headers(image)
target_vhacd()
setup_memory_debugger()
+setup_thread_debugger()
if (WIN32)
package_libraries_for_deployment()
diff --git a/vircadia-web b/vircadia-web
new file mode 160000
index 0000000000..d2e383cab8
--- /dev/null
+++ b/vircadia-web
@@ -0,0 +1 @@
+Subproject commit d2e383cab811018422433fe0d8f224e53e0506cf