Merge remote-tracking branch 'upstream/kasen/core' into blendshapes

This commit is contained in:
HifiExperiments 2020-04-03 14:35:21 -07:00
commit c062cb75ae
253 changed files with 93727 additions and 914 deletions

View file

@ -1,9 +1,13 @@
# General Build Information
*Last Updated on December 21, 2019*
### OS Specific Build Guides ### OS Specific Build Guides
* [BUILD_WIN.md](BUILD_WIN.md) - complete instructions for Windows. * [Build Windows](BUILD_WIN.md) - complete instructions for Windows.
* [BUILD_OSX.md](BUILD_OSX.md) - additional instructions for OS X. * [Build Linux](BUILD_LINUX.md) - additional instructions for Linux.
* [BUILD_LINUX.md](BUILD_LINUX.md) - additional instructions for Linux. * [Build OSX](BUILD_OSX.md) - additional instructions for OS X.
* [BUILD_ANDROID.md](BUILD_ANDROID.md) - additional instructions for Android * [Build Android](BUILD_ANDROID.md) - additional instructions for Android
### Dependencies ### Dependencies
- [git](https://git-scm.com/downloads): >= 1.6 - [git](https://git-scm.com/downloads): >= 1.6
@ -21,10 +25,10 @@ These dependencies need not be installed manually. They are automatically downlo
- [QuaZip](https://sourceforge.net/projects/quazip/files/quazip/): 0.7.3 - [QuaZip](https://sourceforge.net/projects/quazip/files/quazip/): 0.7.3
- [SDL2](https://www.libsdl.org/download-2.0.php): 2.0.3 - [SDL2](https://www.libsdl.org/download-2.0.php): 2.0.3
- [Intel Threading Building Blocks](https://www.threadingbuildingblocks.org/): 4.3 - [Intel Threading Building Blocks](https://www.threadingbuildingblocks.org/): 4.3
- [vcpkg](https://github.com/highfidelity/vcpkg): - [vcpkg](https://github.com/hifi-archive/vcpkg):
- [VHACD](https://github.com/virneo/v-hacd) - [VHACD](https://github.com/virneo/v-hacd)
- [zlib](http://www.zlib.net/): 1.28 (Win32 only) - [zlib](http://www.zlib.net/): 1.28 (Win32 only)
- [nvtt](https://github.com/highfidelity/nvidia-texture-tools): 2.1.1 (customized) - [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. 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.
@ -32,7 +36,7 @@ These are not placed in your normal build tree when doing an out of source build
#### CMake #### CMake
Hifi uses CMake to generate build files and project files for your platform. Athena 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.12.3 using vcpkg.
@ -47,7 +51,7 @@ This can either be entered directly into your shell session before you build or
#### Vcpkg #### Vcpkg
Hifi uses vcpkg to download and build dependencies. Athena uses vcpkg to download and build dependencies.
You do not need to install vcpkg. 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. Building the dependencies can be lengthy and the resulting files will be stored in your OS temp directory.

View file

@ -1,6 +1,10 @@
# Build Android
*Last Updated on December 21, 2019*
Please read the [general build guide](BUILD.md) for information on building other platforms. Only Android specific instructions are found in this file. **Note that these instructions apply to building for Oculus Quest.** Please read the [general build guide](BUILD.md) for information on building other platforms. Only Android specific instructions are found in this file. **Note that these instructions apply to building for Oculus Quest.**
# Dependencies ## Dependencies
Building is currently supported on Windows, OSX and Linux, but developers intending to do work on the library dependencies are strongly urged to use 64 bit Linux as a build platform. Building is currently supported on Windows, OSX and Linux, but developers intending to do work on the library dependencies are strongly urged to use 64 bit Linux as a build platform.
@ -27,7 +31,7 @@ Still in the _SDK Tools_ tab, click _Show Package Details_. Select CMake 3.6.4.
Also, make sure the NDK installed version is 18 (or higher). Also, make sure the NDK installed version is 18 (or higher).
# Environment ## Environment
### Create a keystore in Android Studio ### Create a keystore in Android Studio
Follow the directions [here](https://developer.android.com/studio/publish/app-signing#generate-key) to create a keystore file. You can save it anywhere (preferably not in the `hifi` folder). Follow the directions [here](https://developer.android.com/studio/publish/app-signing#generate-key) to create a keystore file. You can save it anywhere (preferably not in the `hifi` folder).
@ -62,9 +66,9 @@ The above code to suppress modules is not necessary, but will speed up the build
### Clone the repository ### Clone the repository
`git clone https://github.com/highfidelity/hifi.git ` `git clone https://github.com/kasenvr/project-athena.git`
# Building & Running ## Building & Running
### Building Modules ### Building Modules
@ -99,9 +103,9 @@ For the interface modules, you also need to select the activity to launch.
Note the 's' in Permission**s**Checker for the Quest. Note the 's' in Permission**s**Checker for the Quest.
Now you are able to run your module! Click the green play button in the top toolbar of Android Studio Now you are able to run your module! Click the green play button in the top toolbar of Android Studio.
r
# Troubleshooting ## Troubleshooting
To view a more complete debug log, To view a more complete debug log,

View file

@ -1,4 +1,6 @@
# Linux build guide # Build Linux
*Last Updated on January 20, 2020*
Please read the [general build guide](BUILD.md) for information on dependencies required for all platforms. Only Linux specific instructions are found in this file. Please read the [general build guide](BUILD.md) for information on dependencies required for all platforms. Only Linux specific instructions are found in this file.
@ -14,88 +16,86 @@ sudo add-apt-repository universe
sudo apt-get update sudo apt-get update
``` ```
#### Install build tools: #### Install build tools:
1. First update the repositiories: - First update the repositories:
```bash ```bash
sudo apt-get update -y sudo apt-get update -y
sudo apt-get upgrade -y sudo apt-get upgrade -y
``` ```
1. git - git
```bash ```bash
sudo apt-get install git -y sudo apt-get install git -y
``` ```
Verify by git --version Verify by git --version
1. g++ - g++
```bash ```bash
sudo apt-get install g++ -y sudo apt-get install g++ -y
``` ```
Verify by g++ --version Verify by g++ --version
1. *Ubuntu 18.04* cmake - *Ubuntu 18.04* cmake
```bash ```bash
sudo apt-get install cmake -y sudo apt-get install cmake -y
``` ```
Verify by git --version Verify by cmake --version
1. *Ubuntu 16.04* cmake - *Ubuntu 16.04* cmake
```bash ```bash
wget https://cmake.org/files/v3.14/cmake-3.14.2-Linux-x86_64.sh wget https://cmake.org/files/v3.14/cmake-3.14.2-Linux-x86_64.sh
sudo sh cmake-3.14.2-Linux-x86_64.sh --prefix=/usr/local --exclude-subdir sudo sh cmake-3.14.2-Linux-x86_64.sh --prefix=/usr/local --exclude-subdir
``` ```
#### Install build dependencies: #### Install build dependencies:
1. OpenSSL - OpenSSL:
```bash ```bash
sudo apt-get install libssl-dev sudo apt-get install libssl-dev
``` ```
Verify with `openssl version` Verify with `openssl version`
1. OpenGL - OpenGL:
Verify (first install mesa-utils - `sudo apt install mesa-utils -y`) by `glxinfo | grep "OpenGL version"`
```bash ```bash
sudo apt-get install libgl1-mesa-dev -y 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 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 OpenGL:
- First install mesa-utils with the command `sudo apt install mesa-utils -y`
- Then run `glxinfo | grep "OpenGL version"`
#### To compile interface in a server you must install: #### To compile interface in a server you must install:
```bash ```bash
sudo apt-get -y install libpulse0 libnss3 libnspr4 libfontconfig1 libxcursor1 libxcomposite1 libxtst6 libxslt1.1 sudo apt-get -y install libpulse0 libnss3 libnspr4 libfontconfig1 libxcursor1 libxcomposite1 libxtst6 libxslt1.1
``` ```
1. Misc dependencies - Misc dependencies:
```bash ```bash
sudo apt-get install libasound2 libxmu-dev libxi-dev freeglut3-dev libasound2-dev libjack0 libjack-dev libxrandr-dev libudev-dev libssl-dev zlib1g-dev sudo apt-get install libasound2 libxmu-dev libxi-dev freeglut3-dev libasound2-dev libjack0 libjack-dev libxrandr-dev libudev-dev libssl-dev zlib1g-dev
``` ```
1. To compile interface in a server you must install: - Install Python 3 and required packages:
```bash ```bash
sudo apt-get -y install libpulse0 libnss3 libnspr4 libfontconfig1 libxcursor1 libxcomposite1 libxtst6 libxslt1.1 sudo apt-get install python python3 python3-distro
``` ```
1. Install Python 3: - Install node, required to build the jsdoc documentation:
```bash
sudo apt-get install python3.6
```
1. Install node, required to build the jsdoc documentation
```bash ```bash
sudo apt-get install nodejs sudo apt-get install nodejs
``` ```
### Get code and checkout the tag you need ### Get code and checkout the branch you need
Clone this repository: Clone this repository:
```bash ```bash
git clone https://github.com/highfidelity/hifi.git git clone https://github.com/kasenvr/project-athena.git
``` ```
To compile a RELEASE version checkout the tag you need getting a list of all tags: To compile a DEV version checkout the branch you need. To get a list of all tags:
```bash ```bash
git fetch -a git fetch -a
git tags
``` ```
Then checkout last tag with: Then checkout the main branch with:
```bash ```bash
git checkout tags/v0.79.0 git checkout kasen/core
``` ```
### Compiling ### Compiling
Create the build directory: Create the build directory:
```bash ```bash
mkdir -p hifi/build cd project-athena
cd hifi/build mkdir build
cd build
``` ```
Prepare makefiles: Prepare makefiles:
@ -103,7 +103,7 @@ Prepare makefiles:
cmake .. cmake ..
``` ```
* If cmake fails with a vcpkg error - delete /tmp/hifi/vcpkg. - If cmake fails with a vcpkg error - delete /tmp/hifi/vcpkg.
Start compilation of the server and get a cup of coffee: Start compilation of the server and get a cup of coffee:
```bash ```bash
@ -115,7 +115,15 @@ To compile interface:
make interface make interface
``` ```
In a server, it does not make sense to compile interface The commands above will compile with a single thread. If you have enough memory,
you can decrease your build time using the `-j` flag. Since most x64 CPUs
support two threads per core, this works out to CPU_COUNT*2. As an example, if
you have a 2 core machine, you could use:
```
make -j4 interface
```
In a server, it does not make sense to compile interface.
### Running the software ### Running the software
@ -142,6 +150,13 @@ Running interface:
Go to localhost in the running interface. Go to localhost in the running interface.
#### Notes
If your goal is to set up a development environment, it is desirable to set the
directory that vcpkg builds into with the `HIFI_VCPKG_BASE` environment variable.
For example, you might set `HIFI_VCPKG_BASE` to `/home/$USER/vcpkg`.
By default, vcpkg will build in the system `/tmp` directory.
##### Ubuntu 18.04 only ##### Ubuntu 18.04 only
In Ubuntu 18.04 there is a problem related with NVidia driver library version. In Ubuntu 18.04 there is a problem related with NVidia driver library version.
@ -169,11 +184,11 @@ It can be worked around following these steps:
`make` `make`
`sudo make install` `sudo make install`
1.. Link compiled files: 1. Link compiled files:
`sudo ln -s /usr/local/lib/libnvcore.so /usr/lib/libnvcore.so` `sudo ln -s /usr/local/lib/libnvcore.so /usr/lib/libnvcore.so`
`sudo ln -s /usr/local/lib/libnvimage.so /usr/lib/libnvimage.so` `sudo ln -s /usr/local/lib/libnvimage.so /usr/lib/libnvimage.so`
`sudo ln -s /usr/local/lib/libnvmath.so /usr/lib/libnvmath.so` `sudo ln -s /usr/local/lib/libnvmath.so /usr/lib/libnvmath.so`
`sudo ln -s /usr/local/lib/libnvtt.so /usr/lib/libnvtt.so` `sudo ln -s /usr/local/lib/libnvtt.so /usr/lib/libnvtt.so`
1. After running this steps you can run interface: 1. After running these steps you can run interface:
`interface/interface` `interface/interface`

View file

@ -1,4 +1,8 @@
Please read the [general build guide](BUILD.md) for information on dependencies required for all platforms. Only macOS specific instructions are found in this file. # Build OSX
*Last Updated on April 30, 2019*
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

View file

@ -1,5 +1,9 @@
This is a stand-alone guide for creating your first High Fidelity build for Windows 64-bit. # Build Windows
## Building High Fidelity
*Last Updated on January 13, 2020*
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. 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. If you are upgrading from previous versions, do a clean uninstall of those versions before going through this guide.
@ -29,15 +33,21 @@ If you already have Visual Studio installed and need to add Python, open the "Ad
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 you get version 3.6.6 or higher. 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 you get version 3.6.6 or higher.
### Step 2. Installing CMake ### Step 2. Python Dependencies
In a command-line that can access Python's pip you will need to run the following command:
`pip install distro`
### 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 * 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. 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 3. Create VCPKG environment variable ### Step 4. Create VCPKG environment variable
In the next step, you will use CMake to build High Fidelity. 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. In the next step, you will use CMake to build Project Athena. 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: To create this variable:
* Naviagte to 'Edit the System Environment Variables' Through the start menu. * Naviagte to 'Edit the System Environment Variables' Through the start menu.
@ -55,7 +65,7 @@ To create this variable:
* Set "Variable name" to `HIFI_VCPKG_BOOTSTRAP` * Set "Variable name" to `HIFI_VCPKG_BOOTSTRAP`
* Set "Variable value" to `1` * Set "Variable value" to `1`
### Step 4. Running CMake to Generate Build Files ### Step 5. Running CMake to Generate Build Files
Run Command Prompt from Start and run the following commands: Run Command Prompt from Start and run the following commands:
`cd "%HIFI_DIR%"` `cd "%HIFI_DIR%"`
@ -70,15 +80,15 @@ Run `cmake .. -G "Visual Studio 16 2019" -A x64`.
Where `%HIFI_DIR%` is the directory for the highfidelity repository. Where `%HIFI_DIR%` is the directory for the highfidelity repository.
### Step 5. Making a Build ### Step 6. Making a Build
Open `%HIFI_DIR%\build\hifi.sln` using Visual Studio. Open `%HIFI_DIR%\build\athena.sln` using Visual Studio.
Change the Solution Configuration (menu ribbon under the menu bar, next to the green play button) from "Debug" to "Release" for best performance. Change the Solution Configuration (menu ribbon under the menu bar, next to the green play button) from "Debug" to "Release" for best performance.
Run from the menu bar `Build > Build Solution`. Run from the menu bar `Build > Build Solution`.
### Step 6. Testing Interface ### Step 7. Testing Interface
Create another environment variable (see Step #3) Create another environment variable (see Step #3)
* Set "Variable name": `_NO_DEBUG_HEAP` * Set "Variable name": `_NO_DEBUG_HEAP`
@ -88,7 +98,7 @@ 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 High Fidelity and be able to run the Interface using Visual Studio. Please check our [Docs](https://wiki.highfidelity.com/wiki/Main_Page) for more information regarding the programming workflow. Now, you should have a full build of Project Athena and be able to run the Interface using Visual Studio. Please check our [Docs](https://wiki.highfidelity.com/wiki/Main_Page) for more information regarding the programming workflow.
Note: You can also run Interface by launching it from command line or File Explorer from `%HIFI_DIR%\build\interface\Release\interface.exe` Note: You can also run Interface by launching it from command line or File Explorer from `%HIFI_DIR%\build\interface\Release\interface.exe`
@ -97,7 +107,7 @@ Note: You can also run Interface by launching it from command line or File Explo
For any problems after Step #6, first try this: For any problems after Step #6, first try this:
* Delete your locally cloned copy of the highfidelity repository * Delete your locally cloned copy of the highfidelity repository
* Restart your computer * Restart your computer
* Redownload the [repository](https://github.com/kasenvr/hificommunity) * Redownload the [repository](https://github.com/kasenvr/project-athena)
* Restart directions from Step #6 * Restart directions from Step #6
#### CMake gives you the same error message repeatedly after the build fails #### CMake gives you the same error message repeatedly after the build fails

View file

@ -976,15 +976,18 @@ while (true) {
#### [4.3.4] Source files (header and implementation) must include a boilerplate. #### [4.3.4] Source files (header and implementation) must include a boilerplate.
Boilerplates should include the filename, location, creator, copyright, and Apache 2.0 License information and be placed at the top of the file. Boilerplates should include the filename, location, creator, copyright Project Athena contributors, and Apache 2.0 License
information. This should be placed at the top of the file. If editing an existing file that is copyright High Fidelity, add a
second copyright line, copyright Project Athena contributors.
```cpp ```cpp
// //
// NodeList.h // NodeList.h
// libraries/shared/src // libraries/shared/src
// //
// Created by Stephen Birarda on 2/15/13. // Created by Stephen Birarda on 15 Feb 2013.
// Copyright 2013 High Fidelity, Inc. // Copyright 2013 High Fidelity, Inc.
// Copyright 2020 Project Athena contributors.
// //
// This is where you could place an optional one line comment about the file. // This is where you could place an optional one line comment about the file.
// //

View file

@ -1,6 +1,4 @@
The project embraces distributed development and if you'd like to help, we'll pay you -- find out more at [Worklist.net](https://worklist.net). If you find a small bug and have a fix, pull requests are welcome. If you'd like to get paid for your work, make sure you report the bug via a job on Worklist.net. The project embraces distributed development and if you'd like to help, it would be greatly appreciated. Just open a pull request with the revisions.
We're hiring! We're looking for skilled developers; send your resume to hiring@highfidelity.io
Contributing Contributing
=== ===
@ -8,7 +6,7 @@ Contributing
2. Clone your fork of the repository locally 2. Clone your fork of the repository locally
``` ```
git clone git://github.com/USERNAME/hifi.git git clone git://github.com/USERNAME/project-athena.git
``` ```
3. Create a new branch 3. Create a new branch
@ -22,15 +20,16 @@ Contributing
6. Update your branch 6. Update your branch
``` ```
git remote add upstream https://github.com/highfidelity/hifi git remote add upstream https://github.com/kasenvr/project-athena
git pull upstream master git pull upstream kasen/core
``` ```
Resolve any conflicts that arise with this step. Resolve any conflicts that arise with this step.
7. Push to your fork 7. Push to your fork
``` ```
git push origin master git push origin kasen/core
``` ```
8. Submit a pull request 8. Submit a pull request
@ -39,10 +38,10 @@ Contributing
Reporting Bugs Reporting Bugs
=== ===
1. Always update to the latest code on master, we make many merges every day and it is possible the bug has already been fixed! 1. Always update to the latest code on master, we make many merges every day and it is possible the bug has already been fixed!
2. Search jobs [on Worklist](https://worklist.net) to make sure that somebody has not already reported the same bug. 2. Search [issues](https://github.com/kasenvr/project-athena/issues) to make sure that somebody has not already reported the same bug.
3. Add a [job on Worklist](https://worklist.net/job/add) including information about your system and how to reproduce the bug. 3. [Add](https://github.com/kasenvr/project-athena/issues/new) your report to the issues list!
Requesting a feature Requesting a Feature
=== ===
1. Search the [the Worklist](https://worklist.net) to make sure that somebody has not already requested the same feature. If you find a matching request, feel free to add any additional comments to the existing issue. 1. Search [issues](https://github.com/kasenvr/project-athena/issues) to make sure that somebody has not already requested the same feature.
2. Add a [job on Worklist](https://worklist.net/job/add) that is labeled as a Feature (and select any other appropriate Labels) and includes a detailed description of your request. 2. [Add](https://github.com/kasenvr/project-athena/issues/new) your request to the issues list!

View file

@ -1,10 +1,10 @@
Follow the [build guide](BUILD.md) to figure out how to build High Fidelity for your platform. # Creating an Installer
Follow the [build guide](BUILD.md) to figure out how to build Project Athena for your platform.
During generation, CMake should produce an `install` target and a `package` target. During generation, CMake should produce an `install` target and a `package` target.
### Install The `install` target will copy the Project Athena targets and their dependencies to your `CMAKE_INSTALL_PREFIX`.
The `install` target will copy the High Fidelity targets and their dependencies to your `CMAKE_INSTALL_PREFIX`.
This variable is set by the `project(hifi)` command in `CMakeLists.txt` to `C:/Program Files/hifi` and stored in `build/CMakeCache.txt` This variable is set by the `project(hifi)` command in `CMakeLists.txt` to `C:/Program Files/hifi` and stored in `build/CMakeCache.txt`
### Packaging ### Packaging
@ -60,8 +60,8 @@ To produce an executable installer on Windows, the following are required:
1. Install version 10.15.0 LTS 1. Install version 10.15.0 LTS
1. Perform a clean cmake from a new terminal. 1. Perform a clean cmake from a new terminal.
1. Open the `hifi.sln` Solution and select the Release configuration. 1. Open the `athena.sln` solution and select the Release configuration.
1. Build the Solution. 1. Build the solution.
1. Build `packaged-server-console-npm-install` (found under **hidden/Server Console**) 1. Build `packaged-server-console-npm-install` (found under **hidden/Server Console**)
1. Build `packaged-server-console` (found under **Server Console**) 1. Build `packaged-server-console` (found under **Server Console**)
This will add 2 folders to `build\server-console\` - This will add 2 folders to `build\server-console\` -
@ -73,7 +73,7 @@ To produce an executable installer on Windows, the following are required:
1. [npm](<https://www.npmjs.com/get-npm>) 1. [npm](<https://www.npmjs.com/get-npm>)
Install version 10.15.0 LTS Install version 10.15.0 LTS
1. Perform a clean cmake. 1. Perform a clean CMake.
1. Perform a Release build of ALL_BUILD 1. Perform a Release build of ALL_BUILD
1. Perform a Release build of `packaged-server-console` 1. Perform a Release build of `packaged-server-console`
This will add a folder to `build\server-console\` - This will add a folder to `build\server-console\` -

View file

@ -1,6 +1,7 @@
Copyright (c) 2013-2018, High Fidelity, Inc. Copyright (c) 2013-2019, High Fidelity, Inc.
Copyright (c) 2019-2020, Project Athena Contributors.
All rights reserved. All rights reserved.
licensing@highfidelity.io https://projectathena.io
Licensed under the Apache License version 2.0 (the "License"); Licensed under the Apache License version 2.0 (the "License");
You may not use this software except in compliance with the License. You may not use this software except in compliance with the License.

View file

@ -1,73 +1,53 @@
# HiFi Community Edition # Vircadia
### [Download v0.86.0 K1 (Windows 64-bit, .zip)](https://realities.dev/cdn/hifi-community/v0860-kasen-VS-release+freshstart/Packaged_Release.zip) ### What is this?
#### Changes for **v0.86.0** consist of: Vircadia is a 3D social software project seeking to incrementally bring about a truly free and open metaverse, in desktop and XR.
#### Added in K1 (12/3/19) ### [Download](https://vircadia.com/download-vircadia/)
* Audio Buffer choppy audio bugfix by increasing the buffer size. ### Releases
* User Activity Logger disabled, option in code to log the reports to console.
* CMakeLists.txt configured to work for Polyvox, Interface JSDocs. (may be obsolete)
* Custom Application Title.
* Entity Script Whitelist, no scripts are whitelisted by default.
* Background CMD outputs full log, instant close of application on closing of the CMD-line.
#### Added in K2 (TBD) [View Releases here](https://github.com/kasenvr/project-athena/releases/)
* QML Interface to access and save whitelist live to interface.json. ### How to build the Interface
* Add "VideoDecodeStats" to .gitignore.
* Fix VCPKG SDL2 to port files from 2.0.8 to 2.0.10 to fix CMake build issues.
* Added Github link to "About High Fidelity".
* Removed environment variable requirement for "procedural shader materials".
This build has been tested on Windows 10 Pro 64-bit w/ Nvidia graphics drivers. [For Windows](https://github.com/kasenvr/project-athena/blob/kasen/core/BUILD_WIN.md)
### Whitelist Instructions [For Linux](https://github.com/kasenvr/project-athena/blob/kasen/core/BUILD_LINUX.md)
The whitelist checks every entity-script attempting to run on your client against a list of domains, their subfolders, or the specific script URL entirely. [For Linux - Athena Builder](https://github.com/daleglass/athena-builder)
The Interface has the whitelist settings under "**Settings -> Entity Script Whitelist**" for you to configure live. The whitelist checks against the domains literally, so you have to be precise to ensure security and functionality. For example, the difference between "http://" and "https://" matters as those will be seen as two different domains in the eyes of the whitelist. Separate each URL by a new line. ### How to deploy a Server
Do not use spaces or commas in the whitelist interface, you will only separate by commas and not new lines in the environment variables. [For Windows and Linux](https://vircadia.com/download-vircadia/#server)
It is recommended that you add High Fidelity's CDN URLs ahead of time to ensure general content works right off the bat: ### How to build a Server
``` [For Linux - Athena Builder](https://github.com/daleglass/athena-builder)
http://mpassets.highfidelity.com/
https://raw.githubusercontent.com/highfidelity/
https://hifi-content.s3.amazonaws.com/
```
You can also set the Windows environment variable "**EXTRA_WHITELIST**" with your whitelisted domains comma separated like so: "**https://kasen.io/,http://kasen.io/,https://exampledomain.com/scriptFolder/**"
Alternatively you can make a batch file placed in the same folder as interface.exe that sets the whitelist environment variable temporarily:
```
set "EXTRA_WHITELIST=http://mpassets.highfidelity.com/,https://raw.githubusercontent.com/highfidelity/,https://hifi-content.s3.amazonaws.com/"
interface.exe
```
### How to build interface.exe
[For Windows](https://github.com/kasenvr/hifi-community/blob/kasen/core/BUILD_WIN.md)
### Boot to Metaverse: The Goal ### Boot to Metaverse: The Goal
Too many of us have our own personal combinations of High Fidelity from C++ modifications to different default scripts, all of which are lost to time as their fullest potential is never truly shared and propagated through the system. Having a place to experience adventure, a place to relax with calm breath, that's a world to live in. An engine to support infinite combinations and possibilities of worlds without censorship and interruption, that's a metaverse. Finding a way to make infinite realities our reality, that's the dream.
The goal of this repo is to give a common area to PR the very best of our findings and creations so that we may effectively take each necessary step towards our common goal of living in a true metaverse. ### Boot to Metaverse: The Technicals
### Why High Fidelity? Many developers have had personal combinations of High Fidelity from C++ modifications to different default scripts, all of which are lost to time as their fullest potential is never truly shared and propagated through the system.
Because of all the options, it is the only starting point that is open-source, cross-platform, fully VR integrated + fully desktop integrated with an aim for quality visuals and performance. It also does us the service of providing a foundation to start from such as entity management, full body IK, etc. The goal of this project is to achieve the metaverse dream through shared contribution and building. Setting goals that are achievable yet meaningful is key to making proper forward progress on the technical front whilst maintaining morale.
WebXR offers the open-source and decentralized aspect but does not have any of the full featured starting points such as avatars, IK, etc. ### Why High Fidelity's Virtual Reality Platform?
Platforms like NeosVR or VRChat are unusable from go due to their fundamental closed-source and centralized nature. A metaverse to live on cannot have the keys handed over to any one entity, if any at all. Because of all the options, it is the only starting point that is open-source, cross-platform, fully VR integrated + fully desktop integrated with an aim for quality visuals and performance. It also provides a foundation to build from including components like entity management, full body IK, etc.
So the necessary desire is to use High Fidelity as our foundation as a community of one, of all to build a metaverse worth living in. WebXR offers the open-source and decentralized aspect but does not have any of the full featured starting points such as avatars, IK, etc. which means that a lot of ground work will have to be laid to make something functional. Far more work will need to be done to create a truly seamless and extensive experience as well.
### Contributors Platforms like NeosVR or VRChat are not viable from go due to their fundamental closed-source and centralized nature. A metaverse to live in cannot have the keys handed over to any singular entity, if any at all.
A special thanks to the contributors of the community edition. We need to do the best we can with what we've got and our best bet as open source developers is to not redesign the wheel if we can help it!
### Contribution
A special thanks to the contributors of Vircadia.
[Contribution](CONTRIBUTING.md)

View file

@ -22,6 +22,7 @@
#include <ResourceManager.h> #include <ResourceManager.h>
#include <NetworkAccessManager.h> #include <NetworkAccessManager.h>
#include <NetworkingConstants.h> #include <NetworkingConstants.h>
#include <MetaverseAPI.h>
#include <EntityItem.h> #include <EntityItem.h>
#include <EntityItemProperties.h> #include <EntityItemProperties.h>
#include "ClientTraitsHandler.h" #include "ClientTraitsHandler.h"
@ -235,7 +236,7 @@ void MixerAvatar::requestCurrentOwnership() {
QNetworkRequest networkRequest; QNetworkRequest networkRequest;
networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QUrl requestURL = NetworkingConstants::METAVERSE_SERVER_URL(); QUrl requestURL = MetaverseAPI::getCurrentMetaverseServerURL();
requestURL.setPath(POP_MARKETPLACE_API); requestURL.setPath(POP_MARKETPLACE_API);
networkRequest.setUrl(requestURL); networkRequest.setUrl(requestURL);

View file

@ -22,6 +22,7 @@
#include <plugins/PluginManager.h> #include <plugins/PluginManager.h>
#include <EntityEditFilters.h> #include <EntityEditFilters.h>
#include <NetworkingConstants.h> #include <NetworkingConstants.h>
#include <MetaverseAPI.h>
#include <hfm/ModelFormatRegistry.h> #include <hfm/ModelFormatRegistry.h>
#include "../AssignmentDynamicFactory.h" #include "../AssignmentDynamicFactory.h"

View file

@ -61,4 +61,12 @@ endif ()
if (APPLE) if (APPLE)
set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "--deep") set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "--deep")
endif() endif()
if (UNIX)
# Static libs result in duplicated constructor and destructor calls on Linux
# and crashes on exit, and perhaps loss of global state on plugin loads.
#
# This will need to be looked at closely before Linux can have a static build.
set(BUILD_SHARED_LIBS ON)
endif ()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 299 KiB

After

Width:  |  Height:  |  Size: 281 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 100 KiB

View file

@ -18,20 +18,20 @@ macro(GENERATE_INSTALLERS)
if (CLIENT_ONLY) if (CLIENT_ONLY)
set(_PACKAGE_NAME_EXTRA "-Interface") set(_PACKAGE_NAME_EXTRA "-Interface")
set(INSTALLER_TYPE "client_only") set(INSTALLER_TYPE "client_only")
string(REGEX REPLACE "High Fidelity" "High Fidelity Interface" _DISPLAY_NAME ${BUILD_ORGANIZATION}) string(REGEX REPLACE "Project Athena" "Project Athena Interface" _DISPLAY_NAME ${BUILD_ORGANIZATION})
elseif (SERVER_ONLY) elseif (SERVER_ONLY)
set(_PACKAGE_NAME_EXTRA "-Sandbox") set(_PACKAGE_NAME_EXTRA "-Sandbox")
set(INSTALLER_TYPE "server_only") set(INSTALLER_TYPE "server_only")
string(REGEX REPLACE "High Fidelity" "High Fidelity Sandbox" _DISPLAY_NAME ${BUILD_ORGANIZATION}) string(REGEX REPLACE "Project Athena" "Project Athena Sandbox" _DISPLAY_NAME ${BUILD_ORGANIZATION})
else () else ()
set(_DISPLAY_NAME ${BUILD_ORGANIZATION}) set(_DISPLAY_NAME ${BUILD_ORGANIZATION})
set(INSTALLER_TYPE "full") set(INSTALLER_TYPE "full")
endif () endif ()
set(CPACK_PACKAGE_NAME ${_DISPLAY_NAME}) set(CPACK_PACKAGE_NAME ${_DISPLAY_NAME})
set(CPACK_PACKAGE_VENDOR "High Fidelity") set(CPACK_PACKAGE_VENDOR "Project Athena")
set(CPACK_PACKAGE_VERSION ${BUILD_VERSION}) set(CPACK_PACKAGE_VERSION ${BUILD_VERSION})
set(CPACK_PACKAGE_FILE_NAME "HighFidelity-Beta${_PACKAGE_NAME_EXTRA}-${BUILD_VERSION}") set(CPACK_PACKAGE_FILE_NAME "ProjectAthena-Alpha${_PACKAGE_NAME_EXTRA}-${BUILD_VERSION}")
set(CPACK_NSIS_DISPLAY_NAME ${_DISPLAY_NAME}) set(CPACK_NSIS_DISPLAY_NAME ${_DISPLAY_NAME})
set(CPACK_NSIS_PACKAGE_NAME ${_DISPLAY_NAME}) set(CPACK_NSIS_PACKAGE_NAME ${_DISPLAY_NAME})
if (PR_BUILD) if (PR_BUILD)
@ -118,11 +118,11 @@ macro(GENERATE_INSTALLERS)
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE")
if (BUILD_CLIENT) if (BUILD_CLIENT)
cpack_add_component(${CLIENT_COMPONENT} DISPLAY_NAME "High Fidelity Interface") cpack_add_component(${CLIENT_COMPONENT} DISPLAY_NAME "Project Athena Interface")
endif () endif ()
if (BUILD_SERVER) if (BUILD_SERVER)
cpack_add_component(${SERVER_COMPONENT} DISPLAY_NAME "High Fidelity Sandbox") cpack_add_component(${SERVER_COMPONENT} DISPLAY_NAME "Project Athena Sandbox")
endif () endif ()
include(CPack) include(CPack)

View file

@ -35,7 +35,7 @@ macro(SET_PACKAGING_PARAMETERS)
set(DEPLOY_PACKAGE TRUE) set(DEPLOY_PACKAGE TRUE)
set(PRODUCTION_BUILD 1) set(PRODUCTION_BUILD 1)
set(BUILD_VERSION ${RELEASE_NUMBER}) set(BUILD_VERSION ${RELEASE_NUMBER})
set(BUILD_ORGANIZATION "High Fidelity") set(BUILD_ORGANIZATION "Project Athena")
set(HIGH_FIDELITY_PROTOCOL "hifi") set(HIGH_FIDELITY_PROTOCOL "hifi")
set(HIGH_FIDELITY_APP_PROTOCOL "hifiapp") set(HIGH_FIDELITY_APP_PROTOCOL "hifiapp")
set(INTERFACE_BUNDLE_NAME "interface") set(INTERFACE_BUNDLE_NAME "interface")
@ -60,7 +60,7 @@ macro(SET_PACKAGING_PARAMETERS)
set(DEPLOY_PACKAGE TRUE) set(DEPLOY_PACKAGE TRUE)
set(PR_BUILD 1) set(PR_BUILD 1)
set(BUILD_VERSION "PR${RELEASE_NUMBER}") set(BUILD_VERSION "PR${RELEASE_NUMBER}")
set(BUILD_ORGANIZATION "High Fidelity - PR${RELEASE_NUMBER}") set(BUILD_ORGANIZATION "Project Athena - PR${RELEASE_NUMBER}")
set(INTERFACE_BUNDLE_NAME "interface") set(INTERFACE_BUNDLE_NAME "interface")
set(INTERFACE_ICON_PREFIX "interface-beta") set(INTERFACE_ICON_PREFIX "interface-beta")
@ -69,7 +69,7 @@ macro(SET_PACKAGING_PARAMETERS)
else () else ()
set(DEV_BUILD 1) set(DEV_BUILD 1)
set(BUILD_VERSION "dev") set(BUILD_VERSION "dev")
set(BUILD_ORGANIZATION "High Fidelity - ${BUILD_VERSION}") set(BUILD_ORGANIZATION "Project Athena - ${BUILD_VERSION}")
set(INTERFACE_BUNDLE_NAME "interface") set(INTERFACE_BUNDLE_NAME "interface")
set(INTERFACE_ICON_PREFIX "interface-beta") set(INTERFACE_ICON_PREFIX "interface-beta")
@ -192,21 +192,21 @@ macro(SET_PACKAGING_PARAMETERS)
# shortcut names # shortcut names
if (PRODUCTION_BUILD) if (PRODUCTION_BUILD)
set(INTERFACE_SHORTCUT_NAME "High Fidelity") set(INTERFACE_SHORTCUT_NAME "Project Athena")
set(CONSOLE_SHORTCUT_NAME "Console") set(CONSOLE_SHORTCUT_NAME "Console")
set(SANDBOX_SHORTCUT_NAME "Sandbox") set(SANDBOX_SHORTCUT_NAME "Sandbox")
set(APP_USER_MODEL_ID "com.highfidelity.console") set(APP_USER_MODEL_ID "com.highfidelity.console")
else () else ()
set(INTERFACE_SHORTCUT_NAME "High Fidelity - ${BUILD_VERSION_NO_SHA}") set(INTERFACE_SHORTCUT_NAME "Project Athena - ${BUILD_VERSION_NO_SHA}")
set(CONSOLE_SHORTCUT_NAME "Console - ${BUILD_VERSION_NO_SHA}") set(CONSOLE_SHORTCUT_NAME "Console - ${BUILD_VERSION_NO_SHA}")
set(SANDBOX_SHORTCUT_NAME "Sandbox - ${BUILD_VERSION_NO_SHA}") set(SANDBOX_SHORTCUT_NAME "Sandbox - ${BUILD_VERSION_NO_SHA}")
endif () endif ()
set(INTERFACE_HF_SHORTCUT_NAME "${INTERFACE_SHORTCUT_NAME}") set(INTERFACE_HF_SHORTCUT_NAME "${INTERFACE_SHORTCUT_NAME}")
set(CONSOLE_HF_SHORTCUT_NAME "High Fidelity ${CONSOLE_SHORTCUT_NAME}") set(CONSOLE_HF_SHORTCUT_NAME "Project Athena ${CONSOLE_SHORTCUT_NAME}")
set(SANDBOX_HF_SHORTCUT_NAME "High Fidelity ${SANDBOX_SHORTCUT_NAME}") set(SANDBOX_HF_SHORTCUT_NAME "Project Athena ${SANDBOX_SHORTCUT_NAME}")
set(PRE_SANDBOX_INTERFACE_SHORTCUT_NAME "High Fidelity") set(PRE_SANDBOX_INTERFACE_SHORTCUT_NAME "Project Athena")
set(PRE_SANDBOX_CONSOLE_SHORTCUT_NAME "Server Console") set(PRE_SANDBOX_CONSOLE_SHORTCUT_NAME "Server Console")
# check if we need to find signtool # check if we need to find signtool

View file

@ -0,0 +1,13 @@
#
# Created by Michael Bailey on 12/20/2019
# Copyright 2019 Michael Bailey
#
# Distributed under the Apache License, Version 2.0.
# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
#
macro(TARGET_opus)
find_library(OPUS_LIBRARY_RELEASE NAMES opus PATHS ${VCPKG_INSTALL_ROOT}/lib)
find_library(OPUS_LIBRARY_DEBUG NAMES opus PATHS ${VCPKG_INSTALL_ROOT}/debug/lib)
select_library_configurations(OPUS)
target_link_libraries(${TARGET_NAME} ${OPUS_LIBRARY})
endmacro()

View file

@ -19,7 +19,7 @@ include(vcpkg_common_functions)
vcpkg_from_github( vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH OUT_SOURCE_PATH SOURCE_PATH
REPO highfidelity/etc2comp REPO kasenvr/etc2comp
REF 7f1843bf07825c21cab711360c1ddbad04641036 REF 7f1843bf07825c21cab711360c1ddbad04641036
SHA512 d747076acda8537d39585858c793a35c3dcc9ef283d723619a47f8c81ec1454c95b3340ad35f0655a939eae5b8271c801c48a9a7568311a01903a344c44af25b SHA512 d747076acda8537d39585858c793a35c3dcc9ef283d723619a47f8c81ec1454c95b3340ad35f0655a939eae5b8271c801c48a9a7568311a01903a344c44af25b
HEAD_REF master HEAD_REF master

View file

@ -1,4 +1,4 @@
Source: hifi-deps Source: hifi-deps
Version: 0.3 Version: 0.4
Description: Collected dependencies for High Fidelity applications Description: Collected dependencies for High Fidelity applications
Build-Depends: bullet3, draco, etc2comp, glm, nvtt, openexr (!android), openssl (windows), tbb (!android&!osx), zlib, webrtc (!android) Build-Depends: bullet3, draco, etc2comp, glm, nvtt, openexr (!android), openssl (windows), opus, tbb (!android&!osx), zlib, webrtc (!android)

View file

@ -3,7 +3,7 @@ include(vcpkg_common_functions)
vcpkg_from_github( vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH OUT_SOURCE_PATH SOURCE_PATH
REPO highfidelity/scribe REPO kasenvr/scribe
REF 1bd638a36ca771e5a68d01985b6389b71835cbd2 REF 1bd638a36ca771e5a68d01985b6389b71835cbd2
SHA512 dbe241d86df3912e544f6b9839873f9875df54efc93822b145e7b13243eaf2e3d690bc8a28b1e52d05bdcd7e68fca6b0b2f5c43ffd0f56a9b7a50d54dcf9e31e SHA512 dbe241d86df3912e544f6b9839873f9875df54efc93822b145e7b13243eaf2e3d690bc8a28b1e52d05bdcd7e68fca6b0b2f5c43ffd0f56a9b7a50d54dcf9e31e
HEAD_REF master HEAD_REF master

View file

@ -9,7 +9,7 @@ include(vcpkg_common_functions)
vcpkg_from_github( vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH OUT_SOURCE_PATH SOURCE_PATH
REPO highfidelity/nvidia-texture-tools REPO kasenvr/nvidia-texture-tools
REF 330c4d56274a0f602a5c70596e2eb670a4ed56c2 REF 330c4d56274a0f602a5c70596e2eb670a4ed56c2
SHA512 4c0bc2f369120d696cc27710b6d33086b27eef55f537ec66b9a5c8b1839bc2426c0413670b0f65be52c5d353468f0126dfe024be1f0690611d4d7e33ac530127 SHA512 4c0bc2f369120d696cc27710b6d33086b27eef55f537ec66b9a5c8b1839bc2426c0413670b0f65be52c5d353468f0126dfe024be1f0690611d4d7e33ac530127
HEAD_REF master HEAD_REF master

3
cmake/ports/opus/CONTROL Normal file
View file

@ -0,0 +1,3 @@
Source: opus
Version: 1.3.1
Description: Totally open, royalty-free, highly versatile audio codec

View file

@ -0,0 +1,28 @@
include(vcpkg_common_functions)
vcpkg_from_github(
OUT_SOURCE_PATH
SOURCE_PATH
REPO
xiph/opus
REF
e85ed7726db5d677c9c0677298ea0cb9c65bdd23
SHA512
a8c7e5bf383c06f1fdffd44d9b5f658f31eb4800cb59d12da95ddaeb5646f7a7b03025f4663362b888b1374d4cc69154f006ba07b5840ec61ddc1a1af01d6c54
HEAD_REF
master)
vcpkg_configure_cmake(SOURCE_PATH ${SOURCE_PATH} PREFER_NINJA)
vcpkg_install_cmake()
vcpkg_fixup_cmake_targets(CONFIG_PATH lib/cmake/Opus)
vcpkg_copy_pdbs()
file(INSTALL
${SOURCE_PATH}/COPYING
DESTINATION
${CURRENT_PACKAGES_DIR}/share/opus
RENAME copyright)
file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/lib/cmake
${CURRENT_PACKAGES_DIR}/lib/cmake
${CURRENT_PACKAGES_DIR}/debug/include)

View file

@ -8,7 +8,7 @@ vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH OUT_SOURCE_PATH SOURCE_PATH
REPO 01org/tbb REPO 01org/tbb
REF 2018_U5 REF 2018_U5
SHA512 3e8d20276ccb1b50099f96b6cf968e3d0ada53caea1fa836ecb8652f1dca236fbbbf2c783e64ea2f761f7f21725064d19b72d176e35e4dc29706b8a30965153b SHA512 d86a110df9e55654c3638af8107fdfed2284434158cb5b3a38b3fc7cf143aa2346ee15da4e141e03fcfed864865462e6893c535b8dc227ebdd6ccd584c8a1e9b
HEAD_REF tbb_2018 HEAD_REF tbb_2018
) )

View file

@ -161,7 +161,7 @@
;General ;General
; hide install details since we show an image slideshow in their place ; hide install details since we show an image slideshow in their place
ShowInstDetails nevershow ShowInstDetails hide
; leverage the UAC NSIS plugin to promote uninstaller to elevated privileges ; leverage the UAC NSIS plugin to promote uninstaller to elevated privileges
!include UAC.nsh !include UAC.nsh
@ -199,15 +199,18 @@
!system "$%TEMP%\tempinstaller.exe" = 2 !system "$%TEMP%\tempinstaller.exe" = 2
; NOTE: We're not code signing right now, so we're going to disable that.
; TODO: Get a code signing certificate so we can re-enable code signing.
; The Inner invocation has written an uninstaller binary for us. ; The Inner invocation has written an uninstaller binary for us.
; We need to sign it if it's a production or PR build. ; We need to sign it if it's a production or PR build.
!if @PRODUCTION_BUILD@ == 1 ; !if @PRODUCTION_BUILD@ == 1
!if @BYPASS_SIGNING@ == 1 ; !if @BYPASS_SIGNING@ == 1
!warning "BYPASS_SIGNING set - installer will not be signed" ; !warning "BYPASS_SIGNING set - installer will not be signed"
!else ; !else
!system '"@SIGNTOOL_EXECUTABLE@" sign /fd sha256 /f %HF_PFX_FILE% /p %HF_PFX_PASSPHRASE% /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp /td SHA256 $%TEMP%\@UNINSTALLER_NAME@' = 0 ; !system '"@SIGNTOOL_EXECUTABLE@" sign /fd sha256 /f %HF_PFX_FILE% /p %HF_PFX_PASSPHRASE% /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp /td SHA256 $%TEMP%\@UNINSTALLER_NAME@' = 0
!endif ; !endif
!endif ; !endif
; Good. Now we can carry on writing the real installer. ; Good. Now we can carry on writing the real installer.
@ -421,7 +424,7 @@ Function GetCampaignName
Pop $0 ; Discard Path Pop $0 ; Discard Path
Pop $0 ; Recover filename Pop $0 ; Recover filename
; Parse campaign out of the filename ; Parse campaign out of the filename
${RECaptureMatches} $0 "HighFidelity-([^-]*-)Beta-.*" $0 0 ${RECaptureMatches} $0 "ProjectAthena-([^-]*-)Alpha-.*" $0 0
${If} $0 == 1 ${If} $0 == 1
Pop $0 ; Recover campaign name Pop $0 ; Recover campaign name
StrCpy $0 $0 -1 0 ; Remove trailing - and copy to _RetVar StrCpy $0 $0 -1 0 ; Remove trailing - and copy to _RetVar
@ -528,7 +531,7 @@ Var GAClientID
Page custom PostInstallOptionsPage ReadPostInstallOptions Page custom PostInstallOptionsPage ReadPostInstallOptions
!define MUI_PAGE_CUSTOMFUNCTION_PRE PageInstallFilesPre !define MUI_PAGE_CUSTOMFUNCTION_PRE PageInstallFilesPre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW StartInstallSlideshow ; !define MUI_PAGE_CUSTOMFUNCTION_SHOW StartInstallSlideshow
!insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_CONFIRM
@ -652,35 +655,35 @@ Var Express
Function OnUserAbort Function OnUserAbort
!insertmacro LogStep "Installer" "Abort" "User Abort" "" !insertmacro LogStep "Installer" "Abort" "User Abort" ""
!insertmacro GoogleAnalytics "Installer" "Abort" "User Abort" "" ; !insertmacro GoogleAnalytics "Installer" "Abort" "User Abort" ""
FunctionEnd FunctionEnd
Function PageWelcomePre Function PageWelcomePre
!insertmacro LogStep "Installer" "Welcome" "" "" !insertmacro LogStep "Installer" "Welcome" "" ""
!insertmacro GoogleAnalytics "Installer" "Welcome" "" "" ; !insertmacro GoogleAnalytics "Installer" "Welcome" "" ""
!insertmacro DownloadSlideshowImages ; !insertmacro DownloadSlideshowImages
FunctionEnd FunctionEnd
Function PageLicensePre Function PageLicensePre
!insertmacro LogStep "Installer" "License" "" "" !insertmacro LogStep "Installer" "License" "" ""
!insertmacro GoogleAnalytics "Installer" "License" "" "" ; !insertmacro GoogleAnalytics "Installer" "License" "" ""
FunctionEnd FunctionEnd
Function PageDirectoryPre Function PageDirectoryPre
!insertmacro MaybeSkipPage !insertmacro MaybeSkipPage
!insertmacro LogStep "Installer" "Directory" "" "" !insertmacro LogStep "Installer" "Directory" "" ""
!insertmacro GoogleAnalytics "Installer" "Directory" "" "" ; !insertmacro GoogleAnalytics "Installer" "Directory" "" ""
FunctionEnd FunctionEnd
Function PageStartMenuPre Function PageStartMenuPre
!insertmacro MaybeSkipPage !insertmacro MaybeSkipPage
!insertmacro LogStep "Installer" "StartMenu" "" "" !insertmacro LogStep "Installer" "StartMenu" "" ""
!insertmacro GoogleAnalytics "Installer" "StartMenu" "" "" ; !insertmacro GoogleAnalytics "Installer" "StartMenu" "" ""
FunctionEnd FunctionEnd
Function PageComponentsPre Function PageComponentsPre
!insertmacro MaybeSkipPage !insertmacro MaybeSkipPage
!insertmacro LogStep "Installer" "Components" "" "" !insertmacro LogStep "Installer" "Components" "" ""
!insertmacro GoogleAnalytics "Installer" "Components" "" "" ; !insertmacro GoogleAnalytics "Installer" "Components" "" ""
FunctionEnd FunctionEnd
Function PageInstallFilesPre Function PageInstallFilesPre
!insertmacro LogStep "Installer" "Install" "" "" !insertmacro LogStep "Installer" "Install" "" ""
!insertmacro GoogleAnalytics "Installer" "Install" "" "" ; !insertmacro GoogleAnalytics "Installer" "Install" "" ""
FunctionEnd FunctionEnd
!macro SetInstallOption Checkbox OptionName Default !macro SetInstallOption Checkbox OptionName Default
@ -702,7 +705,7 @@ FunctionEnd
Function InstallTypesPage Function InstallTypesPage
!insertmacro LogStep "Installer" "Install Types" "" "" !insertmacro LogStep "Installer" "Install Types" "" ""
!insertmacro GoogleAnalytics "Installer" "Install Types" "" "" ; !insertmacro GoogleAnalytics "Installer" "Install Types" "" ""
!insertmacro MUI_HEADER_TEXT "Choose Installation Type" "Express or Custom Install" !insertmacro MUI_HEADER_TEXT "Choose Installation Type" "Express or Custom Install"
@ -717,7 +720,7 @@ Function InstallTypesPage
StrCpy $OffsetUnits u StrCpy $OffsetUnits u
StrCpy $Express "0" StrCpy $Express "0"
${NSD_CreateRadioButton} 30% $CurrentOffset$OffsetUnits 100% 10u "Express Install (Recommended)"; $\nInstalls High Fidelity Interface and High Fidelity Sandbox" ${NSD_CreateRadioButton} 30% $CurrentOffset$OffsetUnits 100% 10u "Express Install (Recommended)"; $\nInstalls Project Athena Interface and Project Athena Sandbox"
pop $ExpressInstallRadioButton pop $ExpressInstallRadioButton
${NSD_OnClick} $ExpressInstallRadioButton ChangeExpressLabel ${NSD_OnClick} $ExpressInstallRadioButton ChangeExpressLabel
IntOp $CurrentOffset $CurrentOffset + 15 IntOp $CurrentOffset $CurrentOffset + 15
@ -813,7 +816,7 @@ Function PostInstallOptionsPage
!insertmacro MaybeSkipPage !insertmacro MaybeSkipPage
!insertmacro LogStep "Installer" "Post Install Options" "" "" !insertmacro LogStep "Installer" "Post Install Options" "" ""
!insertmacro GoogleAnalytics "Installer" "Post Install Options" "" "" ; !insertmacro GoogleAnalytics "Installer" "Post Install Options" "" ""
!insertmacro MUI_HEADER_TEXT "Setup Options" "" !insertmacro MUI_HEADER_TEXT "Setup Options" ""
@ -970,7 +973,7 @@ Function ReadPostInstallOptions
${If} @CLIENT_COMPONENT_CONDITIONAL@ ${If} @CLIENT_COMPONENT_CONDITIONAL@
${LogText} "Option: Install Client" ${LogText} "Option: Install Client"
; check if the user asked for a desktop shortcut to High Fidelity ; check if the user asked for a desktop shortcut to Project Athena
${NSD_GetState} $DesktopClientCheckbox $DesktopClientState ${NSD_GetState} $DesktopClientCheckbox $DesktopClientState
${LogText} "Option: Create Client Desktop Shortcut: $DesktopClientState" ${LogText} "Option: Create Client Desktop Shortcut: $DesktopClientState"
${EndIf} ${EndIf}
@ -1024,7 +1027,7 @@ Function HandlePostInstallOptions
${EndIf} ${EndIf}
${If} @CLIENT_COMPONENT_CONDITIONAL@ ${If} @CLIENT_COMPONENT_CONDITIONAL@
; check if the user asked for a desktop shortcut to High Fidelity ; check if the user asked for a desktop shortcut to Project Athena
${If} $DesktopClientState == ${BST_CHECKED} ${If} $DesktopClientState == ${BST_CHECKED}
CreateShortCut "$DESKTOP\@INTERFACE_HF_SHORTCUT_NAME@.lnk" "$INSTDIR\@INTERFACE_WIN_EXEC_NAME@" CreateShortCut "$DESKTOP\@INTERFACE_HF_SHORTCUT_NAME@.lnk" "$INSTDIR\@INTERFACE_WIN_EXEC_NAME@"
!insertmacro WriteInstallOption "@CLIENT_DESKTOP_SHORTCUT_REG_KEY@" YES !insertmacro WriteInstallOption "@CLIENT_DESKTOP_SHORTCUT_REG_KEY@" YES
@ -1085,7 +1088,7 @@ Function HandlePostInstallOptions
ClearErrors ClearErrors
; copy the data from production build to this PR build ; copy the data from production build to this PR build
CopyFiles "$APPDATA\High Fidelity\*" $0 CopyFiles "$APPDATA\Project Athena\*" $0
; handle an error in copying files ; handle an error in copying files
IfErrors 0 NoError IfErrors 0 NoError
@ -1325,13 +1328,13 @@ Section "-Core installation"
@CPACK_NSIS_EXTRA_INSTALL_COMMANDS@ @CPACK_NSIS_EXTRA_INSTALL_COMMANDS@
; see if we have a campaign that we might need to grab special content for ; see if we have a campaign that we might need to grab special content for
Call OptionallyDownloadCampaignServerless ; Call OptionallyDownloadCampaignServerless
; Handle whichever post install options were set ; Handle whichever post install options were set
Call HandlePostInstallOptions Call HandlePostInstallOptions
!insertmacro LogStep "Installer" "Done" "" "" !insertmacro LogStep "Installer" "Done" "" ""
!insertmacro GoogleAnalytics "Installer" "Done" "" "" ; !insertmacro GoogleAnalytics "Installer" "Done" "" ""
SectionEnd SectionEnd
!include nsProcess.nsh !include nsProcess.nsh
@ -1358,7 +1361,7 @@ SectionEnd
/SD IDCANCEL IDRETRY Prompt_${UniqueID} IDCANCEL 0 /SD IDCANCEL IDRETRY Prompt_${UniqueID} IDCANCEL 0
${EndIf} ${EndIf}
!insertmacro GoogleAnalytics "Installer" "Abort" "${displayName} Running" "" ; !insertmacro GoogleAnalytics "Installer" "Abort" "${displayName} Running" ""
; If the user decided to cancel, stop the current installer/uninstaller ; If the user decided to cancel, stop the current installer/uninstaller
Abort Abort
@ -1602,7 +1605,7 @@ Function .onInit
!insertmacro InitGAClientID !insertmacro InitGAClientID
!insertmacro GetCampaignName $CampaignName !insertmacro GetCampaignName $CampaignName
!insertmacro GoogleAnalytics "Installer" "Start" "$CampaignName" "" ; !insertmacro GoogleAnalytics "Installer" "Start" "$CampaignName" ""
; make sure none of the installed applications are still running ; make sure none of the installed applications are still running
${LogText} "Checking For Running Applications" ${LogText} "Checking For Running Applications"

View file

@ -1227,8 +1227,8 @@
"name": "codec_preference_order", "name": "codec_preference_order",
"label": "Audio Codec Preference Order", "label": "Audio Codec Preference Order",
"help": "List of codec names in order of preferred usage", "help": "List of codec names in order of preferred usage",
"placeholder": "hifiAC, zlib, pcm", "placeholder": "opus, hifiAC, zlib, pcm",
"default": "hifiAC,zlib,pcm", "default": "opus,hifiAC,zlib,pcm",
"advanced": true "advanced": true
} }
] ]

View file

@ -38,6 +38,7 @@
#include <HTTPConnection.h> #include <HTTPConnection.h>
#include <LogUtils.h> #include <LogUtils.h>
#include <NetworkingConstants.h> #include <NetworkingConstants.h>
#include <MetaverseAPI.h>
#include <udt/PacketHeaders.h> #include <udt/PacketHeaders.h>
#include <SettingHandle.h> #include <SettingHandle.h>
#include <SharedUtil.h> #include <SharedUtil.h>
@ -121,7 +122,7 @@ bool DomainServer::forwardMetaverseAPIRequest(HTTPConnection* connection,
root.insert(requestSubobjectKey, subobject); root.insert(requestSubobjectKey, subobject);
QJsonDocument doc { root }; QJsonDocument doc { root };
QUrl url { NetworkingConstants::METAVERSE_SERVER_URL().toString() + metaversePath }; QUrl url{ MetaverseAPI::getCurrentMetaverseServerURL().toString() + metaversePath };
QNetworkRequest req(url); QNetworkRequest req(url);
req.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); req.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT);
@ -516,7 +517,7 @@ bool DomainServer::optionallySetupOAuth() {
// if we don't have an oauth provider URL then we default to the default node auth url // if we don't have an oauth provider URL then we default to the default node auth url
if (_oauthProviderURL.isEmpty()) { if (_oauthProviderURL.isEmpty()) {
_oauthProviderURL = NetworkingConstants::METAVERSE_SERVER_URL(); _oauthProviderURL = MetaverseAPI::getCurrentMetaverseServerURL();
} }
_oauthClientSecret = QProcessEnvironment::systemEnvironment().value(OAUTH_CLIENT_SECRET_ENV); _oauthClientSecret = QProcessEnvironment::systemEnvironment().value(OAUTH_CLIENT_SECRET_ENV);
@ -2222,7 +2223,7 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url
return true; return true;
} else if (url.path() == URI_API_METAVERSE_INFO) { } else if (url.path() == URI_API_METAVERSE_INFO) {
QJsonObject rootJSON { QJsonObject rootJSON {
{ "metaverse_url", NetworkingConstants::METAVERSE_SERVER_URL().toString() } { "metaverse_url", MetaverseAPI::getCurrentMetaverseServerURL().toString() }
}; };
QJsonDocument docJSON{ rootJSON }; QJsonDocument docJSON{ rootJSON };
@ -2449,7 +2450,7 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url
QJsonDocument doc(root); QJsonDocument doc(root);
QUrl url { NetworkingConstants::METAVERSE_SERVER_URL().toString() + "/api/v1/places/" + place_id }; QUrl url { MetaverseAPI::getCurrentMetaverseServerURL().toString() + "/api/v1/places/" + place_id };
url.setQuery("access_token=" + accessTokenVariant.toString()); url.setQuery("access_token=" + accessTokenVariant.toString());

View file

@ -118,6 +118,6 @@ def downloadAndExtract(url, destPath, hash=None, hasher=hashlib.sha512(), isZip=
zip.extractall(destPath) zip.extractall(destPath)
else: else:
# Extract the archive # Extract the archive
with tarfile.open(tempFileName, 'r:gz') as tgz: with tarfile.open(tempFileName, 'r:*') as tgz:
tgz.extractall(destPath) tgz.extractall(destPath)
os.remove(tempFileName) os.remove(tempFileName)

View file

@ -9,6 +9,7 @@ import tempfile
import json import json
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
import functools import functools
import distro
from os import path from os import path
print = functools.partial(print, flush=True) print = functools.partial(print, flush=True)
@ -164,7 +165,7 @@ endif()
if downloadVcpkg: if downloadVcpkg:
if "HIFI_VCPKG_BOOTSTRAP" in os.environ: if "HIFI_VCPKG_BOOTSTRAP" in os.environ:
print("Cloning vcpkg from github to {}".format(self.path)) print("Cloning vcpkg from github to {}".format(self.path))
hifi_utils.executeSubprocess(['git', 'clone', 'git@github.com:microsoft/vcpkg.git', self.path]) hifi_utils.executeSubprocess(['git', 'clone', 'https://github.com/microsoft/vcpkg', self.path])
print("Bootstrapping vcpkg") print("Bootstrapping vcpkg")
hifi_utils.executeSubprocess([self.bootstrapCmd], folder=self.path) hifi_utils.executeSubprocess([self.bootstrapCmd], folder=self.path)
else: else:
@ -286,15 +287,32 @@ endif()
elif platform.system() == 'Darwin': elif platform.system() == 'Darwin':
url = self.assets_url + '/dependencies/vcpkg/qt5-install-5.12.3-macos.tar.gz%3FversionId=bLAgnoJ8IMKpqv8NFDcAu8hsyQy3Rwwz' url = self.assets_url + '/dependencies/vcpkg/qt5-install-5.12.3-macos.tar.gz%3FversionId=bLAgnoJ8IMKpqv8NFDcAu8hsyQy3Rwwz'
elif platform.system() == 'Linux': elif platform.system() == 'Linux':
if platform.linux_distribution()[1][:3] == '16.': dist = distro.linux_distribution()
url = self.assets_url + '/dependencies/vcpkg/qt5-install-5.12.3-ubuntu-16.04-with-symbols.tar.gz'
elif platform.linux_distribution()[1][:3] == '18.': if distro.id() == 'ubuntu':
url = self.assets_url + '/dependencies/vcpkg/qt5-install-5.12.3-ubuntu-18.04.tar.gz' u_major = int( distro.major_version() )
u_minor = int( distro.minor_version() )
if u_major == 16:
url = self.assets_url + '/dependencies/vcpkg/qt5-install-5.12.3-ubuntu-16.04-with-symbols.tar.gz'
elif u_major == 18:
url = self.assets_url + '/dependencies/vcpkg/qt5-install-5.12.3-ubuntu-18.04.tar.gz'
elif u_major == 19 and u_minor == 10:
url = self.assets_url + '/dependencies/vcpkg/qt5-install-5.12.6-ubuntu-19.10.tar.xz'
elif u_major > 18 and ( u_major != 19 and u_minor != 4):
print("We don't support " + distro.name(pretty=True) + " yet. Perhaps consider helping us out?")
else:
print("Sorry, " + distro.name(pretty=True) + " is old and won't be officially supported. Please consider upgrading.");
else: else:
print('UNKNOWN LINUX VERSION!!!') 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/kasenvr/project-athena/tree/kasen/core/tools/qt-builder")
return; return;
else: else:
print('UNKNOWN OPERATING SYSTEM!!!') print('UNKNOWN OPERATING SYSTEM!!!')
print("System : " + platform.system())
print("Architecture: " + platform.architecture())
print("Machine : " + platform.machine())
return; return;
print('Extracting ' + url + ' to ' + dest) print('Extracting ' + url + ' to ' + dest)

View file

@ -22,6 +22,7 @@
#include <LimitedNodeList.h> #include <LimitedNodeList.h>
#include <NetworkAccessManager.h> #include <NetworkAccessManager.h>
#include <NetworkingConstants.h> #include <NetworkingConstants.h>
#include <MetaverseAPI.h>
#include <udt/PacketHeaders.h> #include <udt/PacketHeaders.h>
#include <SharedUtil.h> #include <SharedUtil.h>
@ -209,7 +210,7 @@ void IceServer::requestDomainPublicKey(const QUuid& domainID) {
// send a request to the metaverse API for the public key for this domain // send a request to the metaverse API for the public key for this domain
auto& networkAccessManager = NetworkAccessManager::getInstance(); auto& networkAccessManager = NetworkAccessManager::getInstance();
QUrl publicKeyURL { NetworkingConstants::METAVERSE_SERVER_URL() }; QUrl publicKeyURL{ MetaverseAPI::getCurrentMetaverseServerURL() };
QString publicKeyPath = QString("/api/v1/domains/%1/public_key").arg(uuidStringWithoutCurlyBraces(domainID)); QString publicKeyPath = QString("/api/v1/domains/%1/public_key").arg(uuidStringWithoutCurlyBraces(domainID));
publicKeyURL.setPath(publicKeyPath); publicKeyURL.setPath(publicKeyPath);

View file

@ -15,9 +15,9 @@ set(CUSTOM_INTERFACE_QRC_PATHS "")
find_npm() find_npm()
#if (BUILD_TOOLS AND NPM_EXECUTABLE) if (BUILD_TOOLS AND NPM_EXECUTABLE)
# add_custom_qrc_path(CUSTOM_INTERFACE_QRC_PATHS "${CMAKE_SOURCE_DIR}/tools/jsdoc/out/hifiJSDoc.json" "auto-complete/hifiJSDoc.json") add_custom_qrc_path(CUSTOM_INTERFACE_QRC_PATHS "${CMAKE_SOURCE_DIR}/tools/jsdoc/out/hifiJSDoc.json" "auto-complete/hifiJSDoc.json")
#endif () endif ()
set(RESOURCES_QRC ${CMAKE_CURRENT_BINARY_DIR}/resources.qrc) set(RESOURCES_QRC ${CMAKE_CURRENT_BINARY_DIR}/resources.qrc)
set(RESOURCES_RCC ${CMAKE_CURRENT_SOURCE_DIR}/compiledResources/resources.rcc) set(RESOURCES_RCC ${CMAKE_CURRENT_SOURCE_DIR}/compiledResources/resources.rcc)
@ -142,6 +142,9 @@ if (APPLE)
list(APPEND INTERFACE_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/icon/${INTERFACE_ICON_FILENAME}) list(APPEND INTERFACE_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/icon/${INTERFACE_ICON_FILENAME})
endif() endif()
if (UNIX)
set(BUILD_SHARED_LIBS ON)
endif ()
# create the executable, make it a bundle on OS X # create the executable, make it a bundle on OS X
if (APPLE) if (APPLE)
@ -156,14 +159,14 @@ elseif (WIN32)
set(CONFIGURE_ICON_RC_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/Icon.rc") set(CONFIGURE_ICON_RC_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/Icon.rc")
configure_file("${HF_CMAKE_DIR}/templates/Icon.rc.in" ${CONFIGURE_ICON_RC_OUTPUT}) configure_file("${HF_CMAKE_DIR}/templates/Icon.rc.in" ${CONFIGURE_ICON_RC_OUTPUT})
set(APP_FULL_NAME "High Fidelity") set(APP_FULL_NAME "Project Athena")
set(CONFIGURE_VERSION_INFO_RC_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/VersionInfo.rc") set(CONFIGURE_VERSION_INFO_RC_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/VersionInfo.rc")
configure_file("${HF_CMAKE_DIR}/templates/VersionInfo.rc.in" ${CONFIGURE_VERSION_INFO_RC_OUTPUT}) configure_file("${HF_CMAKE_DIR}/templates/VersionInfo.rc.in" ${CONFIGURE_VERSION_INFO_RC_OUTPUT})
# add an executable that also has the icon itself and the configured rc file as resources # add an executable that also has the icon itself and the configured rc file as resources
#add_executable(${TARGET_NAME} WIN32 ${INTERFACE_SRCS} ${QM} ${CONFIGURE_ICON_RC_OUTPUT} ${CONFIGURE_VERSION_INFO_RC_OUTPUT}) add_executable(${TARGET_NAME} WIN32 ${INTERFACE_SRCS} ${QM} ${CONFIGURE_ICON_RC_OUTPUT} ${CONFIGURE_VERSION_INFO_RC_OUTPUT})
##^^^^^ creates native Win32 app w/o cmd console vvvvvv forces cmd console for logging ##^^^^^ creates native Win32 app w/o cmd console vvvvvv forces cmd console for logging
add_executable(${TARGET_NAME} ${INTERFACE_SRCS} ${QM} ${CONFIGURE_ICON_RC_OUTPUT} ${CONFIGURE_VERSION_INFO_RC_OUTPUT}) # add_executable(${TARGET_NAME} ${INTERFACE_SRCS} ${QM} ${CONFIGURE_ICON_RC_OUTPUT} ${CONFIGURE_VERSION_INFO_RC_OUTPUT})
if (NOT DEV_BUILD) if (NOT DEV_BUILD)
add_custom_command( add_custom_command(
@ -182,10 +185,10 @@ else ()
endif () endif ()
#if (BUILD_TOOLS AND NPM_EXECUTABLE) if (BUILD_TOOLS AND NPM_EXECUTABLE)
# require JSDoc to be build before interface is deployed # require JSDoc to be build before interface is deployed
# add_dependencies(resources jsdoc) add_dependencies(resources jsdoc)
#endif() endif()
add_dependencies(${TARGET_NAME} resources) add_dependencies(${TARGET_NAME} resources)
@ -326,9 +329,9 @@ if (APPLE)
"${CMAKE_SOURCE_DIR}/scripts" "${CMAKE_SOURCE_DIR}/scripts"
"${RESOURCES_DEV_DIR}/scripts" "${RESOURCES_DEV_DIR}/scripts"
# copy JSDoc files beside the executable # copy JSDoc files beside the executable
#COMMAND "${CMAKE_COMMAND}" -E copy_directory COMMAND "${CMAKE_COMMAND}" -E copy_directory
# "${CMAKE_SOURCE_DIR}/tools/jsdoc/out" "${CMAKE_SOURCE_DIR}/tools/jsdoc/out"
# "${RESOURCES_DEV_DIR}/jsdoc" "${RESOURCES_DEV_DIR}/jsdoc"
# copy the resources files beside the executable # copy the resources files beside the executable
COMMAND "${CMAKE_COMMAND}" -E copy_if_different COMMAND "${CMAKE_COMMAND}" -E copy_if_different
"${RESOURCES_RCC}" "${RESOURCES_RCC}"
@ -381,9 +384,9 @@ else()
"${PROJECT_SOURCE_DIR}/resources/serverless/redirect.json" "${PROJECT_SOURCE_DIR}/resources/serverless/redirect.json"
"${RESOURCES_DEV_DIR}/serverless/redirect.json" "${RESOURCES_DEV_DIR}/serverless/redirect.json"
# copy JSDoc files beside the executable # copy JSDoc files beside the executable
#COMMAND "${CMAKE_COMMAND}" -E copy_directory COMMAND "${CMAKE_COMMAND}" -E copy_directory
# "${CMAKE_SOURCE_DIR}/tools/jsdoc/out" "${CMAKE_SOURCE_DIR}/tools/jsdoc/out"
# "${INTERFACE_EXEC_DIR}/jsdoc" "${INTERFACE_EXEC_DIR}/jsdoc"
) )
# link target to external libraries # link target to external libraries

Binary file not shown.

Before

Width:  |  Height:  |  Size: 246 KiB

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 331 KiB

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 308 KiB

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 229 KiB

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 KiB

After

Width:  |  Height:  |  Size: 134 KiB

View file

@ -77,13 +77,13 @@
var handControllerImageURL = null; var handControllerImageURL = null;
var index = 0; var index = 0;
var count = 3; var count = 3;
var handControllerRefURL = "https://docs.highfidelity.com/explore/get-started/vr-controls.html#vr-controls"; var handControllerRefURL = "https://docs.projectathena.dev/explore/get-started/vr-controls.html#vr-controls";
var keyboardRefURL = "https://docs.highfidelity.com/explore/get-started/desktop.html#movement-controls"; var keyboardRefURL = "https://docs.projectathena.dev/explore/get-started/desktop.html#movement-controls";
var gamepadRefURL = "https://docs.highfidelity.com/explore/get-started/vr-controls.html#gamepad"; var gamepadRefURL = "https://docs.projectathena.dev/explore/get-started/vr-controls.html#gamepad";
function showKbm() { function showKbm() {
document.getElementById("main_image").setAttribute("src", "img/tablet-help-keyboard.jpg"); document.getElementById("main_image").setAttribute("src", "img/tablet-help-keyboard.jpg");
document.getElementById("image_button").setAttribute("href", keyboardRefURL); document.getElementById("image_button").setAttribute("href", keyboardRefURL);
} }
function showHandControllers() { function showHandControllers() {
@ -189,7 +189,7 @@
<a href="#" id="right_button" onmousedown="cycleRight()"></a> <a href="#" id="right_button" onmousedown="cycleRight()"></a>
<a href="#" id="image_button"></a> <a href="#" id="image_button"></a>
</div> </div>
<a href="mailto:support@highfidelity.com" id="report_problem">Report Problem</a> <a href="mailto:support@projectathena.io" id="report_problem">Report Problem</a>
</body> </body>
</html> </html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
viewBox="0 0 360 120.9"
data-name="Layer 1"
id="Layer_1">
<metadata
id="metadata5178">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Artboard 1</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs5143">
<style
id="style5141">.cls-1{fill:#fff;}</style>
<linearGradient
gradientUnits="userSpaceOnUse"
y2="201.98439"
x2="188.125"
y1="74.484383"
x1="52.476562"
id="linearGradient7736"
xlink:href="#linearGradient7734"
gradientTransform="matrix(0.36497785,0,0,0.36497785,267.61793,-6.286912)" />
<linearGradient
id="linearGradient7734">
<stop
id="stop7730"
offset="0"
style="stop-color:#ff0000;stop-opacity:1" />
<stop
style="stop-color:#ffff00;stop-opacity:1"
offset="0.39864159"
id="stop7738" />
<stop
id="stop7740"
offset="0.54261029"
style="stop-color:#ccff00;stop-opacity:1" />
<stop
style="stop-color:#00ffff;stop-opacity:1"
offset="0.71236038"
id="stop7742" />
<stop
id="stop7744"
offset="0.99037486"
style="stop-color:#ff00ff;stop-opacity:1" />
<stop
id="stop7732"
offset="1"
style="stop-color:#0000ff;stop-opacity:1" />
</linearGradient>
<filter
height="1.2171938"
y="-0.10859691"
width="1.1880955"
x="-0.09404768"
id="filter7597"
style="color-interpolation-filters:sRGB">
<feGaussianBlur
id="feGaussianBlur7599"
stdDeviation="4.2634807" />
</filter>
</defs>
<title
id="title5145">Artboard 1</title>
<g
id="text4562"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
aria-label="Project Athena">
<path
id="path5741"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48px;font-family:OpineHeavy;-inkscape-font-specification:OpineHeavy;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="M 0.3661321,106.82553 V 72.265531 H 17.406132 q 4.944,0 8.208,2.592 3.264,2.592 4.224,7.296 0.336,1.632 0.336,3.312 0,5.136 -3.12,8.304 -3.072,3.12 -7.92,3.12 h -6 v 9.935999 z M 15.198132,88.057531 q 2.592,0 3.024,-2.112 0.144,-0.72 0.144,-1.296 0,-1.872 -1.488,-2.496 -0.24,-0.096 -0.624,-0.144 -0.384,-0.048 -1.296,-0.048 h -1.824 v 6.096 z" />
<path
id="path5743"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48px;font-family:OpineHeavy;-inkscape-font-specification:OpineHeavy;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="M 32.428632,106.82553 V 88.009531 l 11.04,-6.624 v 3.792 l 0.576,-0.528 q 2.832,-2.592 6.768,-2.592 0.528,0 0.912,0 0.384,0 1.008,0.144 0.624,0.144 1.056,0.24 0.48,0.096 1.296,0.432 l -3.696,11.136 q -0.288,-0.288 -0.816,-0.624 -0.528,-0.336 -1.104,-0.528 -0.528,-0.24 -1.344,-0.24 -1.488,0 -2.544,0.912 -1.008,0.864 -1.2,2.064 -0.192,1.152 -0.192,2.496 v 8.735999 z" />
<path
id="path5745"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48px;font-family:OpineHeavy;-inkscape-font-specification:OpineHeavy;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="m 54.405132,94.825531 q 0,-5.424 3.888,-9.264 3.936,-3.888 9.504,-3.888 2.736,0 5.184,1.056 3.84,1.584 6,4.944 2.16,3.36 2.16,7.248 0,2.496 -0.96,4.848 -0.912,2.351999 -2.832,4.271999 -3.936,3.936 -9.552,3.936 -5.616,0 -9.504,-3.84 -3.888,-3.84 -3.888,-9.311999 z m 11.712,2.544 q 0.672,0.72 1.68,0.72 1.008,0 1.728,-0.816 0.768,-0.864 0.768,-2.448 0,-1.536 -0.768,-2.4 -0.72,-0.864 -1.728,-0.864 -1.008,0 -1.68,0.768 -0.864,0.96 -0.864,2.496 0,1.584 0.864,2.544 z" />
<path
id="path5747"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48px;font-family:OpineHeavy;-inkscape-font-specification:OpineHeavy;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="M 84.272382,115.46553 V 87.913531 l 11.76,-6.48 v 34.031999 z m 0.096,-39.167999 q 0,-2.592 1.68,-4.512 1.68,-1.92 4.224,-1.92 1.392,0 2.544,0.432 1.152,0.384 2.064,1.296 1.824,1.776 1.824,4.368 0,2.544 -1.776,4.368 -1.728,1.776 -4.176,1.776 -2.592,0 -4.512,-1.632 -1.872,-1.68 -1.872,-4.176 z" />
<path
id="path5749"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48px;font-family:OpineHeavy;-inkscape-font-specification:OpineHeavy;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="m 124.75588,91.465531 -13.44,6.816 0.24,0.336 q 0.768,0.768 1.584,0.768 0.336,0 0.816,-0.192 0.48,-0.192 0.912,-0.672 l 0.096,-0.192 0.144,-0.192 7.488,4.511999 q -1.44,1.92 -3.552,3.216 -2.112,1.248 -4.656,1.728 -1.344,0.24 -2.496,0.24 -3.504,0 -6.48,-1.776 -6.335998,-3.6 -6.335998,-10.799999 0,-1.104 0.24,-2.544 0.624,-4.08 3.455998,-6.96 2.832,-2.88 6.912,-3.648 1.248,-0.192 1.728,-0.192 0.528,-0.048 0.816,-0.048 1.296,0 2.544,0.288 6.864,1.488 9.552,7.968 z m -11.52,-1.728 q -0.96,0 -1.392,0.144 -1.44,0.432 -2.112,1.488 -0.672,1.056 -0.672,2.112 0,0.384 0.192,1.056 l 6.624,-3.36 q -0.48,-0.624 -1.152,-1.008 -0.672,-0.432 -1.488,-0.432 z" />
<path
id="path5751"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48px;font-family:OpineHeavy;-inkscape-font-specification:OpineHeavy;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="m 148.01638,83.785531 -2.592,8.64 -0.432,-0.288 q -1.344,-0.816 -2.208,-0.96 -0.864,-0.192 -1.536,-0.192 -1.68,0 -2.688,1.488 -0.576,1.008 -0.576,2.064 0,0.288 0.096,0.768 0.624,2.736 3.456,2.736 1.392,0 3.024,-0.672 l 0.576,-0.192 0.288,-0.144 2.4,7.919999 q -0.912,0.672 -2.16,1.2 -3.6,1.632 -7.008,1.632 -6.72,0 -10.56,-5.856 -2.16,-3.215999 -2.16,-7.199999 0,-1.248 0.288,-2.64 0.96,-4.704 4.56,-7.536 3.648,-2.88 8.688,-2.88 3.264,0 6.528,1.248 0.576,0.192 0.96,0.384 0.432,0.192 1.056,0.48 z" />
<path
id="path5753"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48px;font-family:OpineHeavy;-inkscape-font-specification:OpineHeavy;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="m 147.34438,91.609531 16.128,-20.208 v 11.232 h 5.616 l -3.12,8.976 h -2.496 v 15.215999 h -11.76 V 91.609531 Z" />
<path
id="path5755"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48px;font-family:OpineHeavy;-inkscape-font-specification:OpineHeavy;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="m 179.49613,106.82553 12.288,-34.559999 h 13.296 l 12.288,34.559999 h -13.824 l -0.96,-4.416 h -8.304 l -1.008,4.416 z m 21.6,-13.151999 -1.872,-8.256 -0.432,-1.968 -0.288,-2.304 q 0,0.912 -0.144,1.392 -0.096,0.48 -0.192,0.96 l -0.48,1.92 -1.872,8.256 z" />
<path
id="path5757"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48px;font-family:OpineHeavy;-inkscape-font-specification:OpineHeavy;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="m 214.75063,91.609531 16.128,-20.208 v 11.232 h 5.616 l -3.12,8.976 h -2.496 v 15.215999 h -11.76 V 91.609531 Z" />
<path
id="path5759"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48px;font-family:OpineHeavy;-inkscape-font-specification:OpineHeavy;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="M 236.14738,106.82553 V 77.689531 l 11.76,-6.528 v 13.488 l 0.288,-0.336 0.384,-0.336 q 1.152,-1.008 2.592,-1.536 2.016,-0.72 3.888,-0.72 3.6,0 5.904,2.4 2.304,2.4 2.304,6.144 v 16.559999 h -11.76 V 94.393531 q 0,-2.688 -2.112,-2.4 -1.488,0.288 -1.488,2.448 v 12.383999 z" />
<path
id="path5761"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48px;font-family:OpineHeavy;-inkscape-font-specification:OpineHeavy;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="m 292.00588,91.465531 -13.44,6.816 0.24,0.336 q 0.768,0.768 1.584,0.768 0.336,0 0.816,-0.192 0.48,-0.192 0.912,-0.672 l 0.096,-0.192 0.144,-0.192 7.488,4.511999 q -1.44,1.92 -3.552,3.216 -2.112,1.248 -4.656,1.728 -1.344,0.24 -2.496,0.24 -3.504,0 -6.48,-1.776 -6.336,-3.6 -6.336,-10.799999 0,-1.104 0.24,-2.544 0.624,-4.08 3.456,-6.96 2.832,-2.88 6.912,-3.648 1.248,-0.192 1.728,-0.192 0.528,-0.048 0.816,-0.048 1.296,0 2.544,0.288 6.864,1.488 9.552,7.968 z m -11.52,-1.728 q -0.96,0 -1.392,0.144 -1.44,0.432 -2.112,1.488 -0.672,1.056 -0.672,2.112 0,0.384 0.192,1.056 l 6.624,-3.36 q -0.48,-0.624 -1.152,-1.008 -0.672,-0.432 -1.488,-0.432 z" />
<path
id="path5763"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48px;font-family:OpineHeavy;-inkscape-font-specification:OpineHeavy;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="m 293.52238,87.913531 11.04,-6.576 v 3.552 q 1.152,-1.44 3.024,-2.208 1.872,-0.816 4.464,-0.816 4.128,0 6.336,2.352 2.256,2.304 2.256,6.528 v 16.079999 h -11.76 V 94.153531 q 0,-2.304 -1.776,-2.304 -1.776,0 -1.776,2.88 l 0.048,12.095999 h -11.76 z" />
<path
id="path5765"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48px;font-family:OpineHeavy;-inkscape-font-specification:OpineHeavy;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="m 341.70088,84.889531 v -2.256 h 11.088 v 24.191999 h -11.088 v -2.496 q -1.2,1.488 -3.072,2.304 -1.872,0.816 -4.32,0.816 -4.56,0 -7.44,-3.12 -3.12,-3.36 -3.12,-9.215999 0,-5.856 3.072,-9.504 3.072,-3.648 7.584,-3.648 1.008,0 2.256,0.24 1.248,0.24 2.64,0.96 1.392,0.72 2.4,1.728 z m -3.84,12.864 q 0.192,0.048 0.336,0.048 0.144,0 0.192,0 1.104,0 1.824,-0.912 0.768,-0.96 0.768,-2.64 0,-1.344 -0.576,-2.112 -0.528,-0.816 -1.536,-1.056 -0.192,-0.048 -0.528,-0.048 -2.256,0 -2.64,2.88 v 0.624 q 0,1.392 0.528,2.256 0.576,0.816 1.632,0.96 z" />
</g>
<path
transform="matrix(0.69899025,0,0,0.69899025,269.31594,32.684837)"
id="path3799-2"
d="m 91.832079,57.500977 -54.399819,-3e-6 -27.199907,-47.111626 27.199912,-47.111623 54.399818,3e-6 27.199907,47.111626 z"
style="display:inline;opacity:0.93500001;fill:#3a3937;fill-opacity:1;stroke:#0092d4;stroke-width:9.56400013;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter7597)" />
<path
id="path4704"
d="m 333.58541,10.641061 c -1.33042,-0.003 -2.6614,0.02719 -3.99105,0.08885 -10.63729,0.492794 -21.18542,3.054485 -30.61336,7.960541 -12.58659,6.549722 -22.9644,17.350793 -27.86872,30.474604 -0.74714,1.999314 -1.43163,4.195201 -1.50307,6.589093 -0.0565,1.888571 0.29775,3.884417 1.27773,5.657351 l 3.81151,-1.936715 c -0.56198,-1.016544 -0.833,-2.297505 -0.79411,-3.599793 0.0501,-1.679736 0.56345,-3.455978 1.24801,-5.287791 4.49756,-12.035358 14.14243,-22.123913 25.85832,-28.220559 8.79888,-4.578713 18.73478,-7.001788 28.79335,-7.470115 3.35287,-0.156099 6.7192,-0.09515 10.06201,0.175426 2.93218,0.237351 5.73367,0.646171 8.1239,1.68684 1.19179,0.518899 2.27932,1.195515 3.16519,2.017423 0.42257,0.392059 0.80015,0.822607 1.12389,1.278292 l 3.82437,-1.942984 c -0.5612,-0.867683 -1.23086,-1.656127 -1.97867,-2.349944 -1.30077,-1.206889 -2.80875,-2.124025 -4.37706,-2.806858 -3.12999,-1.362756 -6.42744,-1.788546 -9.52453,-2.039252 -2.20449,-0.178433 -4.42036,-0.270573 -6.63771,-0.274441 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4.23338938;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
id="rect4616"
d="M 332.27108,6.4873186 302.92243,35.836669 V 7.463203 h -8.85213 v 64.708723 h 8.85213 v -23.81623 l 5.76336,-5.764087 25.34887,25.348857 6.25951,-6.259517 -25.34886,-25.348857 23.58527,-23.585265 z"
style="display:inline;opacity:1;fill:url(#linearGradient7736);fill-opacity:1;stroke:none;stroke-width:7.73268747;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="display:inline;fill:none;fill-opacity:1;stroke:#0092d4;stroke-width:6.68530035;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 333.50566,72.877373 -38.02494,-2e-6 -19.01247,-32.930565 19.01248,-32.9305635 38.02494,1.8e-6 19.01247,32.9305657 z"
id="path3799" />
<path
id="path4704-6"
d="m 356.08812,18.088179 -3.82438,1.945692 c 0.35892,0.501671 0.65258,1.033693 0.86041,1.582768 0.50474,1.333501 0.56989,2.917749 0.29001,4.495637 -0.28192,1.589386 -0.90095,3.203676 -1.66094,4.844551 -5.48664,11.845931 -16.20091,21.205609 -28.57285,26.516947 -12.39358,5.320605 -26.41056,6.815809 -40.05475,5.569639 -1.68347,-0.153759 -3.24995,-0.35005 -4.62129,-0.787094 -1.35534,-0.431958 -2.54518,-1.130952 -3.29455,-2.02716 -0.18643,-0.22298 -0.36768,-0.495132 -0.51492,-0.758591 l -3.81239,1.922314 c 0.2748,0.493806 0.61298,1.012955 0.9906,1.464582 1.42784,1.70764 3.3631,2.74692 5.29048,3.361179 1.9114,0.609193 3.80307,0.816132 5.5596,0.976564 14.23496,1.300129 28.98,-0.233493 42.19527,-5.906858 13.23694,-5.68266 24.75883,-15.678884 30.75317,-28.620923 0.8299,-1.791855 1.60226,-3.728332 1.97824,-5.847981 0.37802,-2.131162 0.34038,-4.441307 -0.49205,-6.640562 -0.28066,-0.741451 -0.64526,-1.437996 -1.06966,-2.090704 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4.23338938;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -6,7 +6,7 @@ import controlsUit 1.0
WebView { WebView {
id: webview id: webview
url: "https://highfidelity.com/" url: "https://projectathena.io/"
profile: FileTypeProfile; profile: FileTypeProfile;
property var parentRoot: null property var parentRoot: null

View file

@ -40,7 +40,7 @@ Controls.WebView {
userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard, userScript ] userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard, userScript ]
function onWebEventReceived(event) { function onWebEventReceived(event) {
if (event.slice(0, 17) === "CLARA.IO DOWNLOAD") { if (typeof event === "string" && event.slice(0, 17) === "CLARA.IO DOWNLOAD") {
ApplicationInterface.addAssetToWorldFromURL(event.slice(18)); ApplicationInterface.addAssetToWorldFromURL(event.slice(18));
} }
} }

View file

@ -4,6 +4,7 @@
// Created by David Rowe on 3 Jun 2015 // Created by David Rowe on 3 Jun 2015
// Copyright 2015 High Fidelity, Inc. // Copyright 2015 High Fidelity, Inc.
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
//
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
@ -84,7 +85,7 @@ FocusScope {
Image { Image {
id: banner id: banner
anchors.centerIn: parent anchors.centerIn: parent
source: "../images/high-fidelity-banner.svg" source: "../images/project-athena-banner-color2.svg"
horizontalAlignment: Image.AlignHCenter horizontalAlignment: Image.AlignHCenter
} }
} }

View file

@ -356,7 +356,7 @@ Item {
font.pixelSize: linkAccountBody.textFieldFontSize font.pixelSize: linkAccountBody.textFieldFontSize
font.bold: linkAccountBody.fontBold font.bold: linkAccountBody.fontBold
text: "<a href='https://highfidelity.com/users/password/new'> Can't access your account?</a>" text: "<a href='metaverse.projectathena.io/users/password/new'> Can't access your account?</a>"
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
@ -480,7 +480,7 @@ Item {
leftMargin: hifi.dimensions.contentSpacing.x leftMargin: hifi.dimensions.contentSpacing.x
} }
text: "<a href='https://highfidelity.com'>Sign Up</a>" text: "<a href='metaverse.projectathena.io/users/register'>Sign Up</a>"
linkColor: hifi.colors.blueAccent linkColor: hifi.colors.blueAccent
onLinkActivated: { onLinkActivated: {

View file

@ -23,7 +23,7 @@ Item {
clip: true clip: true
height: root.height height: root.height
width: root.width width: root.width
readonly property string termsContainerText: qsTr("By signing up, you agree to High Fidelity's Terms of Service") readonly property string termsContainerText: qsTr("By signing up, you agree to Project Athena's Terms of Service")
property int textFieldHeight: 31 property int textFieldHeight: 31
property string fontFamily: "Raleway" property string fontFamily: "Raleway"
property int fontSize: 15 property int fontSize: 15
@ -395,7 +395,7 @@ Item {
text: signUpBody.termsContainerText text: signUpBody.termsContainerText
Component.onCompleted: { Component.onCompleted: {
// with the link. // with the link.
termsText.text = qsTr("By signing up, you agree to <a href='https://www.highfidelity.com/termsofservice'>High Fidelity's Terms of Service</a>") termsText.text = qsTr("By signing up, you agree to <a href='https://projectathena.io/termsofservice'>Project Athena's Terms of Service</a>")
} }
} }

View file

@ -19,7 +19,7 @@ import TabletScriptingInterface 1.0
Item { Item {
id: usernameCollisionBody id: usernameCollisionBody
clip: true clip: true
readonly property string termsContainerText: qsTr("By creating this user profile, you agree to High Fidelity's Terms of Service") readonly property string termsContainerText: qsTr("By creating this user profile, you agree to Project Athena's Terms of Service")
width: root.width width: root.width
height: root.height height: root.height
readonly property string fontFamily: "Raleway" readonly property string fontFamily: "Raleway"
@ -218,7 +218,7 @@ Item {
text: usernameCollisionBody.termsContainerText text: usernameCollisionBody.termsContainerText
Component.onCompleted: { Component.onCompleted: {
// with the link. // with the link.
termsText.text = qsTr("By creating this user profile, you agree to <a href='https://www.highfidelity.com/termsofservice'>High Fidelity's Terms of Service</a>") termsText.text = qsTr("By creating this user profile, you agree to <a href='https://projectathena.io/termsofservice'>Project Athena's Terms of Service</a>")
} }
} }

View file

@ -129,7 +129,7 @@ FocusScope {
Image { Image {
id: banner id: banner
anchors.centerIn: parent anchors.centerIn: parent
source: "../../images/high-fidelity-banner.svg" source: "../../images/project-athena-banner-color2.svg"
horizontalAlignment: Image.AlignHCenter horizontalAlignment: Image.AlignHCenter
} }
} }

View file

@ -44,7 +44,6 @@ Rectangle {
return (root.parent !== null) && root.parent.objectName == "loader"; return (root.parent !== null) && root.parent.objectName == "loader";
} }
property bool isVR: AudioScriptingInterface.context === "VR" property bool isVR: AudioScriptingInterface.context === "VR"
property real rightMostInputLevelPos: root.width property real rightMostInputLevelPos: root.width
//placeholder for control sizes and paddings //placeholder for control sizes and paddings
@ -128,16 +127,16 @@ Rectangle {
anchors.top: flickView.top; anchors.top: flickView.top;
anchors.right: flickView.right; anchors.right: flickView.right;
anchors.bottom: flickView.bottom; anchors.bottom: flickView.bottom;
anchors.rightMargin: -verticalScrollWidth; //compensate flickView's right margin z: 100 // Display over top of separators.
background: Item { background: Item {
implicitWidth: verticalScrollWidth; implicitWidth: verticalScrollWidth;
Rectangle { Rectangle {
color: hifi.colors.darkGray30; color: hifi.colors.baseGrayShadow
radius: 4; radius: 4;
anchors { anchors {
fill: parent; fill: parent;
topMargin: -1; // Finesse size topMargin: 2 // Finess position
bottomMargin: -2;
} }
} }
} }
@ -148,9 +147,7 @@ Rectangle {
color: hifi.colors.white30; color: hifi.colors.white30;
anchors { anchors {
fill: parent; fill: parent;
leftMargin: 2; // Finesse size and position. topMargin: 1; // Finesse position.
topMargin: 1;
bottomMargin: 1;
} }
} }
} }
@ -338,7 +335,6 @@ Rectangle {
anchors.topMargin: 10; anchors.topMargin: 10;
} }
Item { Item {
id: inputDeviceHeader id: inputDeviceHeader
x: margins.paddings; x: margins.paddings;
@ -688,4 +684,5 @@ Rectangle {
anchors.topMargin: 10; anchors.topMargin: 10;
} }
} }
} }

View file

@ -229,7 +229,7 @@ Item {
} }
function openDocs() { function openDocs() {
Qt.openUrlExternally("https://docs.highfidelity.com/create/avatars/package-avatar.html"); Qt.openUrlExternally("https://docs.projectathena.dev/create/avatars/package-avatar.html");
} }
function openVideo() { function openVideo() {

View file

@ -128,6 +128,8 @@ ShadowRectangle {
} }
} }
// FIXME: Link to a Project Athena version of the video.
/*
RalewayButton { RalewayButton {
id: video id: video
visible: false visible: false
@ -141,6 +143,12 @@ ShadowRectangle {
onClicked: videoButtonClicked() onClicked: videoButtonClicked()
} }
*/
// Temporary placeholder for video button.
Rectangle {
id: video
visible: false
}
RalewayButton { RalewayButton {
id: docs id: docs

View file

@ -44,7 +44,11 @@ Item {
HifiControls.Button { HifiControls.Button {
id: uploadButton id: uploadButton
// FIXME: Re-enable if ability to upload to hosted location is added.
/*
visible: AvatarPackagerCore.currentAvatarProject && !AvatarPackagerCore.currentAvatarProject.fst.hasMarketplaceID && !root.hasSuccessfullyUploaded visible: AvatarPackagerCore.currentAvatarProject && !AvatarPackagerCore.currentAvatarProject.fst.hasMarketplaceID && !root.hasSuccessfullyUploaded
*/
visible: false
enabled: Account.loggedIn enabled: Account.loggedIn
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
@ -62,7 +66,11 @@ Item {
HifiControls.Button { HifiControls.Button {
id: updateButton id: updateButton
// FIXME: Re-enable if ability to upload to hosted location is added.
/*
visible: AvatarPackagerCore.currentAvatarProject && AvatarPackagerCore.currentAvatarProject.fst.hasMarketplaceID && !root.hasSuccessfullyUploaded visible: AvatarPackagerCore.currentAvatarProject && AvatarPackagerCore.currentAvatarProject.fst.hasMarketplaceID && !root.hasSuccessfullyUploaded
*/
visible: false
enabled: Account.loggedIn enabled: Account.loggedIn
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
@ -79,7 +87,12 @@ Item {
} }
Item { Item {
anchors.fill: parent anchors.fill: parent
// FIXME: Re-enable if ability to upload to hosted location is added.
/*
visible: root.hasSuccessfullyUploaded visible: root.hasSuccessfullyUploaded
*/
visible: false;
HifiControls.Button { HifiControls.Button {
enabled: Account.loggedIn enabled: Account.loggedIn
@ -115,6 +128,22 @@ Item {
onClicked: AvatarPackagerCore.currentAvatarProject.openInInventory() onClicked: AvatarPackagerCore.currentAvatarProject.openInInventory()
} }
} }
// FIXME: Remove if "Upload" button is reinstated.
HifiControls.Button {
id: openDirectoryButton
visible: AvatarPackagerCore.currentAvatarProject
enabled: true
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
text: qsTr("Open Project Folder")
color: hifi.buttons.blue
colorScheme: root.colorScheme
width: 200
height: 40
onClicked: {
fileDialogHelper.openDirectory(fileDialogHelper.pathToUrl(AvatarPackagerCore.currentAvatarProject.projectFolderPath));
}
}
} }
Rectangle { Rectangle {
@ -263,13 +292,58 @@ Item {
color: 'white' color: 'white'
size: 20 size: 20
anchors.left: parent.left anchors.horizontalCenter: parent.horizontalCenter
anchors.right: parent.right
anchors.top: errorsGlyph.bottom anchors.top: errorsGlyph.bottom
wrapMode: Text.Wrap wrapMode: Text.Wrap
} }
RalewayRegular {
id: notForSaleMessage
visible: root.hasSuccessfullyUploaded
color: 'white'
linkColor: '#00B4EF'
size: 20
anchors.left: parent.left
anchors.right: parent.right
anchors.top: doctorStatusMessage.bottom
anchors.topMargin: 10
anchors.bottomMargin: 24
wrapMode: Text.Wrap
text: "This item is not for sale yet, <a href='#'>learn more</a>."
onLinkActivated: {
Qt.openUrlExternally("https://docs.projectathena.dev/sell/add-item/upload-avatar.html");
}
}
RalewayRegular {
id: showErrorsLink
color: 'white'
linkColor: '#00B4EF'
visible: AvatarPackagerCore.currentAvatarProject && AvatarPackagerCore.currentAvatarProject.hasErrors
anchors {
top: notForSaleMessage.bottom
horizontalCenter: parent.horizontalCenter
}
size: 28
text: "<a href='toggle'>View all errors</a>"
onLinkActivated: {
avatarPackager.state = AvatarPackagerState.avatarDoctorErrorReport;
}
}
RalewayRegular { RalewayRegular {
id: infoMessage id: infoMessage
@ -297,60 +371,14 @@ Item {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.top: doctorStatusMessage.bottom anchors.bottom: showFilesText.top
anchors.bottomMargin: 24 anchors.bottomMargin: 24
wrapMode: Text.Wrap wrapMode: Text.Wrap
text: "You can upload your files to our servers to always access them, and to make your avatar visible to other users." // FIXME: Restore original text if ability to upload to hosted location is added.
} //text: "You can upload your files to our servers to always access them, and to make your avatar visible to other users."
text: "Your files are ready to be uploaded to a server to make your avatar visible to other users."
RalewayRegular {
id: notForSaleMessage
visible: root.hasSuccessfullyUploaded
color: 'white'
linkColor: '#00B4EF'
size: 20
anchors.left: parent.left
anchors.right: parent.right
anchors.top: infoMessage.bottom
anchors.topMargin: 10
anchors.bottomMargin: 24
wrapMode: Text.Wrap
text: "This item is not for sale yet, <a href='#'>learn more</a>."
onLinkActivated: {
Qt.openUrlExternally("https://docs.highfidelity.com/sell/add-item/upload-avatar.html");
}
}
RalewayRegular {
id: showErrorsLink
color: 'white'
linkColor: '#00B4EF'
visible: AvatarPackagerCore.currentAvatarProject && AvatarPackagerCore.currentAvatarProject.hasErrors
anchors {
top: notForSaleMessage.visible ? notForSaleMessage.bottom : infoMessage .bottom
bottom: showFilesText.top
horizontalCenter: parent.horizontalCenter
}
size: 28
text: "<a href='toggle'>View all errors</a>"
onLinkActivated: {
avatarPackager.state = AvatarPackagerState.avatarDoctorErrorReport;
}
} }
HifiControls.Button { HifiControls.Button {
@ -389,8 +417,13 @@ Item {
Rectangle { Rectangle {
id: loginRequiredMessage id: loginRequiredMessage
// FIXME: Re-enable if ability to upload to hosted location is added.
/*
visible: !Account.loggedIn visible: !Account.loggedIn
height: !Account.loggedIn ? loginRequiredTextRow.height + 20 : 0 height: !Account.loggedIn ? loginRequiredTextRow.height + 20 : 0
*/
visible: false
height: 0
anchors { anchors {
bottom: parent.bottom bottom: parent.bottom

View file

@ -21,17 +21,47 @@ ListModel {
return marketItemUrl; return marketItemUrl;
} }
function makeMarketThumbnailUrl(marketId) {
var avatarThumbnailUrl = "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/%marketId%/large/hifi-mp-%marketId%.jpg"
.split('%marketId%').join(marketId);
return avatarThumbnailUrl;
}
function trimFileExtension(url) {
var trimmedUrl = url.substring(0, (url.indexOf("#") === -1) ? url.length : url.indexOf("#"));
trimmedUrl = trimmedUrl.substring(0, (trimmedUrl.indexOf("?") === -1) ? trimmedUrl.length : trimmedUrl.indexOf("?"));
trimmedUrl = trimmedUrl.substring(0, trimmedUrl.lastIndexOf("."));
return trimmedUrl;
}
function imageExists(imageUrl) {
var http = new XMLHttpRequest();
http.open('HEAD', imageUrl, false);
http.send();
return http.status !== 404;
}
function makeThumbnailUrl(avatarUrl) { function makeThumbnailUrl(avatarUrl) {
var marketId = extractMarketId(avatarUrl); var marketId = extractMarketId(avatarUrl);
if (marketId === '') { if (marketId !== '') {
return makeMarketThumbnailUrl(marketId);
}
var avatarThumbnailFileUrl = trimFileExtension(avatarUrl) + ".jpg";
var thumbnailExist = imageExists(avatarThumbnailFileUrl);
if (!thumbnailExist) {
return ''; return '';
} }
var avatarThumbnailUrl = "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/%marketId%/large/hifi-mp-%marketId%.jpg" return avatarThumbnailFileUrl;
.split('%marketId%').join(marketId);
return avatarThumbnailUrl;
} }
function makeAvatarObject(avatar, avatarName) { function makeAvatarObject(avatar, avatarName) {

View file

@ -7,7 +7,7 @@ MessageBox {
popup.onButton2Clicked = callback; popup.onButton2Clicked = callback;
popup.titleText = 'Specify Avatar URL' popup.titleText = 'Specify Avatar URL'
popup.bodyText = 'This will not overwrite your existing favorite if you are wearing one.<br>' + popup.bodyText = 'This will not overwrite your existing favorite if you are wearing one.<br>' +
'<a href="https://docs.highfidelity.com/create-and-explore/avatars/create-avatars">' + '<a href="https://docs.projectathena.dev/create/avatars/create-avatars.html">' +
'Learn to make a custom avatar by opening this link on your desktop.' + 'Learn to make a custom avatar by opening this link on your desktop.' +
'</a>' '</a>'
popup.inputText.visible = true; popup.inputText.visible = true;

View file

@ -778,7 +778,7 @@ Rectangle {
lightboxPopup.bodyText = "Rezzing this content set will replace the existing environment and all of the items in this domain. " + lightboxPopup.bodyText = "Rezzing this content set will replace the existing environment and all of the items in this domain. " +
"If you want to save the state of the content in this domain, create a backup before proceeding.<br><br>" + "If you want to save the state of the content in this domain, create a backup before proceeding.<br><br>" +
"For more information about backing up and restoring content, " + "For more information about backing up and restoring content, " +
"<a href='https://docs.highfidelity.com/create-and-explore/start-working-in-your-sandbox/restoring-sandbox-content'>" + "<a href='https://docs.projectathena.dev/host/maintain-domain/backup-domain.html'>" +
"click here to open info on your desktop browser."; "click here to open info on your desktop browser.";
lightboxPopup.button1text = "CANCEL"; lightboxPopup.button1text = "CANCEL";
lightboxPopup.button1method = function() { lightboxPopup.button1method = function() {

View file

@ -602,7 +602,7 @@ Rectangle {
lightboxPopup.bodyText = "Rezzing this content set will replace the existing environment and all of the items in this domain. " + lightboxPopup.bodyText = "Rezzing this content set will replace the existing environment and all of the items in this domain. " +
"If you want to save the state of the content in this domain, create a backup before proceeding.<br><br>" + "If you want to save the state of the content in this domain, create a backup before proceeding.<br><br>" +
"For more information about backing up and restoring content, " + "For more information about backing up and restoring content, " +
"<a href='https://docs.highfidelity.com/create-and-explore/start-working-in-your-sandbox/restoring-sandbox-content'>" + "<a href='https://docs.projectathena.dev/host/maintain-domain/backup-domain.html'>" +
"click here to open info on your desktop browser."; "click here to open info on your desktop browser.";
lightboxPopup.button1text = "CANCEL"; lightboxPopup.button1text = "CANCEL";
lightboxPopup.button1method = function() { lightboxPopup.button1method = function() {

View file

@ -207,7 +207,7 @@ At the moment, there is currently no way to convert HFC to other currencies. Sta
if (link === "#privateKeyPath") { if (link === "#privateKeyPath") {
Qt.openUrlExternally("file:///" + root.keyFilePath.substring(0, root.keyFilePath.lastIndexOf('/'))); Qt.openUrlExternally("file:///" + root.keyFilePath.substring(0, root.keyFilePath.lastIndexOf('/')));
} else if (link === "#blockchain") { } else if (link === "#blockchain") {
Qt.openUrlExternally("https://docs.highfidelity.com/high-fidelity-commerce"); Qt.openUrlExternally("https://docs.projectathena.dev/explore/shop.html");
} else if (link === "#bank") { } else if (link === "#bank") {
if ((Account.metaverseServerURL).toString().indexOf("staging") >= 0) { if ((Account.metaverseServerURL).toString().indexOf("staging") >= 0) {
Qt.openUrlExternally("hifi://hifiqa-master-metaverse-staging"); // So that we can test in staging. Qt.openUrlExternally("hifi://hifiqa-master-metaverse-staging"); // So that we can test in staging.

View file

@ -25,7 +25,7 @@ Rectangle {
Image { Image {
sourceSize.width: 295 sourceSize.width: 295
sourceSize.height: 75 sourceSize.height: 75
source: "../../../images/about-highfidelity.png" source: "../../../images/about-projectathena.png"
} }
Item { height: 30; width: 1 } Item { height: 30; width: 1 }
Column { Column {
@ -45,7 +45,7 @@ Rectangle {
} }
Item { height: 10; width: 1 } Item { height: 10; width: 1 }
RalewayRegular { RalewayRegular {
text: "An open-source virtual reality platform." text: "An open source virtual reality platform."
size: 20 size: 20
color: "white" color: "white"
} }
@ -53,23 +53,12 @@ Rectangle {
textFormat: Text.StyledText textFormat: Text.StyledText
linkColor: "#00B4EF" linkColor: "#00B4EF"
color: "white" color: "white"
text: "<a href=\"https:/www.highfidelity.com\">www.highfidelity.com</a>." text: "<a href=\"https:/github.com/kasenvr/hifi-community\">Project Athena Github</a>."
size: 20 size: 20
onLinkActivated: { onLinkActivated: {
HiFiAbout.openUrl("https:/www.highfidelity.com"); HiFiAbout.openUrl("https:/github.com/kasenvr/project-athena");
} }
}
RalewayRegular {
textFormat: Text.StyledText
linkColor: "#00B4EF"
color: "white"
text: "<a href=\"https:/github.com/kasenvr/hifi-community\">HiFi Community Github</a>."
size: 20
onLinkActivated: {
HiFiAbout.openUrl("https:/github.com/kasenvr/hifi-community");
}
} }
Item { height: 40; width: 1 } Item { height: 40; width: 1 }
Row { Row {
@ -104,21 +93,35 @@ Rectangle {
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
} }
} }
Row {
spacing: 5
Image {
sourceSize.width: 34
sourceSize.height: 25
source: "../../../images/about-opus.png"
MouseArea {
anchors.fill: parent
onClicked: {
HiFiAbout.openUrl("http://opus-codec.org/");
}
}
}
RalewayRegular {
color: "white"
text: "Built using the Opus codec."
size: 12
anchors.verticalCenter: parent.verticalCenter
}
}
Item { height: 20; width: 1 } Item { height: 20; width: 1 }
RalewayRegular { RalewayRegular {
textFormat: Text.StyledText
linkColor: "#00B4EF"
color: "white" color: "white"
property string link: "https://eos.io/" text: "© 2019 - 2020 Project Athena Contributors."
text: "Blockchain technology from <a href=\"" + link + "\">EOS</a>."
size: 14 size: 14
onLinkActivated: {
HiFiAbout.openUrl(link);
}
} }
RalewayRegular { RalewayRegular {
color: "white" color: "white"
text: "© 2012 - 2019 High Fidelity, Inc.. All rights reserved." text: "© 2012 - 2019 High Fidelity, Inc. All rights reserved."
size: 14 size: 14
} }
RalewayRegular { RalewayRegular {

View file

@ -0,0 +1,206 @@
//
// EntityScriptQMLWhitelist.qml
// interface/resources/qml/hifi/dialogs/security
//
// Created by Kasen IO on 2019.12.05 | realities.dev | kasenvr@gmail.com
// Copyright 2019 Kasen IO
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
// Security Settings for the Entity Script QML Whitelist
import Hifi 1.0 as Hifi
import QtQuick 2.8
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.12
import stylesUit 1.0 as HifiStylesUit
import controlsUit 1.0 as HiFiControls
import PerformanceEnums 1.0
import "../../../windows"
Rectangle {
id: parentBody;
function getWhitelistAsText() {
var whitelist = Settings.getValue("private/settingsSafeURLS");
var arrayWhitelist = whitelist.split(",").join("\n");
return arrayWhitelist;
}
function setWhitelistAsText(whitelistText) {
Settings.setValue("private/settingsSafeURLS", whitelistText.text);
var originalSetString = whitelistText.text;
var originalSet = originalSetString.split(' ').join('');
var check = Settings.getValue("private/settingsSafeURLS");
var arrayCheck = check.split(",").join("\n");
setWhitelistSuccess(arrayCheck === originalSet);
}
function setWhitelistSuccess(success) {
if (success) {
notificationText.text = "Successfully saved settings.";
} else {
notificationText.text = "Error! Settings not saved.";
}
}
function toggleWhitelist(enabled) {
Settings.setValue("private/whitelistEnabled", enabled);
console.info("Toggling Whitelist to:", enabled);
}
function initCheckbox() {
var check = Settings.getValue("private/whitelistEnabled", false);
if (check) {
whitelistEnabled.toggle();
}
}
anchors.fill: parent
width: parent.width;
height: 120;
color: "#80010203";
HifiStylesUit.RalewayRegular {
id: titleText;
text: "Entity Script / QML Whitelist"
// Text size
size: 24;
// Style
color: "white";
elide: Text.ElideRight;
// Anchors
anchors.top: parent.top;
anchors.left: parent.left;
anchors.leftMargin: 20;
anchors.right: parent.right;
anchors.rightMargin: 20;
height: 60;
CheckBox {
Component.onCompleted: {
initCheckbox();
}
id: whitelistEnabled;
anchors.right: parent.right;
anchors.top: parent.top;
anchors.topMargin: 10;
onToggled: {
toggleWhitelist(whitelistEnabled.checked)
}
Label {
text: "Enabled"
color: "white"
font.pixelSize: 18;
anchors.right: parent.left;
anchors.top: parent.top;
anchors.topMargin: 10;
}
}
}
Rectangle {
id: textAreaRectangle;
color: "black";
width: parent.width;
height: 250;
anchors.top: titleText.bottom;
ScrollView {
id: textAreaScrollView
anchors.fill: parent;
width: parent.width
height: parent.height
contentWidth: parent.width
contentHeight: parent.height
clip: false;
TextArea {
id: whitelistTextArea
text: getWhitelistAsText();
onTextChanged: notificationText.text = "";
width: parent.width;
height: parent.height;
font.family: "Ubuntu";
font.pointSize: 12;
color: "white";
}
}
Button {
id: saveChanges
anchors.topMargin: 5;
anchors.leftMargin: 20;
anchors.rightMargin: 20;
x: textAreaRectangle.x + textAreaRectangle.width - width - 15;
y: textAreaRectangle.y + textAreaRectangle.height - height;
contentItem: Text {
text: saveChanges.text
font.family: "Ubuntu";
font.pointSize: 12;
opacity: enabled ? 1.0 : 0.3
color: "black"
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight
}
text: "Save Changes"
onClicked: setWhitelistAsText(whitelistTextArea)
HifiStylesUit.RalewayRegular {
id: notificationText;
text: ""
// Text size
size: 16;
// Style
color: "white";
elide: Text.ElideLeft;
// Anchors
anchors.right: parent.left;
anchors.rightMargin: 10;
}
}
HifiStylesUit.RalewayRegular {
id: descriptionText;
text:
"The whitelist checks scripts and QML as they are loaded.<br/>
Therefore, if a script is cached or has no reason to load again,<br/>
removing it from the whitelist will have no effect until<br/>
it is reloaded.<br/>
Separate your whitelisted domains by line, not commas. e.g.
<blockquote>
<b>https://google.com/</b><br/>
<b>hifi://the-spot/</b><br/>
<b>127.0.0.1</b><br/>
<b>https://mydomain.here/</b>
</blockquote>
Ensure there are no spaces or whitespace.<br/><br/>
For QML files, you can only whitelist each file individually<br/>
ending with '.qml'."
// Text size
size: 16;
// Style
color: "white";
elide: Text.ElideRight;
textFormat: Text.RichText;
// Anchors
anchors.top: parent.bottom;
anchors.topMargin: 90;
anchors.left: parent.left;
anchors.leftMargin: 20;
anchors.right: parent.right;
anchors.rightMargin: 20;
}
}
}

View file

@ -1,163 +0,0 @@
//
// ScriptWhitelist.qml
// interface/resources/qml/hifi/dialogs/security
//
// Created by Kasen IO on 2019.12.05 | realities.dev | kasenvr@gmail.com
// Copyright 2019 Kasen IO
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
// Security Settings for the Entity Script Whitelist
import Hifi 1.0 as Hifi
import QtQuick 2.8
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.12
import stylesUit 1.0 as HifiStylesUit
import controlsUit 1.0 as HiFiControls
import PerformanceEnums 1.0
import "../../../windows"
Rectangle {
function getWhitelistAsText() {
var whitelist = Settings.getValue("private/settingsSafeURLS");
var arrayWhitelist = whitelist.split(",");
var whitelistText = arrayWhitelist.join("\n");
return whitelistText;
}
function setWhitelistAsText(whitelistText) {
Settings.setValue("private/settingsSafeURLS", whitelistText.text);
var originalSetString = whitelistText.text;
var originalSet = originalSetString.split(' ').join('');
var check = Settings.getValue("private/settingsSafeURLS");
var arrayCheck = check.split(",");
var textCheck = arrayCheck.join("\n");
if(textCheck == originalSet) {
setWhitelistSuccess(true);
} else {
setWhitelistSuccess(false);
}
}
function setWhitelistSuccess(success) {
if(success) {
notificationText.text = "Successfully saved settings.";
} else {
notificationText.text = "Error! Settings not saved.";
}
}
anchors.fill: parent
width: parent.width;
height: 120;
color: "#80010203";
HifiStylesUit.RalewayRegular {
id: titleText;
text: "Entity Script Whitelist"
// Text size
size: 24;
// Style
color: "white";
elide: Text.ElideRight;
// Anchors
anchors.top: parent.top;
anchors.left: parent.left;
anchors.leftMargin: 20;
anchors.right: parent.right;
anchors.rightMargin: 20;
height: 60;
}
Rectangle {
id: textAreaRectangle;
color: "black";
width: parent.width;
height: 250;
anchors.top: titleText.bottom;
ScrollView {
id: textAreaScrollView
anchors.fill: parent;
width: parent.width
height: parent.height
contentWidth: parent.width
contentHeight: parent.height
clip: false;
TextArea {
id: whitelistTextArea
text: getWhitelistAsText();
onTextChanged: notificationText.text = "";
width: parent.width;
height: parent.height;
font.family: "Ubuntu";
font.pointSize: 12;
color: "white";
}
}
Button {
id: saveChanges
anchors.topMargin: 5;
anchors.leftMargin: 20;
anchors.rightMargin: 20;
x: textAreaRectangle.x + textAreaRectangle.width - width - 15;
y: textAreaRectangle.y + textAreaRectangle.height - height;
contentItem: Text {
text: saveChanges.text
font.family: "Ubuntu";
font.pointSize: 12;
opacity: enabled ? 1.0 : 0.3
color: "black"
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight
}
text: "Save Changes"
onClicked: setWhitelistAsText(whitelistTextArea)
HifiStylesUit.RalewayRegular {
id: notificationText;
text: ""
// Text size
size: 14;
// Style
color: "white";
elide: Text.ElideLeft;
// Anchors
anchors.right: parent.right;
anchors.rightMargin: 130;
}
}
HifiStylesUit.RalewayRegular {
id: descriptionText;
text: "Separate your URLs by line, not commas. Example:
https://google.com/
https://bing.com/
https://mydomain.here/
\nEnsure there are no spaces or whitespace."
// Text size
size: 16;
// Style
color: "white";
elide: Text.ElideRight;
// Anchors
anchors.top: parent.bottom;
anchors.topMargin: 90;
anchors.left: parent.left;
anchors.leftMargin: 20;
anchors.right: parent.right;
anchors.rightMargin: 20;
}
}
}

View file

@ -200,7 +200,7 @@ Rectangle {
id: eventBridgeConnection id: eventBridgeConnection
target: eventBridge target: eventBridge
onWebEventReceived: { onWebEventReceived: {
if (message.slice(0, 17) === "CLARA.IO DOWNLOAD") { if (typeof message === "string" && message.slice(0, 17) === "CLARA.IO DOWNLOAD") {
ApplicationInterface.addAssetToWorldFromURL(message.slice(18)); ApplicationInterface.addAssetToWorldFromURL(message.slice(18));
} }
} }

View file

@ -118,7 +118,7 @@ Windows.ScrollingWindow {
id: eventBridgeConnection id: eventBridgeConnection
target: eventBridge target: eventBridge
onWebEventReceived: { onWebEventReceived: {
if (message.slice(0, 17) === "CLARA.IO DOWNLOAD") { if (typeof message === "string" && message.slice(0, 17) === "CLARA.IO DOWNLOAD") {
ApplicationInterface.addAssetToWorldFromURL(message.slice(18)); ApplicationInterface.addAssetToWorldFromURL(message.slice(18));
} }
} }

View file

@ -9,6 +9,7 @@
// //
import QtQuick 2.5 import QtQuick 2.5
import QtQuick.Controls 2.2
import "." import "."
import "./preferences" import "./preferences"
@ -33,7 +34,10 @@ Item {
property bool gotoPreviousAppFromScript: false property bool gotoPreviousAppFromScript: false
property var tablet; property var tablet;
readonly property real verticalScrollWidth: 10
readonly property real verticalScrollShaft: 8
function saveAll() { function saveAll() {
dialog.forceActiveFocus(); // Accept any text box edits in progress. dialog.forceActiveFocus(); // Accept any text box edits in progress.
@ -103,6 +107,43 @@ Item {
height: parent.height height: parent.height
contentWidth: parent.width contentWidth: parent.width
contentHeight: getSectionsHeight(); contentHeight: getSectionsHeight();
anchors.top: main.top
anchors.bottom: main.bottom
ScrollBar.vertical: ScrollBar {
policy: ScrollBar.AlwaysOn
parent: scrollView.parent
anchors.top: scrollView.top
anchors.right: scrollView.right
anchors.bottom: scrollView.bottom
z: 100 // Display over top of separators.
background: Item {
implicitWidth: verticalScrollWidth
Rectangle {
color: hifi.colors.baseGrayShadow
radius: 4
anchors {
fill: parent
bottomMargin: 1
}
}
}
contentItem: Item {
implicitWidth: verticalScrollShaft
Rectangle {
radius: verticalScrollShaft/2
color: hifi.colors.white30
anchors {
fill: parent
topMargin: 1
bottomMargin: 1
}
}
}
}
Column { Column {
width: 480 width: 480
Component { Component {
@ -183,7 +224,7 @@ Item {
for (var i = 0; i < sections.length; i++) { for (var i = 0; i < sections.length; i++) {
totalHeight += sections[i].height + sections[i].getPreferencesHeight(); totalHeight += sections[i].height + sections[i].getPreferencesHeight();
} }
var bottomPadding = 170; var bottomPadding = 30;
return (totalHeight + bottomPadding); return (totalHeight + bottomPadding);
} }
} }

View file

@ -97,11 +97,10 @@ Windows.Window {
background: Item { background: Item {
implicitWidth: verticalScrollWidth implicitWidth: verticalScrollWidth
Rectangle { Rectangle {
color: hifi.colors.darkGray30 color: hifi.colors.baseGrayShadow
radius: 4 radius: 4
anchors { anchors {
fill: parent fill: parent
topMargin: -1 // Finesse size
bottomMargin: -2 bottomMargin: -2
} }
} }
@ -113,7 +112,6 @@ Windows.Window {
color: hifi.colors.white30 color: hifi.colors.white30
anchors { anchors {
fill: parent fill: parent
leftMargin: 2 // Finesse size and position.
topMargin: 1 topMargin: 1
bottomMargin: 1 bottomMargin: 1
} }

View file

@ -111,6 +111,7 @@
#include <ModelEntityItem.h> #include <ModelEntityItem.h>
#include <NetworkAccessManager.h> #include <NetworkAccessManager.h>
#include <NetworkingConstants.h> #include <NetworkingConstants.h>
#include <MetaverseAPI.h>
#include <ObjectMotionState.h> #include <ObjectMotionState.h>
#include <OctalCode.h> #include <OctalCode.h>
#include <OctreeSceneStats.h> #include <OctreeSceneStats.h>
@ -511,27 +512,6 @@ std::atomic<uint64_t> DeadlockWatchdogThread::_maxElapsed;
std::atomic<int> DeadlockWatchdogThread::_maxElapsedAverage; std::atomic<int> DeadlockWatchdogThread::_maxElapsedAverage;
ThreadSafeMovingAverage<int, DeadlockWatchdogThread::HEARTBEAT_SAMPLES> DeadlockWatchdogThread::_movingAverage; ThreadSafeMovingAverage<int, DeadlockWatchdogThread::HEARTBEAT_SAMPLES> DeadlockWatchdogThread::_movingAverage;
bool isDomainURL(QUrl url) {
if (!url.isValid()) {
return false;
}
if (url.scheme() == URL_SCHEME_HIFI) {
return true;
}
if (url.scheme() != HIFI_URL_SCHEME_FILE) {
// TODO -- once Octree::readFromURL no-longer takes over the main event-loop, serverless-domain urls can
// be loaded over http(s)
// && url.scheme() != HIFI_URL_SCHEME_HTTP &&
// url.scheme() != HIFI_URL_SCHEME_HTTPS
return false;
}
if (url.path().endsWith(".json", Qt::CaseInsensitive) ||
url.path().endsWith(".json.gz", Qt::CaseInsensitive)) {
return true;
}
return false;
}
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
static const UINT UWM_IDENTIFY_INSTANCES = static const UINT UWM_IDENTIFY_INSTANCES =
RegisterWindowMessage("UWM_IDENTIFY_INSTANCES_{8AB82783-B74A-4258-955B-8188C22AA0D6}_" + qgetenv("USERNAME")); RegisterWindowMessage("UWM_IDENTIFY_INSTANCES_{8AB82783-B74A-4258-955B-8188C22AA0D6}_" + qgetenv("USERNAME"));
@ -563,14 +543,6 @@ public:
return true; return true;
} }
if (message->message == WM_COPYDATA) {
COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)(message->lParam);
QUrl url = QUrl((const char*)(pcds->lpData));
if (isDomainURL(url)) {
DependencyManager::get<AddressManager>()->handleLookupString(url.toString());
return true;
}
}
// Attempting to close MIDI interfaces of a hot-unplugged device can result in audio-driver deadlock. // Attempting to close MIDI interfaces of a hot-unplugged device can result in audio-driver deadlock.
// Detecting MIDI devices that have been added/removed after starting Inteface has been disabled. // Detecting MIDI devices that have been added/removed after starting Inteface has been disabled.
// https://support.microsoft.com/en-us/help/4460006/midi-device-app-hangs-when-former-midi-api-is-used // https://support.microsoft.com/en-us/help/4460006/midi-device-app-hangs-when-former-midi-api-is-used
@ -1158,7 +1130,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/Graphik-SemiBold.ttf"); QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/Graphik-SemiBold.ttf");
QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/Graphik-Regular.ttf"); QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/Graphik-Regular.ttf");
QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/Graphik-Medium.ttf"); QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/Graphik-Medium.ttf");
_window->setWindowTitle("High Fidelity"); _window->setWindowTitle("Project Athena");
Model::setAbstractViewStateInterface(this); // The model class will sometimes need to know view state details from us Model::setAbstractViewStateInterface(this); // The model class will sometimes need to know view state details from us
@ -1216,7 +1188,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
// set the account manager's root URL and trigger a login request if we don't have the access token // set the account manager's root URL and trigger a login request if we don't have the access token
accountManager->setIsAgent(true); accountManager->setIsAgent(true);
accountManager->setAuthURL(NetworkingConstants::METAVERSE_SERVER_URL()); accountManager->setAuthURL(MetaverseAPI::getCurrentMetaverseServerURL());
if (!accountManager->hasKeyPair()) { if (!accountManager->hasKeyPair()) {
accountManager->generateNewUserKeypair(); accountManager->generateNewUserKeypair();
} }
@ -3184,7 +3156,7 @@ void Application::showLoginScreen() {
QJsonObject loginData = {}; QJsonObject loginData = {};
loginData["action"] = "login dialog popped up"; loginData["action"] = "login dialog popped up";
UserActivityLogger::getInstance().logAction("encourageLoginDialog", loginData); UserActivityLogger::getInstance().logAction("encourageLoginDialog", loginData);
_window->setWindowTitle("High Fidelity"); _window->setWindowTitle("Project Athena");
} else { } else {
resumeAfterLoginDialogActionTaken(); resumeAfterLoginDialogActionTaken();
} }
@ -3202,10 +3174,30 @@ void Application::initializeUi() {
// Allow remote QML content from trusted sources ONLY // Allow remote QML content from trusted sources ONLY
{ {
auto defaultUrlValidator = OffscreenQmlSurface::getUrlValidator(); auto defaultUrlValidator = OffscreenQmlSurface::getUrlValidator();
auto newValidator = [=](const QUrl& url)->bool { auto newValidator = [=](const QUrl& url) -> bool {
if (AUTHORIZED_EXTERNAL_QML_SOURCE.isParentOf(url)) { QString whitelistPrefix = "[WHITELIST ENTITY SCRIPTS]";
return true; QList<QString> safeURLS = { "" };
safeURLS += qEnvironmentVariable("EXTRA_WHITELIST").trimmed().split(QRegExp("\\s*,\\s*"), QString::SkipEmptyParts);
// PULL SAFEURLS FROM INTERFACE.JSON Settings
QVariant raw = Setting::Handle<QVariant>("private/settingsSafeURLS").get();
QStringList settingsSafeURLS = raw.toString().trimmed().split(QRegExp("\\s*[,\r\n]+\\s*"), QString::SkipEmptyParts);
safeURLS += settingsSafeURLS;
// END PULL SAFEURLS FROM INTERFACE.JSON Settings
bool isInWhitelist = false; // assume unsafe
for (const auto& str : safeURLS) {
if (!str.isEmpty() && str.endsWith(".qml") && url.toString().endsWith(".qml") &&
url.toString().startsWith(str)) {
qCDebug(interfaceapp) << "Found matching url!" << url.host();
isInWhitelist = true;
return true;
}
} }
qCDebug(interfaceapp) << "No matching url" << url.host();
return defaultUrlValidator(url); return defaultUrlValidator(url);
}; };
OffscreenQmlSurface::setUrlValidator(newValidator); OffscreenQmlSurface::setUrlValidator(newValidator);
@ -4038,7 +4030,7 @@ void Application::setIsServerlessMode(bool serverlessDomain) {
} }
} }
std::map<QString, QString> Application::prepareServerlessDomainContents(QUrl domainURL) { std::map<QString, QString> Application::prepareServerlessDomainContents(QUrl domainURL, QByteArray data) {
QUuid serverlessSessionID = QUuid::createUuid(); QUuid serverlessSessionID = QUuid::createUuid();
getMyAvatar()->setSessionUUID(serverlessSessionID); getMyAvatar()->setSessionUUID(serverlessSessionID);
auto nodeList = DependencyManager::get<NodeList>(); auto nodeList = DependencyManager::get<NodeList>();
@ -4049,14 +4041,13 @@ std::map<QString, QString> Application::prepareServerlessDomainContents(QUrl dom
permissions.setAll(true); permissions.setAll(true);
nodeList->setPermissions(permissions); nodeList->setPermissions(permissions);
// we can't import directly into the main tree because we would need to lock it, and // FIXME: Lock the main tree and import directly into it.
// Octree::readFromURL calls loop.exec which can run code which will also attempt to lock the tree.
EntityTreePointer tmpTree(new EntityTree()); EntityTreePointer tmpTree(new EntityTree());
tmpTree->setIsServerlessMode(true); tmpTree->setIsServerlessMode(true);
tmpTree->createRootElement(); tmpTree->createRootElement();
auto myAvatar = getMyAvatar(); auto myAvatar = getMyAvatar();
tmpTree->setMyAvatar(myAvatar); tmpTree->setMyAvatar(myAvatar);
bool success = tmpTree->readFromURL(domainURL.toString()); bool success = tmpTree->readFromByteArray(domainURL.toString(), data);
if (success) { if (success) {
tmpTree->reaverageOctreeElements(); tmpTree->reaverageOctreeElements();
tmpTree->sendEntities(&_entityEditSender, getEntities()->getTree(), 0, 0, 0); tmpTree->sendEntities(&_entityEditSender, getEntities()->getTree(), 0, 0, 0);
@ -4079,12 +4070,26 @@ void Application::loadServerlessDomain(QUrl domainURL) {
return; return;
} }
auto namedPaths = prepareServerlessDomainContents(domainURL); QString trimmedUrl = domainURL.toString().trimmed();
auto nodeList = DependencyManager::get<NodeList>(); bool DEFAULT_IS_OBSERVABLE = true;
const qint64 DEFAULT_CALLER_ID = -1;
auto request = DependencyManager::get<ResourceManager>()->createResourceRequest(
this, trimmedUrl, DEFAULT_IS_OBSERVABLE, DEFAULT_CALLER_ID, "Application::loadServerlessDomain");
nodeList->getDomainHandler().connectedToServerless(namedPaths); if (!request) {
return;
}
_fullSceneReceivedCounter++; connect(request, &ResourceRequest::finished, this, [=]() {
if (request->getResult() == ResourceRequest::Success) {
auto namedPaths = prepareServerlessDomainContents(domainURL, request->getData());
auto nodeList = DependencyManager::get<NodeList>();
nodeList->getDomainHandler().connectedToServerless(namedPaths);
_fullSceneReceivedCounter++;
}
request->deleteLater();
});
request->send();
} }
void Application::loadErrorDomain(QUrl domainURL) { void Application::loadErrorDomain(QUrl domainURL) {
@ -4093,16 +4098,7 @@ void Application::loadErrorDomain(QUrl domainURL) {
return; return;
} }
if (domainURL.isEmpty()) { loadServerlessDomain(domainURL);
return;
}
auto namedPaths = prepareServerlessDomainContents(domainURL);
auto nodeList = DependencyManager::get<NodeList>();
nodeList->getDomainHandler().loadedErrorDomain(namedPaths);
_fullSceneReceivedCounter++;
} }
bool Application::importImage(const QString& urlString) { bool Application::importImage(const QString& urlString) {
@ -5521,6 +5517,8 @@ bool Application::importEntities(const QString& urlOrFilename, const bool isObse
_entityClipboard->withWriteLock([&] { _entityClipboard->withWriteLock([&] {
_entityClipboard->eraseAllOctreeElements(); _entityClipboard->eraseAllOctreeElements();
// FIXME: readFromURL() can take over the main event loop which may cause problems, especially if downloading the JSON
// from the Web.
success = _entityClipboard->readFromURL(urlOrFilename, isObservable, callerId); success = _entityClipboard->readFromURL(urlOrFilename, isObservable, callerId);
if (success) { if (success) {
_entityClipboard->reaverageOctreeElements(); _entityClipboard->reaverageOctreeElements();
@ -7046,7 +7044,7 @@ void Application::updateWindowTitle() const {
auto accountManager = DependencyManager::get<AccountManager>(); auto accountManager = DependencyManager::get<AccountManager>();
auto isInErrorState = nodeList->getDomainHandler().isInErrorState(); auto isInErrorState = nodeList->getDomainHandler().isInErrorState();
QString buildVersion = " - Kasen Community Edition v0.86.0 K2 - " QString buildVersion = " - Project Athena v0.86.0 K2 - "
+ (BuildInfo::BUILD_TYPE == BuildInfo::BuildType::Stable ? QString("Version") : QString("Build")) + (BuildInfo::BUILD_TYPE == BuildInfo::BuildType::Stable ? QString("Version") : QString("Build"))
+ " " + applicationVersion(); + " " + applicationVersion();
@ -7729,7 +7727,7 @@ bool Application::askToReplaceDomainContent(const QString& url) {
static const QString infoText = simpleWordWrap("Your domain's content will be replaced with a new content set. " static const QString infoText = simpleWordWrap("Your domain's content will be replaced with a new content set. "
"If you want to save what you have now, create a backup before proceeding. For more information about backing up " "If you want to save what you have now, create a backup before proceeding. For more information about backing up "
"and restoring content, visit the documentation page at: ", MAX_CHARACTERS_PER_LINE) + "and restoring content, visit the documentation page at: ", MAX_CHARACTERS_PER_LINE) +
"\nhttps://docs.highfidelity.com/create-and-explore/start-working-in-your-sandbox/restoring-sandbox-content"; "\nhttps://docs.projectathena.dev/host/maintain-domain/backup-domain.html";
ModalDialogListener* dig = OffscreenUi::asyncQuestion("Are you sure you want to replace this domain's content set?", ModalDialogListener* dig = OffscreenUi::asyncQuestion("Are you sure you want to replace this domain's content set?",
infoText, QMessageBox::Yes | QMessageBox::No, QMessageBox::No); infoText, QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
@ -8483,7 +8481,7 @@ void Application::loadAddAvatarBookmarkDialog() const {
void Application::loadAvatarBrowser() const { void Application::loadAvatarBrowser() const {
auto tablet = dynamic_cast<TabletProxy*>(DependencyManager::get<TabletScriptingInterface>()->getTablet("com.highfidelity.interface.tablet.system")); auto tablet = dynamic_cast<TabletProxy*>(DependencyManager::get<TabletScriptingInterface>()->getTablet("com.highfidelity.interface.tablet.system"));
// construct the url to the marketplace item // construct the url to the marketplace item
QString url = NetworkingConstants::METAVERSE_SERVER_URL().toString() + "/marketplace?category=avatars"; QString url = MetaverseAPI::getCurrentMetaverseServerURL().toString() + "/marketplace?category=avatars";
QString MARKETPLACES_INJECT_SCRIPT_PATH = "file:///" + qApp->applicationDirPath() + "/scripts/system/html/js/marketplacesInject.js"; QString MARKETPLACES_INJECT_SCRIPT_PATH = "file:///" + qApp->applicationDirPath() + "/scripts/system/html/js/marketplacesInject.js";
tablet->gotoWebScreen(url, MARKETPLACES_INJECT_SCRIPT_PATH); tablet->gotoWebScreen(url, MARKETPLACES_INJECT_SCRIPT_PATH);
@ -9238,7 +9236,7 @@ void Application::readArgumentsFromLocalSocket() const {
// If we received a message, try to open it as a URL // If we received a message, try to open it as a URL
if (message.length() > 0) { if (message.length() > 0) {
DependencyManager::get<WindowScriptingInterface>()->openUrl(QString::fromUtf8(message)); DependencyManager::get<AddressManager>()->handleLookupString(QString::fromUtf8(message));
} }
} }

View file

@ -464,7 +464,7 @@ public slots:
void setPreferredCursor(const QString& cursor); void setPreferredCursor(const QString& cursor);
void setIsServerlessMode(bool serverlessDomain); void setIsServerlessMode(bool serverlessDomain);
std::map<QString, QString> prepareServerlessDomainContents(QUrl domainURL); std::map<QString, QString> prepareServerlessDomainContents(QUrl domainURL, QByteArray data);
void loadServerlessDomain(QUrl domainURL); void loadServerlessDomain(QUrl domainURL);
void loadErrorDomain(QUrl domainURL); void loadErrorDomain(QUrl domainURL);

View file

@ -287,14 +287,13 @@ Menu::Menu() {
} }
}); });
// Settings > Entity Script Whitelist // Settings > Entity Script / QML Whitelist
action = addActionToQMenuAndActionHash(settingsMenu, "Entity Script Whitelist"); action = addActionToQMenuAndActionHash(settingsMenu, "Entity Script / QML Whitelist");
connect(action, &QAction::triggered, [] { connect(action, &QAction::triggered, [] {
auto tablet = DependencyManager::get<TabletScriptingInterface>()->getTablet("com.highfidelity.interface.tablet.system"); auto tablet = DependencyManager::get<TabletScriptingInterface>()->getTablet("com.highfidelity.interface.tablet.system");
auto hmd = DependencyManager::get<HMDScriptingInterface>(); auto hmd = DependencyManager::get<HMDScriptingInterface>();
DependencyManager::get<OffscreenUi>()->clearCache(); tablet->pushOntoStack("hifi/dialogs/security/EntityScriptQMLWhitelist.qml");
tablet->pushOntoStack("hifi/dialogs/security/EntityScriptWhitelist.qml");
if (!hmd->getShouldShowTablet()) { if (!hmd->getShouldShowTablet()) {
hmd->toggleShouldShowTablet(); hmd->toggleShouldShowTablet();
@ -769,30 +768,30 @@ Menu::Menu() {
// Help/Application menu ---------------------------------- // Help/Application menu ----------------------------------
MenuWrapper * helpMenu = addMenu("Help"); MenuWrapper * helpMenu = addMenu("Help");
// Help > About High Fidelity // Help > About Project Athena
action = addActionToQMenuAndActionHash(helpMenu, "About High Fidelity"); action = addActionToQMenuAndActionHash(helpMenu, "About Project Athena");
connect(action, &QAction::triggered, [] { connect(action, &QAction::triggered, [] {
qApp->showDialog(QString("hifi/dialogs/AboutDialog.qml"), qApp->showDialog(QString("hifi/dialogs/AboutDialog.qml"),
QString("hifi/dialogs/TabletAboutDialog.qml"), "AboutDialog"); QString("hifi/dialogs/TabletAboutDialog.qml"), "AboutDialog");
}); });
helpMenu->addSeparator(); helpMenu->addSeparator();
// Help > HiFi Docs // Help > Athena Docs
action = addActionToQMenuAndActionHash(helpMenu, "Online Documentation"); action = addActionToQMenuAndActionHash(helpMenu, "Online Documentation");
connect(action, &QAction::triggered, qApp, [] { connect(action, &QAction::triggered, qApp, [] {
QDesktopServices::openUrl(QUrl("https://docs.highfidelity.com/")); QDesktopServices::openUrl(QUrl("https://docs.projectathena.dev/"));
}); });
// Help > HiFi Forum // Help > Athena Forum
action = addActionToQMenuAndActionHash(helpMenu, "Online Forums"); /* action = addActionToQMenuAndActionHash(helpMenu, "Online Forums");
connect(action, &QAction::triggered, qApp, [] { connect(action, &QAction::triggered, qApp, [] {
QDesktopServices::openUrl(QUrl("https://forums.highfidelity.com/")); QDesktopServices::openUrl(QUrl("https://forums.highfidelity.com/"));
}); }); */
// Help > Scripting Reference // Help > Scripting Reference
action = addActionToQMenuAndActionHash(helpMenu, "Online Script Reference"); action = addActionToQMenuAndActionHash(helpMenu, "Online Script Reference");
connect(action, &QAction::triggered, qApp, [] { connect(action, &QAction::triggered, qApp, [] {
QDesktopServices::openUrl(QUrl("https://docs.highfidelity.com/api-reference")); QDesktopServices::openUrl(QUrl("https://apidocs.projectathena.dev/"));
}); });
addActionToQMenuAndActionHash(helpMenu, "Controls Reference", 0, qApp, SLOT(showHelp())); addActionToQMenuAndActionHash(helpMenu, "Controls Reference", 0, qApp, SLOT(showHelp()));
@ -802,13 +801,13 @@ Menu::Menu() {
// Help > Release Notes // Help > Release Notes
action = addActionToQMenuAndActionHash(helpMenu, "Release Notes"); action = addActionToQMenuAndActionHash(helpMenu, "Release Notes");
connect(action, &QAction::triggered, qApp, [] { connect(action, &QAction::triggered, qApp, [] {
QDesktopServices::openUrl(QUrl("https://docs.highfidelity.com/release-notes.html")); QDesktopServices::openUrl(QUrl("https://docs.projectathena.dev/release-notes.html"));
}); });
// Help > Report a Bug! // Help > Report a Bug!
action = addActionToQMenuAndActionHash(helpMenu, "Report a Bug!"); action = addActionToQMenuAndActionHash(helpMenu, "Report a Bug!");
connect(action, &QAction::triggered, qApp, [] { connect(action, &QAction::triggered, qApp, [] {
QDesktopServices::openUrl(QUrl("mailto:support@highfidelity.com")); QDesktopServices::openUrl(QUrl("https://github.com/kasenvr/project-athena/issues"));
}); });
} }

View file

@ -181,7 +181,7 @@ namespace MenuOption {
const QString RunningScripts = "Running Scripts..."; const QString RunningScripts = "Running Scripts...";
const QString RunTimingTests = "Run Timing Tests"; const QString RunTimingTests = "Run Timing Tests";
const QString ScriptedMotorControl = "Enable Scripted Motor Control"; const QString ScriptedMotorControl = "Enable Scripted Motor Control";
const QString EntityScriptWhitelist = "Entity Script Whitelist"; const QString EntityScriptQMLWhitelist = "Entity Script / QML Whitelist";
const QString ShowTrackedObjects = "Show Tracked Objects"; const QString ShowTrackedObjects = "Show Tracked Objects";
const QString SelfieCamera = "Selfie"; const QString SelfieCamera = "Selfie";
const QString SendWrongDSConnectVersion = "Send wrong DS connect version"; const QString SendWrongDSConnectVersion = "Send wrong DS connect version";

View file

@ -55,7 +55,7 @@ static QStringList HAND_MAPPING_SUFFIXES = {
"HandThumb1", "HandThumb1",
}; };
const QUrl PACKAGE_AVATAR_DOCS_BASE_URL = QUrl("https://docs.highfidelity.com/create/avatars/package-avatar.html"); const QUrl PACKAGE_AVATAR_DOCS_BASE_URL = QUrl("https://docs.projectathena.dev/create/avatars/package-avatar.html");
AvatarDoctor::AvatarDoctor(const QUrl& avatarFSTFileUrl) : AvatarDoctor::AvatarDoctor(const QUrl& avatarFSTFileUrl) :
_avatarFSTFileUrl(avatarFSTFileUrl) { _avatarFSTFileUrl(avatarFSTFileUrl) {

View file

@ -95,7 +95,7 @@ public:
static bool isValidNewProjectName(const QString& projectPath, const QString& projectName); static bool isValidNewProjectName(const QString& projectPath, const QString& projectName);
static QString getDefaultProjectsPath() { static QString getDefaultProjectsPath() {
return QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/High Fidelity Projects"; return QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/Project Athena Projects";
} }
signals: signals:

View file

@ -3825,7 +3825,7 @@ void MyAvatar::updateActionMotor(float deltaTime) {
} }
_actionMotorVelocity = motorSpeed * direction; _actionMotorVelocity = motorSpeed * direction;
} else { } else {
_actionMotorVelocity = direction; _actionMotorVelocity = sensorToWorldScale * direction;
} }
float previousBoomLength = _boomLength; float previousBoomLength = _boomLength;

View file

@ -607,7 +607,7 @@ public:
* <p>Note: When using pre-built animation data, it's critical that the joint orientation of the source animation and target * <p>Note: When using pre-built animation data, it's critical that the joint orientation of the source animation and target
* rig are equivalent, since the animation data applies absolute values onto the joints. If the orientations are different, * rig are equivalent, since the animation data applies absolute values onto the joints. If the orientations are different,
* the avatar will move in unpredictable ways. For more information about avatar joint orientation standards, see * the avatar will move in unpredictable ways. For more information about avatar joint orientation standards, see
* <a href="https://docs.highfidelity.com/create/avatars/avatar-standards">Avatar Standards</a>.</p> * <a href="https://docs.projectathena.dev/create/avatars/avatar-standards.html">Avatar Standards</a>.</p>
* @function MyAvatar.overrideAnimation * @function MyAvatar.overrideAnimation
* @param {string} url - The URL to the animation file. Animation files may be in glTF or FBX format, but only need to * @param {string} url - The URL to the animation file. Animation files may be in glTF or FBX format, but only need to
* contain the avatar skeleton and animation data. glTF models may be in JSON or binary format (".gltf" or ".glb" URLs * contain the avatar skeleton and animation data. glTF models may be in JSON or binary format (".gltf" or ".glb" URLs
@ -715,7 +715,7 @@ public:
* <p>Note: When using pre-built animation data, it's critical that the joint orientation of the source animation and target * <p>Note: When using pre-built animation data, it's critical that the joint orientation of the source animation and target
* rig are equivalent, since the animation data applies absolute values onto the joints. If the orientations are different, * rig are equivalent, since the animation data applies absolute values onto the joints. If the orientations are different,
* the avatar will move in unpredictable ways. For more information about avatar joint orientation standards, see * the avatar will move in unpredictable ways. For more information about avatar joint orientation standards, see
* <a href="https://docs.highfidelity.com/create/avatars/avatar-standards">Avatar Standards</a>. * <a href="https://docs.projectathena.dev/create/avatars/avatar-standards.html">Avatar Standards</a>.
* @function MyAvatar.overrideRoleAnimation * @function MyAvatar.overrideRoleAnimation
* @param {string} role - The animation role to override * @param {string} role - The animation role to override
* @param {string} url - The URL to the animation file. Animation files need to be in glTF or FBX format, but only need to * @param {string} url - The URL to the animation file. Animation files need to be in glTF or FBX format, but only need to
@ -1871,7 +1871,7 @@ public:
/**jsdoc /**jsdoc
* Enables and disables flow simulation of physics on the avatar's hair, clothes, and body parts. See * Enables and disables flow simulation of physics on the avatar's hair, clothes, and body parts. See
* {@link https://docs.highfidelity.com/create/avatars/add-flow.html|Add Flow to Your Avatar} for more * {@link https://docs.projectathena.dev/create/avatars/add-flow.html|Add Flow to Your Avatar} for more
* information. * information.
* @function MyAvatar.useFlow * @function MyAvatar.useFlow
* @param {boolean} isActive - <code>true</code> if flow simulation is enabled on the joint, <code>false</code> if it isn't. * @param {boolean} isActive - <code>true</code> if flow simulation is enabled on the joint, <code>false</code> if it isn't.
@ -2236,7 +2236,7 @@ public slots:
/**jsdoc /**jsdoc
* Gets the URL of the override animation graph. * Gets the URL of the override animation graph.
* <p>See {@link https://docs.highfidelity.com/create/avatars/custom-animations.html|Custom Avatar Animations} for * <p>See {@link https://docs.projectathena.dev/create/avatars/custom-animations.html|Custom Avatar Animations} for
* information on animation graphs.</p> * information on animation graphs.</p>
* @function MyAvatar.getAnimGraphOverrideUrl * @function MyAvatar.getAnimGraphOverrideUrl
* @returns {string} The URL of the override animation graph JSON file. <code>""</code> if there is no override animation * @returns {string} The URL of the override animation graph JSON file. <code>""</code> if there is no override animation
@ -2246,7 +2246,7 @@ public slots:
/**jsdoc /**jsdoc
* Sets the animation graph to use in preference to the default animation graph. * Sets the animation graph to use in preference to the default animation graph.
* <p>See {@link https://docs.highfidelity.com/create/avatars/custom-animations.html|Custom Avatar Animations} for * <p>See {@link https://docs.projectathena.dev/create/avatars/custom-animations.html|Custom Avatar Animations} for
* information on animation graphs.</p> * information on animation graphs.</p>
* @function MyAvatar.setAnimGraphOverrideUrl * @function MyAvatar.setAnimGraphOverrideUrl
* @param {string} url - The URL of the animation graph JSON file to use. Set to <code>""</code> to clear an override. * @param {string} url - The URL of the animation graph JSON file to use. Set to <code>""</code> to clear an override.
@ -2255,7 +2255,7 @@ public slots:
/**jsdoc /**jsdoc
* Gets the URL of animation graph (i.e., the avatar animation JSON) that's currently being used for avatar animations. * Gets the URL of animation graph (i.e., the avatar animation JSON) that's currently being used for avatar animations.
* <p>See {@link https://docs.highfidelity.com/create/avatars/custom-animations.html|Custom Avatar Animations} for * <p>See {@link https://docs.projectathena.dev/create/avatars/custom-animations.html|Custom Avatar Animations} for
* information on animation graphs.</p> * information on animation graphs.</p>
* @function MyAvatar.getAnimGraphUrl * @function MyAvatar.getAnimGraphUrl
* @returns {string} The URL of the current animation graph JSON file. * @returns {string} The URL of the current animation graph JSON file.
@ -2266,7 +2266,7 @@ public slots:
/**jsdoc /**jsdoc
* Sets the current animation graph (i.e., the avatar animation JSON) to use for avatar animations and makes it the default. * Sets the current animation graph (i.e., the avatar animation JSON) to use for avatar animations and makes it the default.
* <p>See {@link https://docs.highfidelity.com/create/avatars/custom-animations.html|Custom Avatar Animations} for * <p>See {@link https://docs.projectathena.dev/create/avatars/custom-animations.html|Custom Avatar Animations} for
* information on animation graphs.</p> * information on animation graphs.</p>
* @function MyAvatar.setAnimGraphUrl * @function MyAvatar.setAnimGraphUrl
* @param {string} url - The URL of the animation graph JSON file to use. * @param {string} url - The URL of the animation graph JSON file to use.

View file

@ -17,6 +17,7 @@
#include <QJsonDocument> #include <QJsonDocument>
#include <NetworkingConstants.h> #include <NetworkingConstants.h>
#include <MetaverseAPI.h>
#include <AddressManager.h> #include <AddressManager.h>
#include "Wallet.h" #include "Wallet.h"
@ -181,21 +182,28 @@ QString hfcString(const QJsonValue& sentValue, const QJsonValue& receivedValue)
} }
return result; return result;
} }
static const QString USER_PAGE_BASE_URL = NetworkingConstants::METAVERSE_SERVER_URL().toString() + "/users/";
static const QString PLACE_PAGE_BASE_URL = NetworkingConstants::METAVERSE_SERVER_URL().toString() + "/places/"; QString getUserPageBaseUrl() {
return MetaverseAPI::getCurrentMetaverseServerURL().toString() + "/users/";
}
QString getPlacePageBaseUrl() {
return MetaverseAPI::getCurrentMetaverseServerURL().toString() + "/places/";
}
static const QStringList KNOWN_USERS(QStringList() << "highfidelity" << "marketplace"); static const QStringList KNOWN_USERS(QStringList() << "highfidelity" << "marketplace");
QString userLink(const QString& username, const QString& placename) { QString userLink(const QString& username, const QString& placename) {
if (username.isEmpty()) { if (username.isEmpty()) {
if (placename.isEmpty()) { if (placename.isEmpty()) {
return QString("someone"); return QString("someone");
} else { } else {
return QString("someone <a href=\"%1%2\">nearby</a>").arg(PLACE_PAGE_BASE_URL, placename); return QString("someone <a href=\"%1%2\">nearby</a>").arg(getPlacePageBaseUrl(), placename);
} }
} }
if (KNOWN_USERS.contains(username)) { if (KNOWN_USERS.contains(username)) {
return username; return username;
} }
return QString("<a href=\"%1%2\">%2</a>").arg(USER_PAGE_BASE_URL, username); return QString("<a href=\"%1%2\">%2</a>").arg(getUserPageBaseUrl(), username);
} }
QString transactionString(const QJsonObject& valueObject) { QString transactionString(const QJsonObject& valueObject) {

View file

@ -72,11 +72,11 @@ void QmlCommerce::openSystemApp(const QString& appName) {
else if (appPathIter->contains(".html", Qt::CaseInsensitive)) { else if (appPathIter->contains(".html", Qt::CaseInsensitive)) {
QMap<QString, QString>::const_iterator injectIter = systemInject.find(appName); QMap<QString, QString>::const_iterator injectIter = systemInject.find(appName);
if (appPathIter == systemInject.end()) { if (appPathIter == systemInject.end()) {
tablet->gotoWebScreen(NetworkingConstants::METAVERSE_SERVER_URL().toString() + *appPathIter); tablet->gotoWebScreen(MetaverseAPI::getCurrentMetaverseServerURL().toString() + *appPathIter);
} }
else { else {
QString inject = "file:///" + qApp->applicationDirPath() + *injectIter; QString inject = "file:///" + qApp->applicationDirPath() + *injectIter;
tablet->gotoWebScreen(NetworkingConstants::METAVERSE_SERVER_URL().toString() + *appPathIter, inject); tablet->gotoWebScreen(MetaverseAPI::getCurrentMetaverseServerURL().toString() + *appPathIter, inject);
} }
} }
else { else {

View file

@ -262,7 +262,9 @@ int main(int argc, const char* argv[]) {
if (socket.waitForConnected(LOCAL_SERVER_TIMEOUT_MS)) { if (socket.waitForConnected(LOCAL_SERVER_TIMEOUT_MS)) {
if (parser.isSet(urlOption)) { if (parser.isSet(urlOption)) {
QUrl url = QUrl(parser.value(urlOption)); QUrl url = QUrl(parser.value(urlOption));
if (url.isValid() && (url.scheme() == URL_SCHEME_HIFI || url.scheme() == URL_SCHEME_HIFIAPP)) { if (url.isValid() && (url.scheme() == URL_SCHEME_HIFI || url.scheme() == URL_SCHEME_HIFIAPP
|| url.scheme() == HIFI_URL_SCHEME_HTTP || url.scheme() == HIFI_URL_SCHEME_HTTPS
|| url.scheme() == HIFI_URL_SCHEME_FILE)) {
qDebug() << "Writing URL to local socket"; qDebug() << "Writing URL to local socket";
socket.write(url.toString().toUtf8()); socket.write(url.toString().toUtf8());
if (!socket.waitForBytesWritten(5000)) { if (!socket.waitForBytesWritten(5000)) {

View file

@ -20,6 +20,7 @@
#include <AccountManager.h> #include <AccountManager.h>
#include <NetworkAccessManager.h> #include <NetworkAccessManager.h>
#include <NetworkingConstants.h> #include <NetworkingConstants.h>
#include <MetaverseAPI.h>
#include <NetworkLogging.h> #include <NetworkLogging.h>
#include <UserActivityLogger.h> #include <UserActivityLogger.h>
#include <UUID.h> #include <UUID.h>
@ -28,7 +29,7 @@ QNetworkRequest createNetworkRequest() {
QNetworkRequest request; QNetworkRequest request;
QUrl requestURL = NetworkingConstants::METAVERSE_SERVER_URL(); QUrl requestURL = MetaverseAPI::getCurrentMetaverseServerURL();
requestURL.setPath(USER_ACTIVITY_URL); requestURL.setPath(USER_ACTIVITY_URL);
request.setUrl(requestURL); request.setUrl(requestURL);

View file

@ -31,6 +31,8 @@ public:
surfaceNormal = stylusPickResult.surfaceNormal; surfaceNormal = stylusPickResult.surfaceNormal;
} }
StylusPickResult& operator=(const StylusPickResult &right) = default;
IntersectionType type { NONE }; IntersectionType type { NONE };
bool intersects { false }; bool intersects { false };
QUuid objectID; QUuid objectID;

View file

@ -15,6 +15,7 @@
#include <OffscreenQmlDialog.h> #include <OffscreenQmlDialog.h>
#include <NetworkingConstants.h> #include <NetworkingConstants.h>
#include <MetaverseAPI.h>
class AddressBarDialog : public OffscreenQmlDialog { class AddressBarDialog : public OffscreenQmlDialog {
Q_OBJECT Q_OBJECT
@ -30,7 +31,7 @@ public:
bool forwardEnabled() { return _forwardEnabled; } bool forwardEnabled() { return _forwardEnabled; }
bool useFeed() { return _useFeed; } bool useFeed() { return _useFeed; }
void setUseFeed(bool useFeed) { if (_useFeed != useFeed) { _useFeed = useFeed; emit useFeedChanged(); } } void setUseFeed(bool useFeed) { if (_useFeed != useFeed) { _useFeed = useFeed; emit useFeedChanged(); } }
QString metaverseServerUrl() { return NetworkingConstants::METAVERSE_SERVER_URL().toString(); } QString metaverseServerUrl() { return MetaverseAPI::getCurrentMetaverseServerURL().toString(); }
signals: signals:
void backEnabledChanged(); void backEnabledChanged();

View file

@ -14,6 +14,7 @@
#include <EntityTreeRenderer.h> #include <EntityTreeRenderer.h>
#include <NetworkingConstants.h> #include <NetworkingConstants.h>
#include <MetaverseAPI.h>
#include <NetworkAccessManager.h> #include <NetworkAccessManager.h>
#include <QtNetwork/QNetworkRequest> #include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply> #include <QtNetwork/QNetworkReply>
@ -305,7 +306,7 @@ void ContextOverlayInterface::requestOwnershipVerification(const QUuid& entityID
QNetworkRequest networkRequest; QNetworkRequest networkRequest;
networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QUrl requestURL = NetworkingConstants::METAVERSE_SERVER_URL(); QUrl requestURL = MetaverseAPI::getCurrentMetaverseServerURL();
requestURL.setPath("/api/v1/commerce/proof_of_purchase_status/transfer"); requestURL.setPath("/api/v1/commerce/proof_of_purchase_status/transfer");
QJsonObject request; QJsonObject request;
request["certificate_id"] = entityProperties.getCertificateID(); request["certificate_id"] = entityProperties.getCertificateID();

View file

@ -1,5 +1,5 @@
// //
// PhysicsBoundary.h // PhysicsBoundary.cpp
// //
// Created by Andrew Meadows 2018.04.05 // Created by Andrew Meadows 2018.04.05
// Copyright 2018 High Fidelity, Inc. // Copyright 2018 High Fidelity, Inc.

View file

@ -162,6 +162,7 @@ protected:
const QString& typeVarIn, const QString& weightVarIn, float weightIn, const std::vector<float>& flexCoefficientsIn, const QString& typeVarIn, const QString& weightVarIn, float weightIn, const std::vector<float>& flexCoefficientsIn,
const QString& poleVectorEnabledVar, const QString& poleReferenceVectorVar, const QString& poleVectorVar); const QString& poleVectorEnabledVar, const QString& poleReferenceVectorVar, const QString& poleVectorVar);
IKTargetVar(const IKTargetVar& orig); IKTargetVar(const IKTargetVar& orig);
AnimInverseKinematics::IKTargetVar& operator=(const AnimInverseKinematics::IKTargetVar&) = default;
QString jointName; QString jointName;
QString positionVar; QString positionVar;

View file

@ -207,7 +207,7 @@ public:
/**jsdoc /**jsdoc
* Gets the default rotation of a joint (in the current avatar) relative to its parent. * Gets the default rotation of a joint (in the current avatar) relative to its parent.
* <p>For information on the joint hierarchy used, see * <p>For information on the joint hierarchy used, see
* <a href="https://docs.highfidelity.com/create/avatars/avatar-standards">Avatar Standards</a>.</p> * <a href="https://docs.projectathena.dev/create/avatars/avatar-standards.html">Avatar Standards</a>.</p>
* @function MyAvatar.getDefaultJointRotation * @function MyAvatar.getDefaultJointRotation
* @param {number} index - The joint index. * @param {number} index - The joint index.
* @returns {Quat} The default rotation of the joint if the joint index is valid, otherwise {@link Quat(0)|Quat.IDENTITY}. * @returns {Quat} The default rotation of the joint if the joint index is valid, otherwise {@link Quat(0)|Quat.IDENTITY}.
@ -218,7 +218,7 @@ public:
* Gets the default translation of a joint (in the current avatar) relative to its parent, in model coordinates. * Gets the default translation of a joint (in the current avatar) relative to its parent, in model coordinates.
* <p><strong>Warning:</strong> These coordinates are not necessarily in meters.</p> * <p><strong>Warning:</strong> These coordinates are not necessarily in meters.</p>
* <p>For information on the joint hierarchy used, see * <p>For information on the joint hierarchy used, see
* <a href="https://docs.highfidelity.com/create/avatars/avatar-standards">Avatar Standards</a>.</p> * <a href="https://docs.projectathena.dev/create/avatars/avatar-standards.html">Avatar Standards</a>.</p>
* @function MyAvatar.getDefaultJointTranslation * @function MyAvatar.getDefaultJointTranslation
* @param {number} index - The joint index. * @param {number} index - The joint index.
* @returns {Vec3} The default translation of the joint (in model coordinates) if the joint index is valid, otherwise * @returns {Vec3} The default translation of the joint (in model coordinates) if the joint index is valid, otherwise

View file

@ -793,7 +793,7 @@ public:
* @param {Quat} rotation - The rotation of the joint relative to its parent. * @param {Quat} rotation - The rotation of the joint relative to its parent.
* @param {Vec3} translation - The translation of the joint relative to its parent, in model coordinates. * @param {Vec3} translation - The translation of the joint relative to its parent, in model coordinates.
* @example <caption>Set your avatar to it's default T-pose for a while.<br /> * @example <caption>Set your avatar to it's default T-pose for a while.<br />
* <img alt="Avatar in T-pose" src="https://docs.highfidelity.com/images/t-pose.png" /></caption> * <img alt="Avatar in T-pose" src="https://apidocs.projectathena.dev/images/t-pose.png" /></caption>
* // Set all joint translations and rotations to defaults. * // Set all joint translations and rotations to defaults.
* var i, length, rotation, translation; * var i, length, rotation, translation;
* for (i = 0, length = MyAvatar.getJointNames().length; i < length; i++) { * for (i = 0, length = MyAvatar.getJointNames().length; i < length; i++) {
@ -857,7 +857,7 @@ public:
/**jsdoc /**jsdoc
* Gets the rotation of a joint relative to its parent. For information on the joint hierarchy used, see * Gets the rotation of a joint relative to its parent. For information on the joint hierarchy used, see
* <a href="https://docs.highfidelity.com/create/avatars/avatar-standards">Avatar Standards</a>. * <a href="https://docs.projectathena.dev/create/avatars/avatar-standards.html">Avatar Standards</a>.
* @function Avatar.getJointRotation * @function Avatar.getJointRotation
* @param {number} index - The index of the joint. * @param {number} index - The index of the joint.
* @returns {Quat} The rotation of the joint relative to its parent. * @returns {Quat} The rotation of the joint relative to its parent.
@ -868,7 +868,7 @@ public:
* Gets the translation of a joint relative to its parent, in model coordinates. * Gets the translation of a joint relative to its parent, in model coordinates.
* <p><strong>Warning:</strong> These coordinates are not necessarily in meters.</p> * <p><strong>Warning:</strong> These coordinates are not necessarily in meters.</p>
* <p>For information on the joint hierarchy used, see * <p>For information on the joint hierarchy used, see
* <a href="https://docs.highfidelity.com/create/avatars/avatar-standards">Avatar Standards</a>.</p> * <a href="https://docs.projectathena.dev/create/avatars/avatar-standards.html">Avatar Standards</a>.</p>
* @function Avatar.getJointTranslation * @function Avatar.getJointTranslation
* @param {number} index - The index of the joint. * @param {number} index - The index of the joint.
* @returns {Vec3} The translation of the joint relative to its parent, in model coordinates. * @returns {Vec3} The translation of the joint relative to its parent, in model coordinates.
@ -901,7 +901,7 @@ public:
* @param {string} name - The name of the joint. * @param {string} name - The name of the joint.
* @param {Quat} rotation - The rotation of the joint relative to its parent. * @param {Quat} rotation - The rotation of the joint relative to its parent.
* @example <caption>Set your avatar to its default T-pose then rotate its right arm.<br /> * @example <caption>Set your avatar to its default T-pose then rotate its right arm.<br />
* <img alt="Avatar in T-pose with arm rotated" src="https://docs.highfidelity.com/images/armpose.png" /></caption> * <img alt="Avatar in T-pose with arm rotated" src="https://apidocs.projectathena.dev/images/armpose.png" /></caption>
* // Set all joint translations and rotations to defaults. * // Set all joint translations and rotations to defaults.
* var i, length, rotation, translation; * var i, length, rotation, translation;
* for (i = 0, length = MyAvatar.getJointNames().length; i < length; i++) { * for (i = 0, length = MyAvatar.getJointNames().length; i < length; i++) {
@ -936,7 +936,7 @@ public:
* @param {Vec3} translation - The translation of the joint relative to its parent, in model coordinates. * @param {Vec3} translation - The translation of the joint relative to its parent, in model coordinates.
* @example <caption>Stretch your avatar's neck. Depending on the avatar you are using, you will either see a gap between * @example <caption>Stretch your avatar's neck. Depending on the avatar you are using, you will either see a gap between
* the head and body or you will see the neck stretched.<br /> * the head and body or you will see the neck stretched.<br />
* <img alt="Avatar with neck stretched" src="https://docs.highfidelity.com/images/stretched-neck.png" /></caption> * <img alt="Avatar with neck stretched" src="https://apidocs.projectathena.dev/images/stretched-neck.png" /></caption>
* // Stretch your avatar's neck. * // Stretch your avatar's neck.
* MyAvatar.setJointTranslation("Neck", Vec3.multiply(2, MyAvatar.getJointTranslation("Neck"))); * MyAvatar.setJointTranslation("Neck", Vec3.multiply(2, MyAvatar.getJointTranslation("Neck")));
* *
@ -978,7 +978,7 @@ public:
/**jsdoc /**jsdoc
* Gets the rotation of a joint relative to its parent. For information on the joint hierarchy used, see * Gets the rotation of a joint relative to its parent. For information on the joint hierarchy used, see
* <a href="https://docs.highfidelity.com/create/avatars/avatar-standards">Avatar Standards</a>. * <a href="https://docs.projectathena.dev/create/avatars/avatar-standards.html">Avatar Standards</a>.
* @function Avatar.getJointRotation * @function Avatar.getJointRotation
* @param {string} name - The name of the joint. * @param {string} name - The name of the joint.
* @returns {Quat} The rotation of the joint relative to its parent. * @returns {Quat} The rotation of the joint relative to its parent.
@ -993,7 +993,7 @@ public:
* Gets the translation of a joint relative to its parent, in model coordinates. * Gets the translation of a joint relative to its parent, in model coordinates.
* <p><strong>Warning:</strong> These coordinates are not necessarily in meters.</p> * <p><strong>Warning:</strong> These coordinates are not necessarily in meters.</p>
* <p>For information on the joint hierarchy used, see * <p>For information on the joint hierarchy used, see
* <a href="https://docs.highfidelity.com/create/avatars/avatar-standards">Avatar Standards</a>.</p> * <a href="https://docs.projectathena.dev/create/avatars/avatar-standards.html">Avatar Standards</a>.</p>
* @function Avatar.getJointTranslation * @function Avatar.getJointTranslation
* @param {number} name - The name of the joint. * @param {number} name - The name of the joint.
* @returns {Vec3} The translation of the joint relative to its parent, in model coordinates. * @returns {Vec3} The translation of the joint relative to its parent, in model coordinates.
@ -1038,7 +1038,7 @@ public:
* @param {Quat[]} jointRotations - The rotations for all joints in the avatar. The values are in the same order as the * @param {Quat[]} jointRotations - The rotations for all joints in the avatar. The values are in the same order as the
* array returned by {@link MyAvatar.getJointNames}, or {@link Avatar.getJointNames} if using the <code>Avatar</code> API. * array returned by {@link MyAvatar.getJointNames}, or {@link Avatar.getJointNames} if using the <code>Avatar</code> API.
* @example <caption>Set your avatar to its default T-pose then rotate its right arm.<br /> * @example <caption>Set your avatar to its default T-pose then rotate its right arm.<br />
* <img alt="Avatar in T-pose" src="https://docs.highfidelity.com/images/armpose.png" /></caption> * <img alt="Avatar in T-pose" src="https://apidocs.projectathena.dev/images/armpose.png" /></caption>
* // Set all joint translations and rotations to defaults. * // Set all joint translations and rotations to defaults.
* var i, length, rotation, translation; * var i, length, rotation, translation;
* for (i = 0, length = MyAvatar.getJointNames().length; i < length; i++) { * for (i = 0, length = MyAvatar.getJointNames().length; i < length; i++) {
@ -1135,7 +1135,7 @@ public:
* animation is complete. * animation is complete.
* @function Avatar.setBlendshape * @function Avatar.setBlendshape
* @param {string} name - The name of the blendshape, per the * @param {string} name - The name of the blendshape, per the
* {@link https://docs.highfidelity.com/create/avatars/avatar-standards.html#blendshapes Avatar Standards}. * {@link https://docs.projectathena.dev/create/avatars/avatar-standards.html#blendshapes Avatar Standards}.
* @param {number} value - A value between <code>0.0</code> and <code>1.0</code>. * @param {number} value - A value between <code>0.0</code> and <code>1.0</code>.
* @example <caption>Open your avatar's mouth wide.</caption> * @example <caption>Open your avatar's mouth wide.</caption>
* MyAvatar.hasScriptedBlendshapes = true; * MyAvatar.hasScriptedBlendshapes = true;

View file

@ -28,6 +28,7 @@
#include "EntitiesRendererLogging.h" #include "EntitiesRendererLogging.h"
#include <NetworkingConstants.h> #include <NetworkingConstants.h>
#include <MetaverseAPI.h>
using namespace render; using namespace render;
using namespace render::entities; using namespace render::entities;

View file

@ -15,6 +15,7 @@
#include <QtEndian> #include <QtEndian>
#include <QJsonDocument> #include <QJsonDocument>
#include <NetworkingConstants.h> #include <NetworkingConstants.h>
#include <MetaverseAPI.h>
#include <NetworkAccessManager.h> #include <NetworkAccessManager.h>
#include <QtNetwork/QNetworkReply> #include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkRequest> #include <QtNetwork/QNetworkRequest>
@ -3218,7 +3219,7 @@ void EntityItem::retrieveMarketplacePublicKey() {
QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
QNetworkRequest networkRequest; QNetworkRequest networkRequest;
networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
QUrl requestURL = NetworkingConstants::METAVERSE_SERVER_URL(); QUrl requestURL = MetaverseAPI::getCurrentMetaverseServerURL();
requestURL.setPath("/api/v1/commerce/marketplace_key"); requestURL.setPath("/api/v1/commerce/marketplace_key");
QJsonObject request; QJsonObject request;
networkRequest.setUrl(requestURL); networkRequest.setUrl(requestURL);

View file

@ -1370,7 +1370,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const {
* var METERS_TO_INCHES = 39.3701; * var METERS_TO_INCHES = 39.3701;
* var entity = Entities.addEntity({ * var entity = Entities.addEntity({
* type: "Web", * type: "Web",
* sourceUrl: "https://highfidelity.com/", * sourceUrl: "https://projectathena.io/",
* position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -4 })), * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -4 })),
* rotation: MyAvatar.orientation, * rotation: MyAvatar.orientation,
* dimensions: { * dimensions: {

View file

@ -121,6 +121,8 @@ public:
static void propertiesToBlob(QScriptEngine& scriptEngine, const QUuid& myAvatarID, const EntityItemProperties& properties, QByteArray& blob); static void propertiesToBlob(QScriptEngine& scriptEngine, const QUuid& myAvatarID, const EntityItemProperties& properties, QByteArray& blob);
EntityItemProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags()); EntityItemProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags());
EntityItemProperties(const EntityItemProperties&) = default;
virtual ~EntityItemProperties() = default; virtual ~EntityItemProperties() = default;
void merge(const EntityItemProperties& other); void merge(const EntityItemProperties& other);

View file

@ -110,6 +110,10 @@ public:
* displayed and so knows about. For assignment client scripts, the entities available are those that are "seen" by the * displayed and so knows about. For assignment client scripts, the entities available are those that are "seen" by the
* {@link EntityViewer}. For entity server scripts, all entities are available.</p> * {@link EntityViewer}. For entity server scripts, all entities are available.</p>
* *
* <h3>Entity Types</h3>
*
* <p>For a list of the entity types that you can use, see {@link Entities.EntityType|Entity Types}.</p>
*
* <h3>Entity Methods</h3> * <h3>Entity Methods</h3>
* *
* <p>Some of the API's signals correspond to entity methods that are called, if present, in the entity being interacted with. * <p>Some of the API's signals correspond to entity methods that are called, if present, in the entity being interacted with.

View file

@ -16,6 +16,7 @@
#include <openssl/pem.h> #include <openssl/pem.h>
#include <openssl/x509.h> #include <openssl/x509.h>
#include <NetworkingConstants.h> #include <NetworkingConstants.h>
#include <MetaverseAPI.h>
#include "AccountManager.h" #include "AccountManager.h"
#include <QJsonObject> #include <QJsonObject>
#include <QJsonDocument> #include <QJsonDocument>
@ -1464,7 +1465,7 @@ void EntityTree::startDynamicDomainVerificationOnServer(float minimumAgeToRemove
QNetworkRequest networkRequest; QNetworkRequest networkRequest;
networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QUrl requestURL = NetworkingConstants::METAVERSE_SERVER_URL(); QUrl requestURL = MetaverseAPI::getCurrentMetaverseServerURL();
requestURL.setPath("/api/v1/commerce/proof_of_purchase_status/location"); requestURL.setPath("/api/v1/commerce/proof_of_purchase_status/location");
QJsonObject request; QJsonObject request;
request["certificate_id"] = certificateID; request["certificate_id"] = certificateID;
@ -1687,7 +1688,7 @@ void EntityTree::validatePop(const QString& certID, const EntityItemID& entityIt
QNetworkRequest networkRequest; QNetworkRequest networkRequest;
networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QUrl requestURL = NetworkingConstants::METAVERSE_SERVER_URL(); QUrl requestURL = MetaverseAPI::getCurrentMetaverseServerURL();
requestURL.setPath("/api/v1/commerce/proof_of_purchase_status/transfer"); requestURL.setPath("/api/v1/commerce/proof_of_purchase_status/transfer");
QJsonObject request; QJsonObject request;
request["certificate_id"] = certID; request["certificate_id"] = certID;

View file

@ -112,6 +112,7 @@ public:
SimulationOwner(); SimulationOwner();
SimulationOwner(const QUuid& id, uint8_t priority); SimulationOwner(const QUuid& id, uint8_t priority);
SimulationOwner(const SimulationOwner &) = default;
const QUuid& getID() const { return _id; } const QUuid& getID() const { return _id; }
const uint64_t& getExpiry() const { return _expiry; } const uint64_t& getExpiry() const { return _expiry; }

View file

@ -204,10 +204,7 @@ void GLBackend::do_setStateDepthTest(State::DepthTest test) {
glDepthFunc(COMPARISON_TO_GL[test.getFunction()]); glDepthFunc(COMPARISON_TO_GL[test.getFunction()]);
} }
if (CHECK_GL_ERROR()) { if (CHECK_GL_ERROR()) {
qCDebug(gpulogging) << "DepthTest" << (test.isEnabled() ? "Enabled" : "Disabled") qCDebug(gpulogging) << "DepthTest = " << test;
<< "Mask=" << (test.getWriteMask() ? "Write" : "no Write")
<< "Func=" << (uint16_t)test.getFunction()
<< "Raw=" << test.getRaw();
} }
_pipeline._stateCache.depthTest = test; _pipeline._stateCache.depthTest = test;
} }

View file

@ -119,7 +119,7 @@ void generateDepthBias(GLState::Commands& commands, const State& state) {
} }
void generateDepthTest(GLState::Commands& commands, const State::DepthTest& test) { void generateDepthTest(GLState::Commands& commands, const State::DepthTest& test) {
commands.push_back(std::make_shared<CommandDepthTest>(&GLBackend::do_setStateDepthTest, int32(test.getRaw()))); commands.push_back(std::make_shared<CommandDepthTest>(&GLBackend::do_setStateDepthTest, test));
} }
void generateStencil(GLState::Commands& commands, const State& state) { void generateStencil(GLState::Commands& commands, const State& state) {

View file

@ -377,7 +377,7 @@ public:
}; };
enum ComparisonFunction : uint16 { enum ComparisonFunction {
NEVER = 0, NEVER = 0,
LESS, LESS,
EQUAL, EQUAL,

View file

@ -94,20 +94,3 @@ static std::string hex(T t) {
stream << std::hex << t; stream << std::hex << t;
return stream.str(); return stream.str();
} }
std::string State::getKey() const {
std::string key;
key = hex(*(int*)&_values.depthBias);
key += ":" + hex(*(int*)&_values.depthBiasSlopeScale);
key += ":" + hex(_values.depthTest.getRaw());
key += ":" + hex(_values.stencilActivation.getRaw());
key += ":" + hex(_values.stencilTestFront.getRaw());
key += ":" + hex(_values.stencilTestBack.getRaw());
key += ":" + hex(_values.blendFunction.getRaw());
key += ":" + hex(_values.sampleMask);
// fillMode, cullMode, colorMaskWrite and the flags consume 32 bits alltogether
static_assert(0 == offsetof(State::Data, fillMode) % 4, "Validate fillMode offset");
key += ":" + hex(*(int*)&_values.fillMode);
return key;
}

View file

@ -18,6 +18,7 @@
#include <vector> #include <vector>
#include <unordered_map> #include <unordered_map>
#include <bitset> #include <bitset>
#include <QString>
// Why a macro and not a fancy template you will ask me ? // Why a macro and not a fancy template you will ask me ?
// Because some of the fields are bool packed tightly in the State::Cache class // Because some of the fields are bool packed tightly in the State::Cache class
@ -46,7 +47,7 @@ public:
typedef ::gpu::ComparisonFunction ComparisonFunction; typedef ::gpu::ComparisonFunction ComparisonFunction;
enum FillMode : uint8 enum FillMode
{ {
FILL_POINT = 0, FILL_POINT = 0,
FILL_LINE, FILL_LINE,
@ -55,7 +56,7 @@ public:
NUM_FILL_MODES, NUM_FILL_MODES,
}; };
enum CullMode : uint8 enum CullMode
{ {
CULL_NONE = 0, CULL_NONE = 0,
CULL_FRONT, CULL_FRONT,
@ -64,7 +65,7 @@ public:
NUM_CULL_MODES, NUM_CULL_MODES,
}; };
enum StencilOp : uint16 enum StencilOp
{ {
STENCIL_OP_KEEP = 0, STENCIL_OP_KEEP = 0,
STENCIL_OP_ZERO, STENCIL_OP_ZERO,
@ -78,7 +79,7 @@ public:
NUM_STENCIL_OPS, NUM_STENCIL_OPS,
}; };
enum BlendArg : uint16 enum BlendArg
{ {
ZERO = 0, ZERO = 0,
ONE, ONE,
@ -99,7 +100,7 @@ public:
NUM_BLEND_ARGS, NUM_BLEND_ARGS,
}; };
enum BlendOp : uint16 enum BlendOp
{ {
BLEND_OP_ADD = 0, BLEND_OP_ADD = 0,
BLEND_OP_SUBTRACT, BLEND_OP_SUBTRACT,
@ -110,7 +111,7 @@ public:
NUM_BLEND_OPS, NUM_BLEND_OPS,
}; };
enum ColorMask : uint8 enum ColorMask
{ {
WRITE_NONE = 0, WRITE_NONE = 0,
WRITE_RED = 1, WRITE_RED = 1,
@ -134,19 +135,27 @@ public:
ComparisonFunction getFunction() const { return function; } ComparisonFunction getFunction() const { return function; }
uint8 getWriteMask() const { return writeMask; } uint8 getWriteMask() const { return writeMask; }
int32 getRaw() const { return *(reinterpret_cast<const int32*>(this)); } bool operator==(const DepthTest& right) const {
DepthTest(int32 raw) { *(reinterpret_cast<int32*>(this)) = raw; } return
bool operator==(const DepthTest& right) const { return getRaw() == right.getRaw(); } writeMask == right.writeMask &&
bool operator!=(const DepthTest& right) const { return getRaw() != right.getRaw(); } enabled == right.enabled &&
function == right.function;
}
bool operator!=(const DepthTest& right) const {
return !(*this == right);
}
operator QString() const {
return QString("{ writeMask = %1, enabled = %2, function = %3 }").arg(writeMask).arg(enabled).arg(function);
}
}; };
static_assert(sizeof(DepthTest) == sizeof(uint32_t), "DepthTest size check");
struct StencilTest { struct StencilTest {
ComparisonFunction function : 4; ComparisonFunction function;
StencilOp failOp : 4; StencilOp failOp;
StencilOp depthFailOp : 4; StencilOp depthFailOp;
StencilOp passOp : 4; StencilOp passOp;
int8 reference{ 0 }; int8 reference{ 0 };
uint8 readMask{ 0xff }; uint8 readMask{ 0xff };
@ -168,47 +177,56 @@ public:
int8 getReference() const { return reference; } int8 getReference() const { return reference; }
uint8 getReadMask() const { return readMask; } uint8 getReadMask() const { return readMask; }
int32 getRaw() const { return *(reinterpret_cast<const int32*>(this)); } bool operator==(const StencilTest& right) const {
StencilTest(int32 raw) { *(reinterpret_cast<int32*>(this)) = raw; } return
bool operator==(const StencilTest& right) const { return getRaw() == right.getRaw(); } function == right.function &&
bool operator!=(const StencilTest& right) const { return getRaw() != right.getRaw(); } failOp == right.failOp &&
depthFailOp == right.depthFailOp &&
passOp == right.passOp &&
reference == right.reference &&
readMask == right.readMask;
}
bool operator!=(const StencilTest &right) const { return !(right==*this); }
}; };
static_assert(sizeof(StencilTest) == sizeof(uint32_t), "StencilTest size check");
StencilTest stencilTestFront; StencilTest stencilTestFront;
struct StencilActivation { struct StencilActivation {
uint8 frontWriteMask = 0xFF; uint8 frontWriteMask = 0xFF;
uint8 backWriteMask = 0xFF; uint8 backWriteMask = 0xFF;
bool enabled : 1; bool enabled;
uint8 _spare1 : 7;
uint8 _spare2{ 0 };
public: public:
StencilActivation(bool enabled = false, uint8 frontWriteMask = 0xFF, uint8 backWriteMask = 0xFF) : StencilActivation(bool enabled = false, uint8 frontWriteMask = 0xFF, uint8 backWriteMask = 0xFF) :
frontWriteMask(frontWriteMask), backWriteMask(backWriteMask), enabled(enabled), _spare1{ 0 } {} frontWriteMask(frontWriteMask), backWriteMask(backWriteMask), enabled(enabled) {}
bool isEnabled() const { return enabled; } bool isEnabled() const { return enabled; }
uint8 getWriteMaskFront() const { return frontWriteMask; } uint8 getWriteMaskFront() const { return frontWriteMask; }
uint8 getWriteMaskBack() const { return backWriteMask; } uint8 getWriteMaskBack() const { return backWriteMask; }
int32 getRaw() const { return *(reinterpret_cast<const int32*>(this)); } bool operator==(const StencilActivation& right) const {
StencilActivation(int32 raw) { *(reinterpret_cast<int32*>(this)) = raw; } return
bool operator==(const StencilActivation& right) const { return getRaw() == right.getRaw(); } frontWriteMask == right.frontWriteMask &&
bool operator!=(const StencilActivation& right) const { return getRaw() != right.getRaw(); } backWriteMask == right.backWriteMask &&
}; enabled == right.enabled;
}
static_assert(sizeof(StencilActivation) == sizeof(uint32_t), "StencilActivation size check"); bool operator!=(const StencilActivation& right) const {
return !(*this == right);
}
};
struct BlendFunction { struct BlendFunction {
// Using uint8 here will make the structure as a whole not align to 32 bits // Using uint8 here will make the structure as a whole not align to 32 bits
uint16 enabled : 8; uint16 enabled;
BlendArg sourceColor : 4; BlendArg sourceColor;
BlendArg sourceAlpha : 4; BlendArg sourceAlpha;
BlendArg destColor : 4; BlendArg destColor;
BlendArg destAlpha : 4; BlendArg destAlpha;
BlendOp opColor : 4; BlendOp opColor;
BlendOp opAlpha : 4; BlendOp opAlpha;
public: public:
BlendFunction(bool enabled, BlendFunction(bool enabled,
@ -219,7 +237,7 @@ public:
BlendOp operationAlpha, BlendOp operationAlpha,
BlendArg destinationAlpha) : BlendArg destinationAlpha) :
enabled(enabled), enabled(enabled),
sourceColor(sourceColor), sourceAlpha(sourceAlpha), sourceColor(sourceColor), sourceAlpha(sourceAlpha),
destColor(destinationColor), destAlpha(destinationAlpha), destColor(destinationColor), destAlpha(destinationAlpha),
opColor(operationColor), opAlpha(operationAlpha) {} opColor(operationColor), opAlpha(operationAlpha) {}
@ -236,32 +254,51 @@ public:
BlendArg getDestinationAlpha() const { return destAlpha; } BlendArg getDestinationAlpha() const { return destAlpha; }
BlendOp getOperationAlpha() const { return opAlpha; } BlendOp getOperationAlpha() const { return opAlpha; }
int32 getRaw() const { return *(reinterpret_cast<const int32*>(this)); } bool operator==(const BlendFunction& right) const {
BlendFunction(int32 raw) { *(reinterpret_cast<int32*>(this)) = raw; } return
bool operator==(const BlendFunction& right) const { return getRaw() == right.getRaw(); } enabled == right.enabled &&
bool operator!=(const BlendFunction& right) const { return getRaw() != right.getRaw(); } sourceColor == right.sourceColor &&
}; sourceAlpha == right.sourceAlpha &&
destColor == right.destColor &&
destAlpha == right.destAlpha &&
opColor == right.opColor &&
opAlpha == right.opAlpha;
static_assert(sizeof(BlendFunction) == sizeof(uint32_t), "BlendFunction size check"); }
bool operator!=(const BlendFunction& right) const {
return !(*this == right);
}
};
struct Flags { struct Flags {
Flags() : Flags() :
frontFaceClockwise(false), depthClampEnable(false), scissorEnable(false), multisampleEnable(true), frontFaceClockwise(false), depthClampEnable(false), scissorEnable(false), multisampleEnable(true),
antialisedLineEnable(true), alphaToCoverageEnable(false), _spare1(0) {} antialisedLineEnable(true), alphaToCoverageEnable(false) {}
bool frontFaceClockwise : 1; bool frontFaceClockwise;
bool depthClampEnable : 1; bool depthClampEnable;
bool scissorEnable : 1; bool scissorEnable;
bool multisampleEnable : 1; bool multisampleEnable;
bool antialisedLineEnable : 1; bool antialisedLineEnable;
bool alphaToCoverageEnable : 1; bool alphaToCoverageEnable;
uint8 _spare1 : 2;
bool operator==(const Flags& right) const { return *(uint8*)this == *(uint8*)&right; }
bool operator!=(const Flags& right) const { return *(uint8*)this != *(uint8*)&right; } bool operator==(const Flags& right) const {
return
frontFaceClockwise == right.frontFaceClockwise &&
depthClampEnable == right.depthClampEnable &&
scissorEnable == right.scissorEnable &&
multisampleEnable == right.multisampleEnable &&
antialisedLineEnable == right.antialisedLineEnable &&
alphaToCoverageEnable == right.alphaToCoverageEnable;
}
bool operator!=(const Flags& right) const {
return !(*this == right);
}
}; };
static_assert(sizeof(Flags) == sizeof(uint8), "Flags size check");
// The Data class is the full explicit description of the State class fields value. // The Data class is the full explicit description of the State class fields value.
// Useful for having one const static called Default for reference or for the gpu::Backend to keep track of the current value // Useful for having one const static called Default for reference or for the gpu::Backend to keep track of the current value
class Data { class Data {
@ -282,22 +319,6 @@ public:
Flags flags; Flags flags;
}; };
static_assert(offsetof(Data, depthBias) == 0, "Data offsets");
static_assert(offsetof(Data, depthBiasSlopeScale) == 4, "Data offsets");
static_assert(offsetof(Data, depthTest) == 8, "Data offsets");
static_assert(offsetof(Data, stencilActivation) == 12, "Data offsets");
static_assert(offsetof(Data, stencilTestFront) == 16, "Data offsets");
static_assert(offsetof(Data, stencilTestBack) == 20, "Data offsets");
static_assert(offsetof(Data, sampleMask) == 24, "Data offsets");
static_assert(offsetof(Data, blendFunction) == 28, "Data offsets");
static_assert(offsetof(Data, fillMode) == 32, "Data offsets");
static_assert(offsetof(Data, cullMode) == 33, "Data offsets");
static_assert(offsetof(Data, colorWriteMask) == 34, "Data offsets");
static_assert(offsetof(Data, flags) == 35, "Data offsets");
static_assert(sizeof(Data) == 36, "Data Size Check");
std::string getKey() const;
// The unique default values for all the fields // The unique default values for all the fields
static const Data DEFAULT; static const Data DEFAULT;
void setFillMode(FillMode fill) { SET_FIELD(FILL_MODE, fillMode, fill); } void setFillMode(FillMode fill) { SET_FIELD(FILL_MODE, fillMode, fill); }

View file

@ -59,7 +59,7 @@ namespace image {
Image() : _dims(0,0) {} Image() : _dims(0,0) {}
Image(int width, int height, Format format); Image(int width, int height, Format format);
Image(const QImage& data) : _packedData(data), _dims(data.width(), data.height()), _format((Format)data.format()) {} Image(const QImage& data) : _packedData(data), _dims(data.width(), data.height()), _format((Format)data.format()) {}
Image(const Image &other) = default;
void operator=(const QImage& other) { void operator=(const QImage& other) {
_packedData = other; _packedData = other;
_floatData.clear(); _floatData.clear();

View file

@ -33,7 +33,7 @@ namespace TextureUsage {
/**jsdoc /**jsdoc
* <p>Describes the type of texture.</p> * <p>Describes the type of texture.</p>
* <p>See also: {@link Material} and * <p>See also: {@link Material} and
* {@link https://docs.highfidelity.com/create/3d-models/pbr-materials-guide.html|PBR Materials Guide}.</p> * {@link https://docs.projectathena.dev/create/3d-models/pbr-materials-guide.html|PBR Materials Guide}.</p>
* <table> * <table>
* <thead> * <thead>
* <tr><th>Value</th><th>Name</th><th>Description</th></tr> * <tr><th>Value</th><th>Name</th><th>Description</th></tr>

View file

@ -43,9 +43,10 @@
#include <Finally.h> #include <Finally.h>
#include <Profile.h> #include <Profile.h>
#include "NetworkLogging.h" #include <NetworkLogging.h>
#include "MaterialNetworkingLogging.h" #include "MaterialNetworkingLogging.h"
#include "NetworkingConstants.h" #include <NetworkingConstants.h>
#include <MetaverseAPI.h>
#include <Trace.h> #include <Trace.h>
#include <StatTracker.h> #include <StatTracker.h>

Some files were not shown because too many files have changed in this diff Show more