diff --git a/BUILD.md b/BUILD.md
index c9bb48d4b7..d441de9c17 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -32,7 +32,7 @@ These are not placed in your normal build tree when doing an out of source build
#### 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
CMake will download Qt 5.12.3 using vcpkg.
@@ -47,7 +47,7 @@ This can either be entered directly into your shell session before you build or
#### Vcpkg
-Hifi uses vcpkg to download and build dependencies.
+Athena uses vcpkg to download and build dependencies.
You do not need to install vcpkg.
Building the dependencies can be lengthy and the resulting files will be stored in your OS temp directory.
diff --git a/BUILD_ANDROID.md b/BUILD_ANDROID.md
index 3047cb827d..a0a0063d59 100644
--- a/BUILD_ANDROID.md
+++ b/BUILD_ANDROID.md
@@ -62,7 +62,7 @@ The above code to suppress modules is not necessary, but will speed up the build
### Clone the repository
-`git clone https://github.com/highfidelity/hifi.git `
+`git clone https://github.com/kasenvr/project-athena.git`
# Building & Running
diff --git a/BUILD_LINUX.md b/BUILD_LINUX.md
index c0cef86ba4..0be34cf90a 100644
--- a/BUILD_LINUX.md
+++ b/BUILD_LINUX.md
@@ -76,7 +76,7 @@ sudo apt-get install nodejs
Clone this repository:
```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:
diff --git a/BUILD_WIN.md b/BUILD_WIN.md
index 636d53c4e1..1ca4a69c6e 100644
--- a/BUILD_WIN.md
+++ b/BUILD_WIN.md
@@ -1,5 +1,5 @@
-This is a stand-alone guide for creating your first High Fidelity build for Windows 64-bit.
-## Building High Fidelity
+This is a stand-alone guide for creating your first Project Athena build for Windows 64-bit.
+## Building Project Athena
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.
@@ -37,7 +37,7 @@ Download and install the latest version of CMake 3.15.
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
-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:
* Naviagte to 'Edit the System Environment Variables' Through the start menu.
@@ -72,7 +72,7 @@ Where `%HIFI_DIR%` is the directory for the highfidelity repository.
### Step 5. 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.
@@ -88,7 +88,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`.
-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`
@@ -97,7 +97,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:
* Delete your locally cloned copy of the highfidelity repository
* 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
#### CMake gives you the same error message repeatedly after the build fails
diff --git a/README.md b/README.md
index 34c05867a7..be317e4371 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,10 @@
-# HiFi Community Edition
+# Project Athena
-### [Download v0.86.0 K1 (Windows 64-bit, .zip)](https://realities.dev/cdn/hifi-community/v0860-kasen-VS-release+freshstart/Packaged_Release.zip)
+### [Download ALPHA-DEV v0.86.0 K1 (Windows 64-bit, .zip)](https://realities.dev/cdn/hifi-community/v0860-kasen-VS-release+freshstart/Packaged_Release.zip)
-#### Changes for **v0.86.0** consist of:
+This build has been tested on Windows 10 Pro 64-bit w/ Nvidia graphics drivers.
-#### Added in K1 (12/3/19)
+#### v0.86.0 K1 (12/3/19)
* Audio Buffer choppy audio bugfix by increasing the buffer size.
* User Activity Logger disabled, option in code to log the reports to console.
@@ -13,15 +13,10 @@
* 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)
+#### v0.86.0 K2 (TBD)
-* QML Interface to access and save whitelist live to interface.json.
-* 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.
+##### Features, Bugs, and Housekeeping
+Check out the releases page for more information!
### Whitelist Instructions
@@ -31,15 +26,7 @@ The Interface has the whitelist settings under "**Settings -> Entity Script Whit
Do not use spaces or commas in the whitelist interface, you will only separate by commas and not new lines in the environment variables.
-It is recommended that you add High Fidelity's CDN URLs ahead of time to ensure general content works right off the bat:
-
-```
-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/**"
+You can also set the Windows environment variable "**EXTRA_WHITELIST**" with your whitelisted domains comma separated like so: "**http://mpassets.highfidelity.com/,https://raw.githubusercontent.com/highfidelity/,https://hifi-content.s3.amazonaws.com/**"
Alternatively you can make a batch file placed in the same folder as interface.exe that sets the whitelist environment variable temporarily:
@@ -50,7 +37,8 @@ interface.exe
### How to build interface.exe
-[For Windows](https://github.com/kasenvr/hifi-community/blob/kasen/core/BUILD_WIN.md)
+[For Windows](https://github.com/kasenvr/project-athena/blob/kasen/core/BUILD_WIN.md)
+[For Linux](https://github.com/kasenvr/project-athena/blob/kasen/core/BUILD_LINUX.md)
### Boot to Metaverse: The Goal
@@ -58,7 +46,7 @@ Too many of us have our own personal combinations of High Fidelity from C++ modi
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.
-### Why High Fidelity?
+### Why High Fidelity's Engine?
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.
@@ -68,6 +56,8 @@ Platforms like NeosVR or VRChat are unusable from go due to their fundamental cl
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.
-### Contributors
+### Contribution
-A special thanks to the contributors of the community edition.
+A special thanks to the contributors of the Project Athena.
+
+[Contribution](CONTRIBUTING.md)
diff --git a/cmake/ports/etc2comp/portfile.cmake b/cmake/ports/etc2comp/portfile.cmake
index d25f24cd39..343f67169b 100644
--- a/cmake/ports/etc2comp/portfile.cmake
+++ b/cmake/ports/etc2comp/portfile.cmake
@@ -19,7 +19,7 @@ include(vcpkg_common_functions)
vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH
- REPO highfidelity/etc2comp
+ REPO kasenvr/etc2comp
REF 7f1843bf07825c21cab711360c1ddbad04641036
SHA512 d747076acda8537d39585858c793a35c3dcc9ef283d723619a47f8c81ec1454c95b3340ad35f0655a939eae5b8271c801c48a9a7568311a01903a344c44af25b
HEAD_REF master
diff --git a/cmake/ports/hifi-scribe/portfile.cmake b/cmake/ports/hifi-scribe/portfile.cmake
index 2b69f7b887..498e8a455b 100644
--- a/cmake/ports/hifi-scribe/portfile.cmake
+++ b/cmake/ports/hifi-scribe/portfile.cmake
@@ -3,7 +3,7 @@ include(vcpkg_common_functions)
vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH
- REPO highfidelity/scribe
+ REPO kasenvr/scribe
REF 1bd638a36ca771e5a68d01985b6389b71835cbd2
SHA512 dbe241d86df3912e544f6b9839873f9875df54efc93822b145e7b13243eaf2e3d690bc8a28b1e52d05bdcd7e68fca6b0b2f5c43ffd0f56a9b7a50d54dcf9e31e
HEAD_REF master
diff --git a/cmake/ports/nvtt/portfile.cmake b/cmake/ports/nvtt/portfile.cmake
index 4cbe05b692..c7bf068e13 100644
--- a/cmake/ports/nvtt/portfile.cmake
+++ b/cmake/ports/nvtt/portfile.cmake
@@ -9,7 +9,7 @@ include(vcpkg_common_functions)
vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH
- REPO highfidelity/nvidia-texture-tools
+ REPO kasenvr/nvidia-texture-tools
REF 330c4d56274a0f602a5c70596e2eb670a4ed56c2
SHA512 4c0bc2f369120d696cc27710b6d33086b27eef55f537ec66b9a5c8b1839bc2426c0413670b0f65be52c5d353468f0126dfe024be1f0690611d4d7e33ac530127
HEAD_REF master
diff --git a/hifi_vcpkg.py b/hifi_vcpkg.py
index 94cac9afa2..f0e8840621 100644
--- a/hifi_vcpkg.py
+++ b/hifi_vcpkg.py
@@ -164,7 +164,7 @@ endif()
if downloadVcpkg:
if "HIFI_VCPKG_BOOTSTRAP" in os.environ:
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")
hifi_utils.executeSubprocess([self.bootstrapCmd], folder=self.path)
else:
diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt
index 5aed37dd02..f800f9c8aa 100644
--- a/interface/CMakeLists.txt
+++ b/interface/CMakeLists.txt
@@ -15,9 +15,9 @@ set(CUSTOM_INTERFACE_QRC_PATHS "")
find_npm()
-#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")
-#endif ()
+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")
+endif ()
set(RESOURCES_QRC ${CMAKE_CURRENT_BINARY_DIR}/resources.qrc)
set(RESOURCES_RCC ${CMAKE_CURRENT_SOURCE_DIR}/compiledResources/resources.rcc)
@@ -161,9 +161,9 @@ elseif (WIN32)
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_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
- 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)
add_custom_command(
@@ -182,10 +182,10 @@ else ()
endif ()
-#if (BUILD_TOOLS AND NPM_EXECUTABLE)
+if (BUILD_TOOLS AND NPM_EXECUTABLE)
# require JSDoc to be build before interface is deployed
-# add_dependencies(resources jsdoc)
-#endif()
+ add_dependencies(resources jsdoc)
+endif()
add_dependencies(${TARGET_NAME} resources)
@@ -326,9 +326,9 @@ if (APPLE)
"${CMAKE_SOURCE_DIR}/scripts"
"${RESOURCES_DEV_DIR}/scripts"
# copy JSDoc files beside the executable
- #COMMAND "${CMAKE_COMMAND}" -E copy_directory
- # "${CMAKE_SOURCE_DIR}/tools/jsdoc/out"
- # "${RESOURCES_DEV_DIR}/jsdoc"
+ COMMAND "${CMAKE_COMMAND}" -E copy_directory
+ "${CMAKE_SOURCE_DIR}/tools/jsdoc/out"
+ "${RESOURCES_DEV_DIR}/jsdoc"
# copy the resources files beside the executable
COMMAND "${CMAKE_COMMAND}" -E copy_if_different
"${RESOURCES_RCC}"
@@ -381,9 +381,9 @@ else()
"${PROJECT_SOURCE_DIR}/resources/serverless/redirect.json"
"${RESOURCES_DEV_DIR}/serverless/redirect.json"
# copy JSDoc files beside the executable
- #COMMAND "${CMAKE_COMMAND}" -E copy_directory
- # "${CMAKE_SOURCE_DIR}/tools/jsdoc/out"
- # "${INTERFACE_EXEC_DIR}/jsdoc"
+ COMMAND "${CMAKE_COMMAND}" -E copy_directory
+ "${CMAKE_SOURCE_DIR}/tools/jsdoc/out"
+ "${INTERFACE_EXEC_DIR}/jsdoc"
)
# link target to external libraries
diff --git a/interface/resources/qml/+webengine/QmlWebWindowView.qml b/interface/resources/qml/+webengine/QmlWebWindowView.qml
index d2f1820e9a..84ab61ad28 100644
--- a/interface/resources/qml/+webengine/QmlWebWindowView.qml
+++ b/interface/resources/qml/+webengine/QmlWebWindowView.qml
@@ -40,7 +40,7 @@ Controls.WebView {
userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard, userScript ]
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));
}
}
diff --git a/interface/resources/qml/hifi/avatarPackager/AvatarPackagerApp.qml b/interface/resources/qml/hifi/avatarPackager/AvatarPackagerApp.qml
index 278ce36362..9158e25f75 100644
--- a/interface/resources/qml/hifi/avatarPackager/AvatarPackagerApp.qml
+++ b/interface/resources/qml/hifi/avatarPackager/AvatarPackagerApp.qml
@@ -229,7 +229,7 @@ Item {
}
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() {
diff --git a/interface/resources/qml/hifi/avatarPackager/AvatarPackagerHeader.qml b/interface/resources/qml/hifi/avatarPackager/AvatarPackagerHeader.qml
index 31528a8557..edb862b023 100644
--- a/interface/resources/qml/hifi/avatarPackager/AvatarPackagerHeader.qml
+++ b/interface/resources/qml/hifi/avatarPackager/AvatarPackagerHeader.qml
@@ -128,6 +128,8 @@ ShadowRectangle {
}
}
+ // FIXME: Link to a Project Athena version of the video.
+ /*
RalewayButton {
id: video
visible: false
@@ -141,6 +143,12 @@ ShadowRectangle {
onClicked: videoButtonClicked()
}
+ */
+ // Temporary placeholder for video button.
+ Rectangle {
+ id: video
+ visible: false
+ }
RalewayButton {
id: docs
diff --git a/interface/resources/qml/hifi/avatarPackager/AvatarProject.qml b/interface/resources/qml/hifi/avatarPackager/AvatarProject.qml
index e5bffa7829..a0c98b0821 100644
--- a/interface/resources/qml/hifi/avatarPackager/AvatarProject.qml
+++ b/interface/resources/qml/hifi/avatarPackager/AvatarProject.qml
@@ -44,7 +44,11 @@ Item {
HifiControls.Button {
id: uploadButton
+ // FIXME: Re-enable if ability to upload to hosted location is added.
+ /*
visible: AvatarPackagerCore.currentAvatarProject && !AvatarPackagerCore.currentAvatarProject.fst.hasMarketplaceID && !root.hasSuccessfullyUploaded
+ */
+ visible: false
enabled: Account.loggedIn
anchors.verticalCenter: parent.verticalCenter
@@ -62,7 +66,11 @@ Item {
HifiControls.Button {
id: updateButton
+ // FIXME: Re-enable if ability to upload to hosted location is added.
+ /*
visible: AvatarPackagerCore.currentAvatarProject && AvatarPackagerCore.currentAvatarProject.fst.hasMarketplaceID && !root.hasSuccessfullyUploaded
+ */
+ visible: false
enabled: Account.loggedIn
anchors.verticalCenter: parent.verticalCenter
@@ -79,7 +87,12 @@ Item {
}
Item {
anchors.fill: parent
+
+ // FIXME: Re-enable if ability to upload to hosted location is added.
+ /*
visible: root.hasSuccessfullyUploaded
+ */
+ visible: false;
HifiControls.Button {
enabled: Account.loggedIn
@@ -115,6 +128,22 @@ Item {
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 {
@@ -263,13 +292,58 @@ Item {
color: 'white'
size: 20
- anchors.left: parent.left
- anchors.right: parent.right
+ anchors.horizontalCenter: parent.horizontalCenter
anchors.top: errorsGlyph.bottom
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, learn more."
+
+ 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: "View all errors"
+
+ onLinkActivated: {
+ avatarPackager.state = AvatarPackagerState.avatarDoctorErrorReport;
+ }
+ }
+
RalewayRegular {
id: infoMessage
@@ -297,60 +371,14 @@ Item {
anchors.left: parent.left
anchors.right: parent.right
- anchors.top: doctorStatusMessage.bottom
-
+ anchors.bottom: showFilesText.top
anchors.bottomMargin: 24
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."
- }
-
- 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, learn more."
-
- 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: "View all errors"
-
- onLinkActivated: {
- avatarPackager.state = AvatarPackagerState.avatarDoctorErrorReport;
- }
+ // 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."
}
HifiControls.Button {
@@ -389,8 +417,13 @@ Item {
Rectangle {
id: loginRequiredMessage
+ // FIXME: Re-enable if ability to upload to hosted location is added.
+ /*
visible: !Account.loggedIn
height: !Account.loggedIn ? loginRequiredTextRow.height + 20 : 0
+ */
+ visible: false
+ height: 0
anchors {
bottom: parent.bottom
diff --git a/interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml b/interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml
index 4d57d7074c..91e40aa608 100644
--- a/interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml
+++ b/interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml
@@ -53,18 +53,7 @@ Rectangle {
textFormat: Text.StyledText
linkColor: "#00B4EF"
color: "white"
- text: "www.highfidelity.com."
- size: 20
- onLinkActivated: {
- HiFiAbout.openUrl("https:/www.highfidelity.com");
- }
-
- }
- RalewayRegular {
- textFormat: Text.StyledText
- linkColor: "#00B4EF"
- color: "white"
- text: "HiFi Community Github."
+ text: "Project Athena Github."
size: 20
onLinkActivated: {
HiFiAbout.openUrl("https:/github.com/kasenvr/hifi-community");
diff --git a/interface/resources/qml/hifi/dialogs/security/EntityScriptWhitelist.qml b/interface/resources/qml/hifi/dialogs/security/EntityScriptQMLWhitelist.qml
similarity index 95%
rename from interface/resources/qml/hifi/dialogs/security/EntityScriptWhitelist.qml
rename to interface/resources/qml/hifi/dialogs/security/EntityScriptQMLWhitelist.qml
index e5c3c10176..aa30b5d014 100644
--- a/interface/resources/qml/hifi/dialogs/security/EntityScriptWhitelist.qml
+++ b/interface/resources/qml/hifi/dialogs/security/EntityScriptQMLWhitelist.qml
@@ -1,5 +1,5 @@
//
-// ScriptWhitelist.qml
+// EntityScriptQMLWhitelist.qml
// interface/resources/qml/hifi/dialogs/security
//
// Created by Kasen IO on 2019.12.05 | realities.dev | kasenvr@gmail.com
@@ -145,7 +145,9 @@ Rectangle {
https://google.com/
https://bing.com/
https://mydomain.here/
- \nEnsure there are no spaces or whitespace."
+ \nEnsure there are no spaces or whitespace.
+ \nFor QML files, you can only whitelist each file individually
+ ending with '.qml'."
// Text size
size: 16;
// Style
diff --git a/interface/resources/qml/hifi/tablet/TabletRoot.qml b/interface/resources/qml/hifi/tablet/TabletRoot.qml
index 6001497743..2fa08428ae 100644
--- a/interface/resources/qml/hifi/tablet/TabletRoot.qml
+++ b/interface/resources/qml/hifi/tablet/TabletRoot.qml
@@ -200,7 +200,7 @@ Rectangle {
id: eventBridgeConnection
target: eventBridge
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));
}
}
diff --git a/interface/resources/qml/hifi/tablet/WindowRoot.qml b/interface/resources/qml/hifi/tablet/WindowRoot.qml
index ef2df5e218..d888375db2 100644
--- a/interface/resources/qml/hifi/tablet/WindowRoot.qml
+++ b/interface/resources/qml/hifi/tablet/WindowRoot.qml
@@ -118,7 +118,7 @@ Windows.ScrollingWindow {
id: eventBridgeConnection
target: eventBridge
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));
}
}
diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index dd9a10a237..3994a574d7 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -1158,7 +1158,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/Graphik-SemiBold.ttf");
QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/Graphik-Regular.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
@@ -3202,10 +3202,30 @@ void Application::initializeUi() {
// Allow remote QML content from trusted sources ONLY
{
auto defaultUrlValidator = OffscreenQmlSurface::getUrlValidator();
- auto newValidator = [=](const QUrl& url)->bool {
- if (AUTHORIZED_EXTERNAL_QML_SOURCE.isParentOf(url)) {
- return true;
+ auto newValidator = [=](const QUrl& url) -> bool {
+ QString whitelistPrefix = "[WHITELIST ENTITY SCRIPTS]";
+ QList safeURLS = { "" };
+ safeURLS += qEnvironmentVariable("EXTRA_WHITELIST").trimmed().split(QRegExp("\\s*,\\s*"), QString::SkipEmptyParts);
+
+ // PULL SAFEURLS FROM INTERFACE.JSON Settings
+
+ QVariant raw = Setting::Handle("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);
};
OffscreenQmlSurface::setUrlValidator(newValidator);
@@ -7046,7 +7066,7 @@ void Application::updateWindowTitle() const {
auto accountManager = DependencyManager::get();
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"))
+ " " + applicationVersion();
diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp
index 9bc1dae56e..1be67ef188 100644
--- a/interface/src/Menu.cpp
+++ b/interface/src/Menu.cpp
@@ -288,13 +288,12 @@ Menu::Menu() {
});
// Settings > Entity Script Whitelist
- action = addActionToQMenuAndActionHash(settingsMenu, "Entity Script Whitelist");
+ action = addActionToQMenuAndActionHash(settingsMenu, "Entity Script / QML Whitelist");
connect(action, &QAction::triggered, [] {
auto tablet = DependencyManager::get()->getTablet("com.highfidelity.interface.tablet.system");
auto hmd = DependencyManager::get();
- DependencyManager::get()->clearCache();
- tablet->pushOntoStack("hifi/dialogs/security/EntityScriptWhitelist.qml");
+ tablet->pushOntoStack("hifi/dialogs/security/EntityScriptQMLWhitelist.qml");
if (!hmd->getShouldShowTablet()) {
hmd->toggleShouldShowTablet();
@@ -808,7 +807,7 @@ Menu::Menu() {
// Help > Report a Bug!
action = addActionToQMenuAndActionHash(helpMenu, "Report a Bug!");
connect(action, &QAction::triggered, qApp, [] {
- QDesktopServices::openUrl(QUrl("mailto:support@highfidelity.com"));
+ QDesktopServices::openUrl(QUrl("https://github.com/kasenvr/hifi-community/issues"));
});
}
diff --git a/interface/src/Menu.h b/interface/src/Menu.h
index 37b3f971fc..1d6c010a05 100644
--- a/interface/src/Menu.h
+++ b/interface/src/Menu.h
@@ -181,7 +181,7 @@ namespace MenuOption {
const QString RunningScripts = "Running Scripts...";
const QString RunTimingTests = "Run Timing Tests";
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 SelfieCamera = "Selfie";
const QString SendWrongDSConnectVersion = "Send wrong DS connect version";
diff --git a/interface/src/avatar/AvatarDoctor.cpp b/interface/src/avatar/AvatarDoctor.cpp
index 01a40e89fd..b0c82f1afc 100644
--- a/interface/src/avatar/AvatarDoctor.cpp
+++ b/interface/src/avatar/AvatarDoctor.cpp
@@ -55,7 +55,7 @@ static QStringList HAND_MAPPING_SUFFIXES = {
"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) :
_avatarFSTFileUrl(avatarFSTFileUrl) {
diff --git a/interface/src/avatar/AvatarProject.h b/interface/src/avatar/AvatarProject.h
index 0a63290051..4c1e55fa1c 100644
--- a/interface/src/avatar/AvatarProject.h
+++ b/interface/src/avatar/AvatarProject.h
@@ -95,7 +95,7 @@ public:
static bool isValidNewProjectName(const QString& projectPath, const QString& projectName);
static QString getDefaultProjectsPath() {
- return QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/High Fidelity Projects";
+ return QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/Project Athena Projects";
}
signals:
diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp
index 2522d0e4c6..76575ab8ef 100644
--- a/interface/src/avatar/MyAvatar.cpp
+++ b/interface/src/avatar/MyAvatar.cpp
@@ -3825,7 +3825,7 @@ void MyAvatar::updateActionMotor(float deltaTime) {
}
_actionMotorVelocity = motorSpeed * direction;
} else {
- _actionMotorVelocity = direction;
+ _actionMotorVelocity = sensorToWorldScale * direction;
}
float previousBoomLength = _boomLength;
diff --git a/libraries/render/src/render/CullTask.cpp b/libraries/render/src/render/CullTask.cpp
index f309d5a3bf..164d8e9f21 100644
--- a/libraries/render/src/render/CullTask.cpp
+++ b/libraries/render/src/render/CullTask.cpp
@@ -94,6 +94,10 @@ void FetchSpatialTree::configure(const Config& config) {
}
void FetchSpatialTree::run(const RenderContextPointer& renderContext, const Inputs& inputs, ItemSpatialTree::ItemSelection& outSelection) {
+ if (!renderContext){
+ return;
+ }
+
// start fresh
outSelection.clear();
@@ -106,6 +110,10 @@ void FetchSpatialTree::run(const RenderContextPointer& renderContext, const Inpu
RenderArgs* args = renderContext->args;
auto& scene = renderContext->_scene;
+ if (!args) {
+ return;
+ }
+
auto queryFrustum = args->getViewFrustum();
// Eventually use a frozen frustum
if (_freezeFrustum) {
diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp
index 482bde9fd4..de7fc488aa 100644
--- a/libraries/script-engine/src/ScriptEngine.cpp
+++ b/libraries/script-engine/src/ScriptEngine.cpp
@@ -85,9 +85,9 @@
#include "MIDIEvent.h"
#include "SettingHandle.h"
-// #include "SettingManager.h"
-// #include "SettingInterface.h"
-// #include "SettingHelpers.h"
+#include
+#include
+
const QString ScriptEngine::_SETTINGS_ENABLE_EXTENDED_EXCEPTIONS {
"com.highfidelity.experimental.enableExtendedJSExceptions"
@@ -2361,32 +2361,58 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co
} else if (testConstructor.isError()) {
exception = testConstructor;
}
- }
- else {
- // ENTITY SCRIPT WHITELIST STARTS HERE
+ } else {
+ // ENTITY SCRIPT WHITELIST STARTS HERE
+ auto nodeList = DependencyManager::get();
+ bool passList = false; // assume unsafe
QString whitelistPrefix = "[WHITELIST ENTITY SCRIPTS]";
- QList safeURLS = { "" };
- safeURLS += qEnvironmentVariable("EXTRA_WHITELIST").trimmed().split(QRegExp("\\s*,\\s*"), QString::SkipEmptyParts);
+ QList safeURLPrefixes = { "file:///", "atp:", "cache:" };
+ safeURLPrefixes += qEnvironmentVariable("EXTRA_WHITELIST").trimmed().split(QRegExp("\\s*,\\s*"), QString::SkipEmptyParts);
- // PULL SAFEURLS FROM INTERFACE.JSON Settings
+ // IF WHITELIST IS DISABLED IN SETTINGS
+ bool whitelistEnabled = Setting::Handle("private/whitelistEnabled", true).get();
+ if (!whitelistEnabled) {
+ passList = true;
+ }
+ // PULL SAFEURLS FROM INTERFACE.JSON Settings
QVariant raw = Setting::Handle("private/settingsSafeURLS").get();
QStringList settingsSafeURLS = raw.toString().trimmed().split(QRegExp("\\s*[,\r\n]+\\s*"), QString::SkipEmptyParts);
- safeURLS += settingsSafeURLS;
-
+ safeURLPrefixes += settingsSafeURLS;
// END PULL SAFEURLS FROM INTERFACE.JSON Settings
- bool isInWhitelist = false; // assume unsafe
- for (const auto& str : safeURLS) {
- qCDebug(scriptengine) << whitelistPrefix << "Script URL: " << scriptOrURL << "TESTING AGAINST" << str << "RESULTS IN"
- << scriptOrURL.startsWith(str);
- if (!str.isEmpty() && scriptOrURL.startsWith(str)) {
- isInWhitelist = true;
- qCDebug(scriptengine) << whitelistPrefix << "Script approved.";
- break; // bail early since we found a match
+ // GET CURRENT DOMAIN WHITELIST BYPASS, IN CASE AN ENTIRE DOMAIN IS WHITELISTED
+ QString currentDomain = DependencyManager::get()->getDomainURL().host();
+
+ QString domainSafeIP = nodeList->getDomainHandler().getHostname();
+ QString domainSafeURL = URL_SCHEME_HIFI + "://" + currentDomain;
+ for (const auto& str : safeURLPrefixes) {
+ if (domainSafeURL.startsWith(str) || domainSafeIP.startsWith(str)) {
+ qCDebug(scriptengine) << whitelistPrefix << "Whitelist Bypassed. Current Domain Host: "
+ << nodeList->getDomainHandler().getHostname()
+ << "Current Domain: " << currentDomain;
+ passList = true;
}
}
- if (!isInWhitelist) {
+ // END CURRENT DOMAIN WHITELIST BYPASS
+
+ // START CHECKING AGAINST THE WHITELIST
+ if (ScriptEngine::getContext() == "entity_server") { // If running on the server, do not engage whitelist.
+ passList = true;
+ } else if (!passList) { // If waved through, do not engage whitelist.
+ for (const auto& str : safeURLPrefixes) {
+ qCDebug(scriptengine) << whitelistPrefix << "Script URL: " << scriptOrURL << "TESTING AGAINST" << str << "RESULTS IN"
+ << scriptOrURL.startsWith(str);
+ if (!str.isEmpty() && scriptOrURL.startsWith(str)) {
+ passList = true;
+ qCDebug(scriptengine) << whitelistPrefix << "Script approved.";
+ break; // bail early since we found a match
+ }
+ }
+ }
+ // END CHECKING AGAINST THE WHITELIST
+
+ if (!passList) { // If the entity failed to pass for any reason, it's blocked and an error is thrown.
qCDebug(scriptengine) << whitelistPrefix << "(disabled entity script)" << entityID.toString() << scriptOrURL;
exception = makeError("UNSAFE_ENTITY_SCRIPTS == 0");
} else {
diff --git a/libraries/script-engine/src/WebSocketClass.cpp b/libraries/script-engine/src/WebSocketClass.cpp
index 56753f07d1..9a2a51e0b7 100644
--- a/libraries/script-engine/src/WebSocketClass.cpp
+++ b/libraries/script-engine/src/WebSocketClass.cpp
@@ -16,6 +16,8 @@
#include "ScriptEngine.h"
+#include "ScriptEngineLogging.h"
+
WebSocketClass::WebSocketClass(QScriptEngine* engine, QString url) :
_webSocket(new QWebSocket()),
_engine(engine)
@@ -34,10 +36,11 @@ WebSocketClass::WebSocketClass(QScriptEngine* engine, QWebSocket* qWebSocket) :
void WebSocketClass::initialize() {
connect(_webSocket, &QWebSocket::disconnected, this, &WebSocketClass::handleOnClose);
connect(_webSocket, &QWebSocket::textMessageReceived, this, &WebSocketClass::handleOnMessage);
+ connect(_webSocket, &QWebSocket::binaryMessageReceived, this, &WebSocketClass::handleOnBinaryMessage);
connect(_webSocket, &QWebSocket::connected, this, &WebSocketClass::handleOnOpen);
connect(_webSocket, static_cast(&QWebSocket::error), this,
&WebSocketClass::handleOnError);
- _binaryType = QStringLiteral("blob");
+ _binaryType = QStringLiteral("arraybuffer");
}
QScriptValue WebSocketClass::constructor(QScriptContext* context, QScriptEngine* engine) {
@@ -53,7 +56,12 @@ WebSocketClass::~WebSocketClass() {
}
void WebSocketClass::send(QScriptValue message) {
- _webSocket->sendTextMessage(message.toString());
+ if (message.isObject()) {
+ QByteArray ba = qscriptvalue_cast(message);
+ _webSocket->sendBinaryMessage(ba);
+ } else {
+ _webSocket->sendTextMessage(message.toString());
+ }
}
void WebSocketClass::close() {
@@ -97,6 +105,25 @@ void WebSocketClass::handleOnMessage(const QString& message) {
}
}
+void WebSocketClass::handleOnBinaryMessage(const QByteArray& message) {
+ if (_onMessageEvent.isFunction()) {
+ QScriptValueList args;
+ QScriptValue arg = _engine->newObject();
+ QScriptValue data = _engine->newVariant(QVariant::fromValue(message));
+ QScriptValue ctor = _engine->globalObject().property("ArrayBuffer");
+ auto array = qscriptvalue_cast(ctor.data());
+ QScriptValue arrayBuffer;
+ if (!array) {
+ qCWarning(scriptengine) << "WebSocketClass::handleOnBinaryMessage !ArrayBuffer";
+ } else {
+ arrayBuffer = _engine->newObject(array, data);
+ }
+ arg.setProperty("data", arrayBuffer);
+ args << arg;
+ _onMessageEvent.call(QScriptValue(), args);
+ }
+}
+
void WebSocketClass::handleOnOpen() {
if (_onOpenEvent.isFunction()) {
_onOpenEvent.call();
diff --git a/libraries/script-engine/src/WebSocketClass.h b/libraries/script-engine/src/WebSocketClass.h
index dbc9729c61..048ba4bc10 100644
--- a/libraries/script-engine/src/WebSocketClass.h
+++ b/libraries/script-engine/src/WebSocketClass.h
@@ -123,6 +123,7 @@ private slots:
void handleOnClose();
void handleOnError(QAbstractSocket::SocketError error);
void handleOnMessage(const QString& message);
+ void handleOnBinaryMessage(const QByteArray& message);
void handleOnOpen();
};
diff --git a/libraries/ui/src/VrMenu.cpp b/libraries/ui/src/VrMenu.cpp
index 12cb7e2e4b..867302d955 100644
--- a/libraries/ui/src/VrMenu.cpp
+++ b/libraries/ui/src/VrMenu.cpp
@@ -269,7 +269,11 @@ void VrMenu::insertAction(QAction* before, QAction* action) {
Q_ASSERT(invokeResult);
QObject* result = reinterpret_cast(returnedValue); // returnedValue.value();
Q_ASSERT(result);
- bindActionToQmlAction(result, action, _rootMenu);
+ if ( result ) {
+ bindActionToQmlAction(result, action, _rootMenu);
+ } else {
+ qWarning() << "Failed to find addItem() method in object " << menu << ". Not inserting action " << action;
+ }
}
class QQuickMenuBase;
diff --git a/plugins/openvr/src/OpenVrHelpers.cpp b/plugins/openvr/src/OpenVrHelpers.cpp
index 108431a8ac..ce60719d67 100644
--- a/plugins/openvr/src/OpenVrHelpers.cpp
+++ b/plugins/openvr/src/OpenVrHelpers.cpp
@@ -108,9 +108,11 @@ QString getVrSettingString(const char* section, const char* setting) {
return result;
}
+bool isHMDInErrorState = false;
+
vr::IVRSystem* acquireOpenVrSystem() {
bool hmdPresent = vr::VR_IsHmdPresent();
- if (hmdPresent) {
+ if (hmdPresent && !isHMDInErrorState) {
Lock lock(mutex);
if (!activeHmd) {
#if DEV_BUILD
@@ -122,6 +124,14 @@ vr::IVRSystem* acquireOpenVrSystem() {
#if DEV_BUILD
qCDebug(displayplugins) << "OpenVR display: HMD is " << activeHmd << " error is " << eError;
#endif
+
+ if (eError == vr::VRInitError_Init_HmdNotFound) {
+ isHMDInErrorState = true;
+ activeHmd = nullptr;
+ #if DEV_BUILD
+ qCDebug(displayplugins) << "OpenVR: No HMD connected, setting nullptr!";
+ #endif
+ }
}
if (activeHmd) {
#if DEV_BUILD
diff --git a/tools/jsdoc/api-mainpage.md b/tools/jsdoc/api-mainpage.md
index e1ec140af3..57a518dd81 100644
--- a/tools/jsdoc/api-mainpage.md
+++ b/tools/jsdoc/api-mainpage.md
@@ -1,4 +1,4 @@
-The High Fidelity JavaScript API lets content creators and developers create new experiences and transform virtual worlds within the High Fidelity metaverse. With it, you can build great content, customize avatars, play audio and so much more.
+The Project Athena JavaScript API lets content creators and developers create new experiences and transform virtual worlds within the High Fidelity metaverse. With it, you can build great content, customize avatars, play audio and so much more.
You are most likely to interact with these APIs:
@@ -6,4 +6,4 @@ You are most likely to interact with these APIs:
* The **[AvatarList](AvatarList.html)**, **[MyAvatar](MyAvatar.html)**, and **[Avatar](Avatar.html)** namespaces affect your personal avatars, and lets you get information on other people's avatars.
* The **[Script](Script.html)** namespace lets you to connect callbacks from your client to script, such as functionality that is dependent on time (`Script.update`, `Script.setTimeout`, `Script.setInterval`, etc), connect paths relatively to assets (`Script.resolvePath`), refer to other scripts (`Script.require`, `Script.include`), or connect functions to events which occur when the script is turned off (`Script.scriptEnding`).
-To learn more about using High Fidelity and exploring the metaverse, visit the [High Fidelity Documentation](https://docs.highfidelity.com).
\ No newline at end of file
+To learn more about using High Fidelity and exploring the metaverse, visit the [Project Athena Documentation](https://docs.projectathena.dev).
diff --git a/tools/jsdoc/hifi-jsdoc-template/publish.js b/tools/jsdoc/hifi-jsdoc-template/publish.js
index 7d0ded5a0b..1bafe0eec5 100644
--- a/tools/jsdoc/hifi-jsdoc-template/publish.js
+++ b/tools/jsdoc/hifi-jsdoc-template/publish.js
@@ -697,7 +697,7 @@ exports.publish = function(taffyData, opts, tutorials) {
var files = find({kind: 'file'});
var packages = find({kind: 'package'});
- generate('', 'High Fidelity API Reference',
+ generate('', 'Project Athena API Reference',
packages.concat(
[{kind: 'mainpage', readme: opts.readme, longname: (opts.mainpagetitle) ? opts.mainpagetitle : 'Main Page'}]
).concat(files),
diff --git a/tools/jsdoc/hifi-jsdoc-template/static/images/fav-icon.ico b/tools/jsdoc/hifi-jsdoc-template/static/images/fav-icon.ico
index 2bacaf1083..da7b47cbba 100644
Binary files a/tools/jsdoc/hifi-jsdoc-template/static/images/fav-icon.ico and b/tools/jsdoc/hifi-jsdoc-template/static/images/fav-icon.ico differ
diff --git a/tools/jsdoc/hifi-jsdoc-template/static/images/project-athena-logo.png b/tools/jsdoc/hifi-jsdoc-template/static/images/project-athena-logo.png
new file mode 100644
index 0000000000..cb36793c9b
Binary files /dev/null and b/tools/jsdoc/hifi-jsdoc-template/static/images/project-athena-logo.png differ
diff --git a/tools/jsdoc/hifi-jsdoc-template/static/images/white-logo.png b/tools/jsdoc/hifi-jsdoc-template/static/images/white-logo.png
deleted file mode 100644
index b23aa64e94..0000000000
Binary files a/tools/jsdoc/hifi-jsdoc-template/static/images/white-logo.png and /dev/null differ
diff --git a/tools/jsdoc/hifi-jsdoc-template/static/styles/jsdoc.css b/tools/jsdoc/hifi-jsdoc-template/static/styles/jsdoc.css
index dd67a4da20..c62f4ff626 100644
--- a/tools/jsdoc/hifi-jsdoc-template/static/styles/jsdoc.css
+++ b/tools/jsdoc/hifi-jsdoc-template/static/styles/jsdoc.css
@@ -67,6 +67,7 @@ h1
font-size: 3.25rem;
text-align: center;
margin: 50px 25px 25px;
+ line-height: 100%;
}
h2
diff --git a/tools/jsdoc/hifi-jsdoc-template/tmpl/layout.tmpl b/tools/jsdoc/hifi-jsdoc-template/tmpl/layout.tmpl
index 41a324fdaf..b9cc34ca09 100644
--- a/tools/jsdoc/hifi-jsdoc-template/tmpl/layout.tmpl
+++ b/tools/jsdoc/hifi-jsdoc-template/tmpl/layout.tmpl
@@ -12,15 +12,16 @@
+