diff --git a/BUILD.md b/BUILD.md index 4198c39d1a..00b17743e9 100644 --- a/BUILD.md +++ b/BUILD.md @@ -10,14 +10,11 @@ - [cmake](https://cmake.org/download/): 3.9 - [Qt](https://www.qt.io/download-open-source): 5.10.1 - [Python](https://www.python.org/downloads/): 3.6 or higher -- [OpenSSL](https://www.openssl.org/): Use the latest available 1.0 version (**NOT** 1.1) of OpenSSL to avoid security vulnerabilities. -- [VHACD](https://github.com/virneo/v-hacd)(clone this repository)(Optional) ### CMake External Project Dependencies These dependencies need not be installed manually. They are automatically downloaded on the platforms where they are required. - [Bullet Physics Engine](https://github.com/bulletphysics/bullet3/releases): 2.83 -- [GLEW](http://glew.sourceforge.net/): 1.13 - [glm](https://glm.g-truc.net/0.9.8/index.html): 0.9.8 - [Oculus SDK](https://developer.oculus.com/downloads/): 1.11 (Win32) / 0.5 (Mac) - [OpenVR](https://github.com/ValveSoftware/openvr): 1.0.6 (Win32 only) @@ -25,16 +22,15 @@ These dependencies need not be installed manually. They are automatically downlo - [QuaZip](https://sourceforge.net/projects/quazip/files/quazip/): 0.7.3 - [SDL2](https://www.libsdl.org/download-2.0.php): 2.0.3 - [Intel Threading Building Blocks](https://www.threadingbuildingblocks.org/): 4.3 -- [Sixense](http://sixense.com/): 071615 +- [vcpkg](https://github.com/highfidelity/vcpkg): +- [VHACD](https://github.com/virneo/v-hacd) - [zlib](http://www.zlib.net/): 1.28 (Win32 only) -- nVidia Texture Tools: 2.1 +- [nvtt](https://github.com/highfidelity/nvidia-texture-tools): 2.1.1 (customized) The above dependencies will be downloaded, built, linked and included automatically by CMake where we require them. The CMakeLists files that handle grabbing each of the following external dependencies can be found in the [cmake/externals folder](cmake/externals). The resulting downloads, source files and binaries will be placed in the `build/ext` folder in each of the subfolders for each external project. These are not placed in your normal build tree when doing an out of source build so that they do not need to be re-downloaded and re-compiled every time the CMake build folder is cleared. Should you want to force a re-download and re-compile of a specific external, you can simply remove that directory from the appropriate subfolder in `build/ext`. Should you want to force a re-download and re-compile of all externals, just remove the `build/ext` folder. -If you would like to use a specific install of a dependency instead of the version that would be grabbed as a CMake ExternalProject, you can pass -DUSE\_LOCAL\_$NAME=0 (where $NAME is the name of the subfolder in [cmake/externals](cmake/externals)) when you run CMake to tell it not to get that dependency as an external project. - #### CMake Hifi uses CMake to generate build files and project files for your platform. @@ -82,9 +78,22 @@ In the examples below the variable $NAME would be replaced by the name of the de * $NAME_ROOT_DIR - set this variable in your ENV * HIFI_LIB_DIR - set this variable in your ENV to your High Fidelity lib folder, should contain a folder '$name' - ### Optional Components +#### Build Options + +The following build options can be used when running CMake + +* BUILD_CLIENT +* BUILD_SERVER +* BUILD_TESTS +* BUILD_TOOLS + +#### Developer Build Options + +* USE_GLES +* DISABLE_UI + #### Devices You can support external input/output devices such as Leap Motion, MIDI, and more by adding each individual SDK in the visible building path. Refer to the readme file available in each device folder in [interface/external/](interface/external) for the detailed explanation of the requirements to use the device. diff --git a/CMakeLists.txt b/CMakeLists.txt index 6120e27b75..4e5dbe935a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,22 +7,36 @@ else() cmake_minimum_required(VERSION 3.2) endif() -# squelch the Policy CMP0074 warning without requiring an update to cmake 3.12. -if ((${CMAKE_MAJOR_VERSION} EQUAL 3 AND ${CMAKE_MINOR_VERSION} GREATER 11) OR ${CMAKE_MAJOR_VERSION} GREATER 3) - cmake_policy(SET CMP0074 NEW) +include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/macros/TargetPython.cmake") +target_python() + +if (HIFI_ANDROID ) + execute_process( + COMMAND ${HIFI_PYTHON_EXEC} ${CMAKE_CURRENT_SOURCE_DIR}/prebuild.py --android --build-root ${CMAKE_BINARY_DIR} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) +else() + execute_process( + COMMAND ${HIFI_PYTHON_EXEC} ${CMAKE_CURRENT_SOURCE_DIR}/prebuild.py --build-root ${CMAKE_BINARY_DIR} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + # squelch the Policy CMP0074 warning without requiring an update to cmake 3.12. + if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.12) + cmake_policy(SET CMP0074 NEW) + endif() endif() +if(NOT EXISTS "${CMAKE_BINARY_DIR}/vcpkg.cmake") + message(FATAL_ERROR "vcpkg configuration missing.") +endif() + +include("${CMAKE_BINARY_DIR}/vcpkg.cmake") project(hifi) - include("cmake/init.cmake") - include("cmake/compiler.cmake") -if (BUILD_SCRIBE_ONLY) - add_subdirectory(tools/scribe) - add_subdirectory(tools/shader_reflect) - return() -endif() +add_paths_to_fixup_libs(${VCPKG_INSTALL_ROOT}/bin) +add_paths_to_fixup_libs(${VCPKG_INSTALL_ROOT}/debug/bin) if (NOT DEFINED CLIENT_ONLY) set(CLIENT_ONLY 0) @@ -40,7 +54,8 @@ endif() set(BUILD_CLIENT_OPTION ON) set(BUILD_SERVER_OPTION ON) -set(BUILD_TESTS_OPTION ON) +set(BUILD_TESTS_OPTION OFF) +set(BUILD_MANUAL_TESTS_OPTION ${BUILD_TESTS_OPTION}) set(BUILD_TOOLS_OPTION ON) set(BUILD_INSTALLER_OPTION ON) set(GLES_OPTION OFF) @@ -77,6 +92,7 @@ endif() option(BUILD_CLIENT "Build client components" ${BUILD_CLIENT_OPTION}) option(BUILD_SERVER "Build server components" ${BUILD_SERVER_OPTION}) option(BUILD_TESTS "Build tests" ${BUILD_TESTS_OPTION}) +option(BUILD_MANUAL_TESTS "Build manual tests" ${BUILD_MANUAL_TESTS_OPTION}) option(BUILD_TOOLS "Build tools" ${BUILD_TOOLS_OPTION}) option(BUILD_INSTALLER "Build installer" ${BUILD_INSTALLER_OPTION}) option(USE_GLES "Use OpenGL ES" ${GLES_OPTION}) @@ -144,6 +160,8 @@ list(APPEND CMAKE_PREFIX_PATH "${QT_CMAKE_PREFIX_PATH}") find_package( Threads ) add_definitions(-DGLM_FORCE_RADIANS) +add_definitions(-DGLM_ENABLE_EXPERIMENTAL) +add_definitions(-DGLM_FORCE_CTOR_INIT) set(HIFI_LIBRARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libraries") set(EXTERNAL_PROJECT_PREFIX "project") @@ -191,7 +209,9 @@ if (BUILD_TESTS) include(CTest) enable_testing() add_subdirectory(tests) - add_subdirectory(tests-manual) + if (BUILD_MANUAL_TESTS) + add_subdirectory(tests-manual) + endif() endif() if (BUILD_INSTALLER) diff --git a/VCPKG.md b/VCPKG.md new file mode 100644 index 0000000000..c426dc618f --- /dev/null +++ b/VCPKG.md @@ -0,0 +1,75 @@ +[VCPKG](https://github.com/Microsoft/vcpkg) is an open source package management system created by Microsoft, intially just for Windows based system, but eventually extended to cover Linux and OSX as well, and in theory extensible enough to cover additional operating systems. + +VCPKG is now our primary mechanism for managing the external libraries and tools on which we rely to build our applications. + +Conventional usage of VCPKG involves cloning the repository, running the bootstrapping script to build the vcpkg binary, and then calling the binary to install a set of libraries. The libraries themselves are specified by a set of port files inside the [repository](https://github.com/Microsoft/vcpkg/tree/master/ports) + +Because the main VCPKG repository does not contain all the ports we want, and because we want to be able to manage the precise versions of our dependencies, rather than allow it to be outside of our control, instead of using the main vcpkg repository, we use a combination of a [fork](https://github.com/highfidelity/vcpkg) of the repository (which allows us to customize the vcpkg binary, currently necessary to deal with some out of date tools on our build hosts) and a set of [custom port files](./cmake/ports) stored in our own repository. + +## Adding new packages to vcpkg + +Note... Android vcpkg usage is still experimental. Contact Austin for more detailed information if you need to add a new package for use by Android. + +### Setup development environment + +In order to add new packages, you will need to set up an environment for testing. This assumes you already have the tools for normal Hifi development (git, cmake, a working C++ compiler, etc) + +* Clone our vcpkg [fork](https://github.com/highfidelity/vcpkg) +* Remove the ports directory from the checkout and symlink to our own [custom port files](./cmake/ports) +* Bootstrap the vcpkg binary with the `bootstrap-vcpkg.sh` or `bootstrap-vcpkg.bat` script + +### Add a new port skeleton + +Your new package will require, at minimum, a `CONTROL` file and a `portfile.cmake` file, located in a subdirectory of the ports folder. Assuming you're creating a new dependency named `foo` it should be located in `ports/foo` under the vcpkg directory. The `CONTROL` file will contain a small number of fields, such as the name, version, description and any other vcpkg ports on which you depend. The `portfile.cmake` is a CMake script that will instruct vcpkg how to build the packages. We'll cover that in more depth in a moment. For now, just create one and leave it blank. + +### Add a reference to your package to one or more of the hifi meta-packages + +We have three meta-packages used to do our building. When you modify one of these packages, make sure to bump the version number in the `CONTROL` file for the package + +#### hifi-deps + +This metapackage contains anything required for building the server or shared components. For instance, the `glm`, `tbb` and `zlib` packages are declared here because they're used everywhere, not just in our client application code. + +#### hifi-client-deps + +This metapackage contains anything required for building the client. For example, `sdl2` is listed here because it's required for our joystick input, but not for the server or shared components. Note that `hifi-client-deps` depends on `hifi-deps`, so you don't have to declare something twice if it's used in both he server and client. Just declare it in `hifi-deps` and it will still be includeded transitively. + +#### hifi-host-tools + +This metapackage contains anything we use to create executables that will then be used in the build process. The `hifi-deps` and `hifi-client-deps` packages are built for the target architecture, which may be different than the host architecture (for instance, when building for Android). The `hifi-host-tools` packages are always build for the host architecture, because they're tools that are intended to be run as part of the build process. Scribe for example is used at build time to generate shaders. Building an arm64 version of Scribe is useless because we need to run it on the host machine. + +Note that packages can appear in both the `hifi-host-tools` and one of the other metapackages, indicating that the package both contains a library which we will use at runtime, and a tool which we will use at build time. The `spirv-tools` package is an example. + +### Implement the portfile.cmake + +How the portfile is written depends on what kind of package you're working with. It's basically still a CMake script, but there are a number of [functions](https://vcpkg.readthedocs.io/en/latest/maintainers/portfile-functions/) available to make fetching and building packages easier. + +Typically there are three areas you need to deal with + +* Getting the source +* Building the source +* Installing the artifacts + +#### Getting sources + +Getting sources from github, gitlab or bitbucket is easy. There are special functions specifcially for those. See the [etc2comp portfile](./cmake/ports/etc2comp/portfile.cmake) for an example of fetching source via github. + +If the project isn't available that way, you can still use the [vcpkg_download_distfile](https://vcpkg.readthedocs.io/en/latest/maintainers/vcpkg_download_distfile/) function to explicitly download an archive and then use [vcpkg_extract_source_archive](https://vcpkg.readthedocs.io/en/latest/maintainers/vcpkg_extract_source_archive/) to unpack it. See the [zlib portfile](./cmake/ports/zlib/portfile.cmake) for an example there. + +#### Building + +If your package uses CMake, you'll be able to use the [vcpkg_configure_cmake](https://vcpkg.readthedocs.io/en/latest/maintainers/vcpkg_configure_cmake/) and [vcpkg_build_cmake](https://vcpkg.readthedocs.io/en/latest/maintainers/vcpkg_build_cmake/) commands to configure and build the package. If you're going to be relying on the CMake installation functionality, you can just call [vcpkg_install_cmake](https://vcpkg.readthedocs.io/en/latest/maintainers/vcpkg_install_cmake/), since it will implicitly run the build before the install. + +If your package is not binary, but doesn't use CMake, you're just going to have to figure it out. + +If your package is binary, then you can just skip this step + +#### Installing + +Once you've built the package, you need to install the artifacts in the target directory. Ideally, your package's CMake INSTALL commands will do the right thing. However, there are usually some things you have to do manually. Since VCPKG will build both the release and debug versions for all packages, you need to make sure if your package installed headers that you remove the _debug_ versions of these headers. This is typically done with the `file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)`. Additionally, if your package creates any standalone executables, you need to make sure they're installed in the destination `tools` directory, not the `bin` or `lib` directories, which are specifically for shared library binaries (like .so or .dll files) and link library files (like .a or .lib files) respectively. + +If you're dealing with a binary package, then you'll need to explicitly perform all the required copies from the location where you extracted the archive to the installation directory. An example of this is available in the [openssl-android portfile](./cmake/ports/openssl-android/portfile.cmake) + +### Commit and test + +Once you've tested building your new package locally, you'll need to commit and push the changes and additions to the portfiles you've made and then monitor the build hosts to verify that the new package successfully built on all the target environments. diff --git a/android/app/build.gradle b/android/app/build.gradle index 0136736dc3..c04bf37438 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -23,7 +23,6 @@ android { '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=c++_shared', '-DQT_CMAKE_PREFIX_PATH=' + HIFI_ANDROID_PRECOMPILED + '/qt/lib/cmake', - '-DNATIVE_SCRIBE=' + HIFI_ANDROID_PRECOMPILED + '/scribe' + EXEC_SUFFIX, '-DHIFI_ANDROID_PRECOMPILED=' + HIFI_ANDROID_PRECOMPILED, '-DRELEASE_NUMBER=' + RELEASE_NUMBER, '-DRELEASE_TYPE=' + RELEASE_TYPE, diff --git a/android/app/src/main/cpp/native.cpp b/android/app/src/main/cpp/native.cpp index c7bca428e9..760fdcb0b5 100644 --- a/android/app/src/main/cpp/native.cpp +++ b/android/app/src/main/cpp/native.cpp @@ -210,11 +210,13 @@ JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnDest JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeGotoUrl(JNIEnv* env, jobject obj, jstring url) { QAndroidJniObject jniUrl("java/lang/String", "(Ljava/lang/String;)V", url); DependencyManager::get()->loadSettings(jniUrl.toString()); + AndroidHelper::instance().muteMic(); } JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeGoToUser(JNIEnv* env, jobject obj, jstring username) { QAndroidJniObject jniUsername("java/lang/String", "(Ljava/lang/String;)V", username); DependencyManager::get()->goToUser(jniUsername.toString(), false); + AndroidHelper::instance().muteMic(); } JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnPause(JNIEnv* env, jobject obj) { diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/SettingsFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/SettingsFragment.java index cc23665e72..58b6638531 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/SettingsFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/SettingsFragment.java @@ -3,8 +3,8 @@ package io.highfidelity.hifiinterface.fragment; import android.content.SharedPreferences; import android.media.audiofx.AcousticEchoCanceler; import android.os.Bundle; -import android.preference.Preference; import android.preference.PreferenceFragment; +import android.preference.PreferenceManager; import android.support.annotation.Nullable; import io.highfidelity.hifiinterface.R; @@ -18,17 +18,23 @@ public class SettingsFragment extends PreferenceFragment implements SharedPrefer private final String HIFI_SETTINGS_AEC_KEY = "aec"; private final String PREFERENCE_KEY_AEC = "aec"; + private final boolean DEFAULT_AEC_ENABLED = true; + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); + boolean aecAvailable = AcousticEchoCanceler.isAvailable(); + PreferenceManager.setDefaultValues(getContext(), R.xml.settings, false); - if (!AcousticEchoCanceler.isAvailable()) { - getPreferenceScreen().getPreferenceManager().findPreference("aec").setEnabled(false); + if (!aecAvailable) { + findPreference(PREFERENCE_KEY_AEC).setEnabled(false); + updateHifiSetting(HIFI_SETTINGS_ANDROID_GROUP, HIFI_SETTINGS_AEC_KEY, false); } getPreferenceScreen().getSharedPreferences().edit().putBoolean(PREFERENCE_KEY_AEC, - getHifiSettingBoolean(HIFI_SETTINGS_ANDROID_GROUP, HIFI_SETTINGS_AEC_KEY, false)); + aecAvailable && getHifiSettingBoolean(HIFI_SETTINGS_ANDROID_GROUP, HIFI_SETTINGS_AEC_KEY, DEFAULT_AEC_ENABLED)).commit(); + } public static SettingsFragment newInstance() { @@ -46,15 +52,13 @@ public class SettingsFragment extends PreferenceFragment implements SharedPrefer public void onPause() { super.onPause(); getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); - } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - Preference pref = findPreference(key); switch (key) { - case "aec": - updateHifiSetting(HIFI_SETTINGS_ANDROID_GROUP, HIFI_SETTINGS_AEC_KEY, sharedPreferences.getBoolean(key, false)); + case PREFERENCE_KEY_AEC: + updateHifiSetting(HIFI_SETTINGS_ANDROID_GROUP, HIFI_SETTINGS_AEC_KEY, sharedPreferences.getBoolean(key, DEFAULT_AEC_ENABLED)); break; default: break; diff --git a/android/app/src/main/res/xml/settings.xml b/android/app/src/main/res/xml/settings.xml index 5ec47b1aff..934d34ba73 100644 --- a/android/app/src/main/res/xml/settings.xml +++ b/android/app/src/main/res/xml/settings.xml @@ -6,6 +6,7 @@ + android:summary="@string/acoustic_echo_cancellation" + android:defaultValue="true" /> \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index aafb96689e..e22c2d877f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -106,11 +106,6 @@ def packages = [ versionId: 'r5Zran.JSCtvrrB6Q4KaqfIoALPw3lYY', checksum: 'a8ee8584cf1ccd34766c7ddd9d5e5449', ], - glm: [ - file: 'glm-0.9.8.5-patched.tgz', - versionId: 'cskfMoJrFlAeqI3WPxemyO_Cxt7rT9EJ', - checksum: '067b5fe16b220b5b1a1039ba51b062ae', - ], gvr: [ file: 'gvrsdk_v1.101.0.tgz', versionId: 'nqBV_j81Uc31rC7bKIrlya_Hah4v3y5r', @@ -161,21 +156,6 @@ def packages = [ ] ] -def scribeLocalFile='scribe' + EXEC_SUFFIX -def scribeFile='scribe_linux_x86_64' -def scribeChecksum='4635c28192724281d2367ce9e94380ab' -def scribeVersion='mPAY_N846oZH1tPY1bwChB_hzqkiYyoC' - -if (Os.isFamily(Os.FAMILY_MAC)) { - scribeFile = 'scribe_osx_x86_64' - scribeChecksum='1ead61c285d265eba9a5ef91ae3b7c26' - scribeVersion='4TAXWdo9fviw60N2wUA8HNyQ9TabjZa3' -} else if (Os.isFamily(Os.FAMILY_WINDOWS)) { - scribeFile = 'scribe_win32_x86_64.exe' - scribeChecksum='9c29a62595daf4844f95f6744d568c15' - scribeVersion='DUoxjufeX8ZAIVRBKRczWTuZwT13enTv' -} - def options = [ files: new TreeSet(), features: new HashSet(), @@ -434,28 +414,6 @@ task copyDependencies(dependsOn: [ extractDependencies ]) { } } -task downloadScribe(type: Download) { - src baseUrl + scribeFile + '?versionId=' + scribeVersion - dest new File(baseFolder, scribeLocalFile) - onlyIfNewer true -} - -task verifyScribe (type: Verify, dependsOn: downloadScribe) { - src new File(baseFolder, scribeLocalFile); - checksum scribeChecksum -} - -task fixScribePermissions(type: Exec, dependsOn: verifyScribe) { - commandLine 'chmod', 'a+x', HIFI_ANDROID_PRECOMPILED + '/' + scribeLocalFile -} - -task setupScribe(dependsOn: [verifyScribe]) { } - -// On Windows, we don't need to set the executable bit, but on OSX and Unix we do -if (!Os.isFamily(Os.FAMILY_WINDOWS)) { - setupScribe.dependsOn fixScribePermissions -} - task extractGvrBinaries(dependsOn: extractDependencies) { doLast { def gvrLibFolder = new File(HIFI_ANDROID_PRECOMPILED, 'gvr/gvr-android-sdk-1.101.0/libraries'); @@ -542,7 +500,7 @@ task qtBundle { } } -task setupDependencies(dependsOn: [setupScribe, copyDependencies, extractGvrBinaries, qtBundle]) { } +task setupDependencies(dependsOn: [copyDependencies, extractGvrBinaries, qtBundle]) { } task cleanDependencies(type: Delete) { delete HIFI_ANDROID_PRECOMPILED diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index afd4047c68..d6f893c42e 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -89,7 +89,8 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : PacketType::NodeIgnoreRequest, PacketType::RadiusIgnoreRequest, PacketType::RequestsDomainListData, - PacketType::PerAvatarGainSet }, + PacketType::PerAvatarGainSet, + PacketType::AudioSoloRequest }, this, "queueAudioPacket"); // packets whose consequences are global should be processed on the main thread diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 7f0838d8a5..9a78ba31a2 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -13,7 +13,7 @@ #include -#include +#include #include #include @@ -98,6 +98,9 @@ int AudioMixerClientData::processPackets(ConcurrentAddedStreams& addedStreams) { case PacketType::RadiusIgnoreRequest: parseRadiusIgnoreRequest(packet, node); break; + case PacketType::AudioSoloRequest: + parseSoloRequest(packet, node); + break; default: Q_UNREACHABLE(); } @@ -295,6 +298,25 @@ void AudioMixerClientData::parseRadiusIgnoreRequest(QSharedPointer message, const SharedNodePointer& node) { + + uint8_t addToSolo; + message->readPrimitive(&addToSolo); + + while (message->getBytesLeftToRead()) { + // parse out the UUID being soloed from the packet + QUuid soloedUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); + + if (addToSolo) { + _soloedNodes.push_back(soloedUUID); + } else { + auto it = std::remove(std::begin(_soloedNodes), std::end(_soloedNodes), soloedUUID); + _soloedNodes.erase(it, std::end(_soloedNodes)); + } + } +} + AvatarAudioStream* AudioMixerClientData::getAvatarAudioStream() { auto it = std::find_if(_audioStreams.begin(), _audioStreams.end(), [](const SharedStreamPointer& stream){ return stream->getStreamIdentifier().isNull(); diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index 0a66a8164b..653749f619 100644 --- a/assignment-client/src/audio/AudioMixerClientData.h +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -65,6 +65,7 @@ public: void parsePerAvatarGainSet(ReceivedMessage& message, const SharedNodePointer& node); void parseNodeIgnoreRequest(QSharedPointer message, const SharedNodePointer& node); void parseRadiusIgnoreRequest(QSharedPointer message, const SharedNodePointer& node); + void parseSoloRequest(QSharedPointer message, const SharedNodePointer& node); // attempt to pop a frame from each audio stream, and return the number of streams from this client int checkBuffersBeforeFrameSend(); @@ -150,6 +151,9 @@ public: const Node::IgnoredNodeIDs& getIgnoringNodeIDs() const { return _ignoringNodeIDs; } + + const std::vector& getSoloedNodes() const { return _soloedNodes; } + bool getHasReceivedFirstMix() const { return _hasReceivedFirstMix; } void setHasReceivedFirstMix(bool hasReceivedFirstMix) { _hasReceivedFirstMix = hasReceivedFirstMix; } @@ -209,6 +213,8 @@ private: std::atomic_bool _isIgnoreRadiusEnabled { false }; + std::vector _soloedNodes; + bool _hasReceivedFirstMix { false }; }; diff --git a/assignment-client/src/audio/AudioMixerSlave.cpp b/assignment-client/src/audio/AudioMixerSlave.cpp index 57bada47f1..7a6ab9c3e2 100644 --- a/assignment-client/src/audio/AudioMixerSlave.cpp +++ b/assignment-client/src/audio/AudioMixerSlave.cpp @@ -272,6 +272,10 @@ bool shouldBeSkipped(MixableStream& stream, const Node& listener, return true; } + if (!listenerData.getSoloedNodes().empty()) { + return !contains(listenerData.getSoloedNodes(), stream.nodeStreamID.nodeID); + } + bool shouldCheckIgnoreBox = (listenerAudioStream.isIgnoreBoxEnabled() || stream.positionalStream->isIgnoreBoxEnabled()); if (shouldCheckIgnoreBox && @@ -310,6 +314,7 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) { memset(_mixSamples, 0, sizeof(_mixSamples)); bool isThrottling = _numToRetain != -1; + bool isSoloing = !listenerData->getSoloedNodes().empty(); auto& streams = listenerData->getStreams(); @@ -376,13 +381,14 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) { stream.approximateVolume = approximateVolume(stream, listenerAudioStream); } else { if (shouldBeSkipped(stream, *listener, *listenerAudioStream, *listenerData)) { - addStream(stream, *listenerAudioStream, 0.0f); + addStream(stream, *listenerAudioStream, 0.0f, isSoloing); streams.skipped.push_back(move(stream)); ++stats.activeToSkipped; return true; } - addStream(stream, *listenerAudioStream, listenerData->getMasterAvatarGain()); + addStream(stream, *listenerAudioStream, listenerData->getMasterAvatarGain(), + isSoloing); if (shouldBeInactive(stream)) { // To reduce artifacts we still call render to flush the HRTF for every silent @@ -417,7 +423,8 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) { return true; } - addStream(stream, *listenerAudioStream, listenerData->getMasterAvatarGain()); + addStream(stream, *listenerAudioStream, listenerData->getMasterAvatarGain(), + isSoloing); if (shouldBeInactive(stream)) { // To reduce artifacts we still call render to flush the HRTF for every silent @@ -484,7 +491,7 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) { void AudioMixerSlave::addStream(AudioMixerClientData::MixableStream& mixableStream, AvatarAudioStream& listeningNodeStream, - float masterListenerGain) { + float masterListenerGain, bool isSoloing) { ++stats.totalMixes; auto streamToAdd = mixableStream.positionalStream; @@ -495,9 +502,13 @@ void AudioMixerSlave::addStream(AudioMixerClientData::MixableStream& mixableStre glm::vec3 relativePosition = streamToAdd->getPosition() - listeningNodeStream.getPosition(); float distance = glm::max(glm::length(relativePosition), EPSILON); - float gain = computeGain(masterListenerGain, listeningNodeStream, *streamToAdd, relativePosition, distance, isEcho); float azimuth = isEcho ? 0.0f : computeAzimuth(listeningNodeStream, listeningNodeStream, relativePosition); + float gain = 1.0f; + if (!isSoloing) { + gain = computeGain(masterListenerGain, listeningNodeStream, *streamToAdd, relativePosition, distance, isEcho); + } + const int HRTF_DATASET_INDEX = 1; if (!streamToAdd->lastPopSucceeded()) { diff --git a/assignment-client/src/audio/AudioMixerSlave.h b/assignment-client/src/audio/AudioMixerSlave.h index 6566c839b8..3d979da1fc 100644 --- a/assignment-client/src/audio/AudioMixerSlave.h +++ b/assignment-client/src/audio/AudioMixerSlave.h @@ -57,7 +57,7 @@ private: bool prepareMix(const SharedNodePointer& listener); void addStream(AudioMixerClientData::MixableStream& mixableStream, AvatarAudioStream& listeningNodeStream, - float masterListenerGain); + float masterListenerGain, bool isSoloing); void updateHRTFParameters(AudioMixerClientData::MixableStream& mixableStream, AvatarAudioStream& listeningNodeStream, float masterListenerGain); diff --git a/cmake/externals/boostconfig/CMakeLists.txt b/cmake/externals/boostconfig/CMakeLists.txt deleted file mode 100644 index e33167b0ba..0000000000 --- a/cmake/externals/boostconfig/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -set(EXTERNAL_NAME boostconfig) -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) - -include(ExternalProject) -ExternalProject_Add( - ${EXTERNAL_NAME} - #URL https://github.com/boostorg/config/archive/boost-1.58.0.zip - URL https://public.highfidelity.com/dependencies/config-boost-1.58.0.zip - URL_MD5 42fa673bae2b7645a22736445e80eb8d - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - LOG_DOWNLOAD 1 -) - -ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) - -set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR}/include CACHE TYPE INTERNAL) - -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") diff --git a/cmake/externals/bullet/CMakeLists.txt b/cmake/externals/bullet/CMakeLists.txt deleted file mode 100644 index ffa1c67ce3..0000000000 --- a/cmake/externals/bullet/CMakeLists.txt +++ /dev/null @@ -1,85 +0,0 @@ -set(EXTERNAL_NAME bullet) - -if (WIN32) - set(PLATFORM_CMAKE_ARGS "-DUSE_MSVC_RUNTIME_LIBRARY_DLL=1") -else () - set(PLATFORM_CMAKE_ARGS "-DBUILD_SHARED_LIBS=1") - - if (ANDROID) - list(APPEND PLATFORM_CMAKE_ARGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" "-DANDROID_NATIVE_API_LEVEL=19") - elseif (APPLE) - list(APPEND PLATFORM_CMAKE_ARGS "-DCMAKE_INSTALL_NAME_DIR=/lib") - endif() -endif () - -include(ExternalProject) - -if (WIN32) - ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://public.highfidelity.com/dependencies/bullet-2.88.tgz - URL_MD5 0a6876607ebe83e227427215f15946fd - CMAKE_ARGS ${PLATFORM_CMAKE_ARGS} -DCMAKE_INSTALL_PREFIX:PATH= -DBUILD_EXTRAS=0 -DINSTALL_LIBS=1 -DBUILD_BULLET3=0 -DBUILD_OPENGL3_DEMOS=0 -DBUILD_BULLET2_DEMOS=0 -DBUILD_UNIT_TESTS=0 -DUSE_GLUT=0 -DUSE_DX11=0 - LOG_DOWNLOAD 1 - LOG_CONFIGURE 1 - LOG_BUILD 1 - BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build - ) -else () - ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://public.highfidelity.com/dependencies/bullet-2.88.tgz - URL_MD5 0a6876607ebe83e227427215f15946fd - CMAKE_ARGS ${PLATFORM_CMAKE_ARGS} -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX:PATH= -DBUILD_EXTRAS=0 -DINSTALL_LIBS=1 -DBUILD_BULLET3=0 -DBUILD_OPENGL3_DEMOS=0 -DBUILD_BULLET2_DEMOS=0 -DBUILD_UNIT_TESTS=0 -DUSE_GLUT=0 - LOG_DOWNLOAD 1 - LOG_CONFIGURE 1 - LOG_BUILD 1 - BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build - ) -endif () - -# Hide this external target (for ide users) -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") - -ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) - -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) - -set(BULLET_LIB_DIR "${INSTALL_DIR}/lib") - -if (APPLE OR UNIX OR ANDROID) - if (APPLE) - set(BULLET_LIB_EXT "dylib") - else () - set(BULLET_LIB_EXT "so") - endif () - - set(LIB_PREFIX "lib") -elseif (WIN32) - set(BULLET_LIB_EXT "lib") -endif () - -if (DEFINED BULLET_LIB_EXT) - set(_BULLET_LIB_PAIRS "DYNAMICS_LIBRARY\;BulletDynamics" "COLLISION_LIBRARY\;BulletCollision" "MATH_LIBRARY\;LinearMath" "SOFTBODY_LIBRARY\;BulletSoftBody") - - foreach(_LIB_PAIR ${_BULLET_LIB_PAIRS}) - list(GET _LIB_PAIR 0 _LIB_VAR_NAME) - list(GET _LIB_PAIR 1 _LIB_NAME) - - - - if (WIN32) - # on windows, we might end up with a library that ends with RelWithDebInfo if Visual Studio is building for that configuration - set(${EXTERNAL_NAME_UPPER}_${_LIB_VAR_NAME}_RELEASE "${BULLET_LIB_DIR}/${LIB_PREFIX}${_LIB_NAME}$<$:_RelWithDebugInfo>$<$:_MinsizeRel>.${BULLET_LIB_EXT}" CACHE FILEPATH "${_LIB_NAME} release library location") - - set(${EXTERNAL_NAME_UPPER}_${_LIB_VAR_NAME}_DEBUG ${BULLET_LIB_DIR}/${LIB_PREFIX}${_LIB_NAME}_Debug.${BULLET_LIB_EXT} CACHE FILEPATH "${_LIB_NAME} debug library location") - else () - set(${EXTERNAL_NAME_UPPER}_${_LIB_VAR_NAME}_RELEASE ${BULLET_LIB_DIR}/${LIB_PREFIX}${_LIB_NAME}.${BULLET_LIB_EXT} CACHE FILEPATH "${_LIB_NAME} release library location") - set(${EXTERNAL_NAME_UPPER}_${_LIB_VAR_NAME}_DEBUG "" CACHE FILEPATH "${_LIB_NAME} debug library location") - endif () - endforeach() -endif () - -if (DEFINED ${EXTERNAL_NAME_UPPER}_DYNAMICS_LIBRARY_RELEASE) - set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INSTALL_DIR}/include/bullet CACHE PATH "Path to bullet include directory") -endif () diff --git a/cmake/externals/draco/CMakeLists.txt b/cmake/externals/draco/CMakeLists.txt deleted file mode 100644 index 28a2177cbb..0000000000 --- a/cmake/externals/draco/CMakeLists.txt +++ /dev/null @@ -1,41 +0,0 @@ -set(EXTERNAL_NAME draco) - -if (ANDROID) - set(ANDROID_CMAKE_ARGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" "-DANDROID_NATIVE_API_LEVEL=19") -endif () - -if (APPLE) - set(EXTRA_CMAKE_FLAGS -DCMAKE_CXX_FLAGS=-stdlib=libc++ -DCMAKE_EXE_LINKER_FLAGS=-stdlib=libc++) -endif () - -include(ExternalProject) -ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://public.highfidelity.com/dependencies/draco-1.1.0.zip - URL_MD5 208f8b04c91d5f1c73d731a3ea37c5bb - CONFIGURE_COMMAND CMAKE_ARGS ${ANDROID_CMAKE_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=-$ ${EXTRA_CMAKE_FLAGS} - LOG_DOWNLOAD 1 - LOG_CONFIGURE 1 - LOG_BUILD 1 -) - -# Hide this external target (for ide users) -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") - -ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) -set(SUFFIXED_INSTALL_DIR "${INSTALL_DIR}-$") - -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) - -set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SUFFIXED_INSTALL_DIR}/include CACHE PATH "List of Draco include directories") - -if (UNIX) - set(LIB_PREFIX "lib") - set(LIB_EXT "a") -elseif (WIN32) - set(LIB_EXT "lib") -endif () - -set(${EXTERNAL_NAME_UPPER}_LIBRARY ${SUFFIXED_INSTALL_DIR}/lib/${LIB_PREFIX}draco.${LIB_EXT} CACHE FILEPATH "Path to Draco release library") -set(${EXTERNAL_NAME_UPPER}_ENCODER_LIBRARY ${SUFFIXED_INSTALL_DIR}/lib/${LIB_PREFIX}dracoenc.${LIB_EXT} CACHE FILEPATH "Path to Draco encoder release library") -set(${EXTERNAL_NAME_UPPER}_DECODER_LIBRARY ${SUFFIXED_INSTALL_DIR}/lib/${LIB_PREFIX}dracodec.${LIB_EXT} CACHE FILEPATH "Path to Draco decoder release library") diff --git a/cmake/externals/etc2comp/CMakeLists.txt b/cmake/externals/etc2comp/CMakeLists.txt deleted file mode 100644 index 88ed988873..0000000000 --- a/cmake/externals/etc2comp/CMakeLists.txt +++ /dev/null @@ -1,58 +0,0 @@ -set(EXTERNAL_NAME etc2comp) - -if (ANDROID) - set(ANDROID_CMAKE_ARGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" "-DANDROID_NATIVE_API_LEVEL=19") -endif () - -if (APPLE) - set(EXTRA_CMAKE_FLAGS -DCMAKE_CXX_FLAGS=-stdlib=libc++ -DCMAKE_EXE_LINKER_FLAGS=-stdlib=libc++) -endif () - -include(ExternalProject) -# We use a patched version of etc2comp that properly generates all the necessary mips -# See https://github.com/google/etc2comp/pull/29 -# We also use part of https://github.com/google/etc2comp/pull/1, which fixes a bug -# that would override CMAKE_CXX_FLAGS -ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://public.highfidelity.com/dependencies/etc2comp-patched.zip - URL_MD5 4c96153eb179acbe619e3d99d3330595 - CMAKE_ARGS ${ANDROID_CMAKE_ARGS} ${EXTRA_CMAKE_FLAGS} - BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build - INSTALL_COMMAND "" - LOG_DOWNLOAD 1 - LOG_CONFIGURE 1 - LOG_BUILD 1 -) - -# Hide this external target (for ide users) -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") - -ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) -ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) - -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) - -if (WIN32 OR APPLE) - if (WIN32) - set(_LIB_FILE "EtcLib.lib") - else () - set(_LIB_FILE "libEtcLib.a") - endif () - - set(${EXTERNAL_NAME_UPPER}_LIBRARY_DEBUG ${INSTALL_DIR}/build/EtcLib/Debug/${_LIB_FILE} CACHE FILEPATH "Path to Etc2Comp debug library") - - # use generator expression to ensure the correct library is found when building different configurations in VS - set(_LIB_FOLDER "$<$:build/EtcLib/RelWithDebInfo>") - set(_LIB_FOLDER "${_LIB_FOLDER}$<$:build/EtcLib/MinSizeRel>") - set(_LIB_FOLDER "${_LIB_FOLDER}$<$,$>:build/EtcLib/Release>") - set(${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE ${INSTALL_DIR}/${_LIB_FOLDER}/${_LIB_FILE} CACHE FILEPATH "Path to Etc2Comp release library") -else () - set(${EXTERNAL_NAME_UPPER}_LIBRARY_DEBUG "" CACHE FILEPATH "Path to EtcLib debug library") - set(${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE ${INSTALL_DIR}/build/EtcLib/libEtcLib.a CACHE FILEPATH "Path to EtcLib release library") - -endif () - -set(ETC_INCLUDE_DIR ${SOURCE_DIR}/EtcLib/Etc CACHE FILEPATH "Path to Etc2Comp/Etc include directory") -set(ETCCODEC_INCLUDE_DIR ${SOURCE_DIR}/EtcLib/EtcCodec CACHE FILEPATH "Path to Etc2Comp/EtcCodec include directory") -# ETC2COMP_INCLUDE_DIRS will be set later by FindEtc2Comp diff --git a/cmake/externals/gli/CMakeLists.txt b/cmake/externals/gli/CMakeLists.txt deleted file mode 100644 index bde31cbede..0000000000 --- a/cmake/externals/gli/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -set(EXTERNAL_NAME gli) - -include(ExternalProject) -ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://public.highfidelity.com/dependencies/gli-0.8.1.0.zip - URL_MD5 00c990f59c12bbf367956ef399d6f798 - BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - LOG_DOWNLOAD 1 -) - -# Hide this external target (for ide users) -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") - -ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) - -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) -set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR} CACHE PATH "List of gli include directories") \ No newline at end of file diff --git a/cmake/externals/glm/CMakeLists.txt b/cmake/externals/glm/CMakeLists.txt deleted file mode 100644 index a52ddde9f5..0000000000 --- a/cmake/externals/glm/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -set(EXTERNAL_NAME glm) - -include(ExternalProject) -ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://public.highfidelity.com/dependencies/glm-0.9.8.5-patched.zip - URL_MD5 7d39ecc1cea275427534c3cfd6dd63f0 - BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= ${EXTERNAL_ARGS} - LOG_DOWNLOAD 1 - LOG_CONFIGURE 1 - LOG_BUILD 1 -) - -# Hide this external target (for ide users) -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") - -ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) - -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) -set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${INSTALL_DIR}/include CACHE PATH "List of glm include directories") diff --git a/cmake/externals/glslang/CMakeLists.txt b/cmake/externals/glslang/CMakeLists.txt deleted file mode 100644 index 4f8a6edf0d..0000000000 --- a/cmake/externals/glslang/CMakeLists.txt +++ /dev/null @@ -1,42 +0,0 @@ -set(EXTERNAL_NAME glslang) -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) - -include(ExternalProject) - -ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://github.com/KhronosGroup/glslang/archive/7.8.2853.zip - URL_MD5 4f93e3818528176c622c137fba05cbf8 - CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=-$ - LOG_DOWNLOAD 1 - LOG_CONFIGURE 1 - LOG_BUILD 1 -) - -# Hide this external target (for ide users) -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") - -# includes -ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) -set(SUFFIXED_INSTALL_DIR "${INSTALL_DIR}-$") - -list(APPEND INCLUDE_DIRS ${SUFFIXED_INSTALL_DIR}/include) -#list(APPEND INCLUDE_DIRS ${INSTALL_DIR}/include) -set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INCLUDE_DIRS} CACHE PATH "List of glslang include directories") -set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${${EXTERNAL_NAME_UPPER}_INCLUDE_DIR} CACHE PATH "List of glslang include directories") - - -set(LIB_DIR ${SUFFIXED_INSTALL_DIR}/lib) -list(APPEND LIB_NAMES glslang HLSL OGLCompiler OSDependent SPIRV SPVRemapper) -include(SelectLibraryConfigurations) - -foreach(BASE_LIB ${LIB_NAMES}) - string(TOUPPER ${BASE_LIB} BASE_LIB_UPPER) - list(APPEND ${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE "${LIB_DIR}/${BASE_LIB}.lib") - list(APPEND ${EXTERNAL_NAME_UPPER}_LIBRARY_DEBUG "${LIB_DIR}/${BASE_LIB}d.lib") -endforeach() - -select_library_configurations(${EXTERNAL_NAME_UPPER}) - -set(${EXTERNAL_NAME_UPPER}_LIBRARY ${${EXTERNAL_NAME_UPPER}_LIBRARY} CACHE FILEPATH "Location of glslang libraries") -set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${${EXTERNAL_NAME_UPPER}_LIBRARIES} CACHE FILEPATH "Location of glslang libraries") diff --git a/cmake/externals/json/CMakeLists.txt b/cmake/externals/json/CMakeLists.txt deleted file mode 100644 index 91bdb09fc8..0000000000 --- a/cmake/externals/json/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -set(EXTERNAL_NAME json) - -include(ExternalProject) -ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://hifi-public.s3.amazonaws.com/dependencies/json_3.1.2.zip - URL_MD5 94dbf6ea25a7569ddc0ab6e20862cf16 - BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= ${EXTERNAL_ARGS} - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - LOG_DOWNLOAD 1 -) - -# Hide this external target (for ide users) -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") - -ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) - -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) -set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR} CACHE PATH "List of json include directories") diff --git a/cmake/externals/nvtt/CMakeLists.txt b/cmake/externals/nvtt/CMakeLists.txt deleted file mode 100644 index 2db8335cd7..0000000000 --- a/cmake/externals/nvtt/CMakeLists.txt +++ /dev/null @@ -1,87 +0,0 @@ -include(ExternalProject) -include(SelectLibraryConfigurations) - -set(EXTERNAL_NAME nvtt) - -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) - -if (WIN32) - ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://public.highfidelity.com/dependencies/nvtt-win-2.1.0.hifi.zip - URL_MD5 10da01cf601f88f6dc12a6bc13c89136 - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - LOG_DOWNLOAD 1 - ) - - ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) - - set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR}/include CACHE PATH "Location of NVTT include directory") - set(${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE ${SOURCE_DIR}/Release/x64/nvtt.lib CACHE FILEPATH "Path to NVTT release library") - set(${EXTERNAL_NAME_UPPER}_DLL_PATH "${SOURCE_DIR}/Release>/x64" CACHE PATH "Location of NVTT release DLL") -else () - - if (ANDROID) - set(ANDROID_CMAKE_ARGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" "-DANDROID_NATIVE_API_LEVEL=19") - endif () - - ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://public.highfidelity.com/dependencies/nvidia-texture-tools-2.1.0.hifi-83462e4.zip - URL_MD5 602776e08515b54bfa1b8dc455003f0f - CONFIGURE_COMMAND CMAKE_ARGS ${ANDROID_CMAKE_ARGS} -DNVTT_SHARED=1 -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_POSITION_INDEPENDENT_CODE=ON - LOG_DOWNLOAD 1 - LOG_CONFIGURE 1 - LOG_BUILD 1 - ) - - ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) - - set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${INSTALL_DIR}/include CACHE PATH "Location of NVTT include directory") - - if (APPLE) - set(_LIB_EXT "dylib") - else () - set(_LIB_EXT "so") - endif () - - set(${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE ${INSTALL_DIR}/lib/libnvtt.${_LIB_EXT} CACHE FILEPATH "Path to NVTT library") - - if (APPLE) - # on OS X we have to use install_name_tool to fix the paths found in the NVTT shared libraries - # so that they can be found and linked during the linking phase - set(_NVTT_LIB_DIR "${INSTALL_DIR}/lib") - - # first fix the install names of all present libraries - ExternalProject_Add_Step( - ${EXTERNAL_NAME} - change-install-name - COMMENT "Calling install_name_tool on NVTT libraries to fix install name for dylib linking" - COMMAND ${CMAKE_COMMAND} -DINSTALL_NAME_LIBRARY_DIR=${_NVTT_LIB_DIR} -P ${EXTERNAL_PROJECT_DIR}/OSXInstallNameChange.cmake - DEPENDEES install - WORKING_DIRECTORY - LOG 1 - ) - - # then, for the main library (libnvtt) fix the paths to the dependency libraries (core, image, math) - ExternalProject_Add_Step( - ${EXTERNAL_NAME} - change-dependency-paths - COMMENT "Calling install_name_tool on NVTT libraries to fix paths for dependency libraries" - COMMAND install_name_tool -change libnvimage.dylib ${INSTALL_DIR}/lib/libnvimage.dylib libnvtt.dylib - COMMAND install_name_tool -change libnvcore.dylib ${INSTALL_DIR}/lib/libnvcore.dylib libnvtt.dylib - COMMAND install_name_tool -change libnvmath.dylib ${INSTALL_DIR}/lib/libnvmath.dylib libnvtt.dylib - COMMAND install_name_tool -change libnvcore.dylib ${INSTALL_DIR}/lib/libnvcore.dylib libnvimage.dylib - COMMAND install_name_tool -change libnvmath.dylib ${INSTALL_DIR}/lib/libnvmath.dylib libnvimage.dylib - COMMAND install_name_tool -change libnvcore.dylib ${INSTALL_DIR}/lib/libnvcore.dylib libnvmath.dylib - DEPENDEES install - WORKING_DIRECTORY /lib - LOG 1 - ) - endif () -endif () - -# Hide this external target (for IDE users) -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") diff --git a/cmake/externals/openvr/CMakeLists.txt b/cmake/externals/openvr/CMakeLists.txt deleted file mode 100644 index 05dfe70ed7..0000000000 --- a/cmake/externals/openvr/CMakeLists.txt +++ /dev/null @@ -1,49 +0,0 @@ -include(ExternalProject) -include(SelectLibraryConfigurations) - -set(EXTERNAL_NAME OpenVR) - -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) - -ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://public.highfidelity.com/dependencies/openvr-1.0.6.zip - URL_MD5 f6892cd3a3078f505d03b4297f5a1951 - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - LOG_DOWNLOAD 1 -) - -# Hide this external target (for ide users) -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") - -ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) - -set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR}/headers CACHE TYPE INTERNAL) - -if (WIN32) - - # FIXME need to account for different architectures - if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") - set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${SOURCE_DIR}/lib/win64/openvr_api.lib CACHE TYPE INTERNAL) - add_paths_to_fixup_libs(${SOURCE_DIR}/bin/win64) - else() - set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${SOURCE_DIR}/lib/win32/openvr_api.lib CACHE TYPE INTERNAL) - add_paths_to_fixup_libs(${SOURCE_DIR}/bin/win32) - endif() - -elseif(APPLE) - - # FIXME need to account for different architectures - set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${SOURCE_DIR}/lib/osx32/libopenvr_api.dylib CACHE TYPE INTERNAL) - add_paths_to_fixup_libs(${SOURCE_DIR}/bin/osx32) - -elseif(NOT ANDROID) - - # FIXME need to account for different architectures - set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${SOURCE_DIR}/lib/linux64/libopenvr_api.so CACHE TYPE INTERNAL) - add_paths_to_fixup_libs(${SOURCE_DIR}/bin/linux64) - -endif() - diff --git a/cmake/externals/quazip/CMakeLists.txt b/cmake/externals/quazip/CMakeLists.txt index 7a13720f35..f99d995a0c 100644 --- a/cmake/externals/quazip/CMakeLists.txt +++ b/cmake/externals/quazip/CMakeLists.txt @@ -3,7 +3,14 @@ string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) include(ExternalProject) -set(QUAZIP_CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_PREFIX_PATH=${QT_CMAKE_PREFIX_PATH} -DCMAKE_INSTALL_NAME_DIR:PATH=/lib -DZLIB_ROOT=${ZLIB_ROOT} -DCMAKE_POSITION_INDEPENDENT_CODE=ON) +set(QUAZIP_CMAKE_ARGS + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_INSTALL_PREFIX:PATH= + -DCMAKE_PREFIX_PATH=${QT_CMAKE_PREFIX_PATH} + -DCMAKE_INSTALL_NAME_DIR:PATH=/lib + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + -DZLIB_ROOT=${VCPKG_INSTALL_ROOT} + -DCMAKE_POSITION_INDEPENDENT_CODE=ON) if (NOT APPLE) set(QUAZIP_CMAKE_ARGS ${QUAZIP_CMAKE_ARGS} -DCMAKE_CXX_STANDARD=11) @@ -20,10 +27,6 @@ ExternalProject_Add( LOG_BUILD 1 ) -if (WIN32) - add_dependencies(quazip zlib) -endif () - # Hide this external target (for ide users) set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals" diff --git a/cmake/externals/sdl2/CMakeLists.txt b/cmake/externals/sdl2/CMakeLists.txt deleted file mode 100644 index 1e8e690743..0000000000 --- a/cmake/externals/sdl2/CMakeLists.txt +++ /dev/null @@ -1,90 +0,0 @@ -set(EXTERNAL_NAME sdl2) - -include(ExternalProject) - -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) - -if (WIN32) - ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://public.highfidelity.com/dependencies/SDL2-devel-2.0.3-VC.zip - URL_MD5 30a333bcbe94bc5016e8799c73e86233 - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - LOG_DOWNLOAD 1 - ) -elseif (APPLE) - - ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://public.highfidelity.com/dependencies/SDL2-2.0.3.zip - URL_MD5 55f1eae5142d20db11c844d8d4d6deed - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= -DVIDEO_OPENGL=OFF - BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build - LOG_DOWNLOAD 1 - LOG_CONFIGURE 1 - LOG_BUILD 1 - ) - - ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) - set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INSTALL_DIR}/include/SDL2 CACHE PATH "Location of SDL2 include directory") - set(${EXTERNAL_NAME_UPPER}_LIBRARY "${INSTALL_DIR}/lib/libSDL2-2.0.dylib" CACHE STRING "Path to SDL2 library") - - set(_SDL2_LIB_DIR "${INSTALL_DIR}/lib") - - ExternalProject_Add_Step( - ${EXTERNAL_NAME} - change-install-name - COMMENT "Calling install_name_tool on SDL2 libraries to fix install name for dylib linking" - COMMAND ${CMAKE_COMMAND} -DINSTALL_NAME_LIBRARY_DIR=${_SDL2_LIB_DIR} -P ${EXTERNAL_PROJECT_DIR}/OSXInstallNameChange.cmake - DEPENDEES install - WORKING_DIRECTORY - LOG 1 - ) - -else () - if (ANDROID) - set(ANDROID_CMAKE_ARGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" "-DANDROID_NATIVE_API_LEVEL=19") - endif () - - ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://public.highfidelity.com/dependencies/SDL2-2.0.3.tar.gz - URL_MD5 fe6c61d2e9df9ef570e7e80c6e822537 - CMAKE_ARGS ${ANDROID_CMAKE_ARGS} -DCMAKE_INSTALL_PREFIX:PATH= - LOG_DOWNLOAD 1 - LOG_CONFIGURE 1 - LOG_BUILD 1 - ) -endif () - -# Hide this external target (for ide users) -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") - -if (APPLE) - -# NOOP - -elseif (WIN32) - - ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) - set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${SOURCE_DIR}/include CACHE PATH "Location of SDL2 include directory") - - if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") - set(${EXTERNAL_NAME_UPPER}_LIBRARY_TEMP ${SOURCE_DIR}/lib/x64/SDL2.lib CACHE FILEPATH "Path to SDL2 library") - set(${EXTERNAL_NAME_UPPER}_DLL_PATH ${SOURCE_DIR}/lib/x64 CACHE PATH "Location of SDL2 DLL") - else() - set(${EXTERNAL_NAME_UPPER}_LIBRARY_TEMP ${SOURCE_DIR}/lib/x86/SDL2.lib CACHE FILEPATH "Path to SDL2 library") - set(${EXTERNAL_NAME_UPPER}_DLL_PATH ${SOURCE_DIR}/lib/x86 CACHE PATH "Location of SDL2 DLL") - endif() - - add_paths_to_fixup_libs(${${EXTERNAL_NAME_UPPER}_DLL_PATH}) - -else () - - ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) - set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INSTALL_DIR}/include/SDL2 CACHE PATH "Location of SDL2 include directory") - set(${EXTERNAL_NAME_UPPER}_LIBRARY_TEMP ${INSTALL_DIR}/lib/libSDL2.so CACHE FILEPATH "Path to SDL2 library") - -endif () diff --git a/cmake/externals/spirv_binaries/CMakeLists.txt b/cmake/externals/spirv_binaries/CMakeLists.txt deleted file mode 100644 index d422eb9f16..0000000000 --- a/cmake/externals/spirv_binaries/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -set(EXTERNAL_NAME spirv_binaries) -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) - -include(ExternalProject) -if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") - set(DOWNLOAD_URL https://public.highfidelity.com/dependencies/vulkan/vulkansdk-win32-1.1.82.1.tar.gz) - set(DOWNLOAD_MD5 3a83ef490bce248b1a4d6726a3e5893e) - set(BIN_DIR "Bin") -elseif (CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin") - set(DOWNLOAD_URL https://public.highfidelity.com/dependencies/vulkan/vulkansdk-macos-1.1.82.1.tar.gz) - set(DOWNLOAD_MD5 a57d37275b2c5db023ba8e84a63461ff) - set(BIN_DIR "macOS/bin") -else () - set(DOWNLOAD_URL https://public.highfidelity.com/dependencies/vulkan/vulkansdk-linux-x86_64-1.1.82.1.tar.gz) - set(DOWNLOAD_MD5 5a7c9eeda8cee6b36724da7f7cbe5ec6) - set(BIN_DIR "x86_64/bin") -endif () - -ExternalProject_Add( - ${EXTERNAL_NAME} - URL ${DOWNLOAD_URL} - URL_MD5 ${DOWNLOAD_MD5} - BUILD_COMMAND "" - CONFIGURE_COMMAND "" - INSTALL_COMMAND "" - LOG_DOWNLOAD ON -) - -# Hide this external target (for ide users) -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") -ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) - -set(${EXTERNAL_NAME_UPPER}_DIR "${SOURCE_DIR}/${BIN_DIR}" CACHE FILEPATH "SPIRV binary tools location") - diff --git a/cmake/externals/spirv_cross/CMakeLists.txt b/cmake/externals/spirv_cross/CMakeLists.txt deleted file mode 100644 index eaa7e4ffa1..0000000000 --- a/cmake/externals/spirv_cross/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -set(EXTERNAL_NAME spirv_cross) - -include(ExternalProject) -ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://github.com/KhronosGroup/SPIRV-Cross/archive/2018-08-07.zip - URL_MD5 11198e4dc6a815ffbdb7a0a56d2d9261 - CONFIGURE_COMMAND CMAKE_ARGS ${ANDROID_CMAKE_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=-$ ${EXTRA_CMAKE_FLAGS} - LOG_DOWNLOAD 1 - LOG_CONFIGURE 1 - LOG_BUILD 1 -) - -# Hide this external target (for ide users) -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") - -ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) -set(SUFFIXED_INSTALL_DIR "${INSTALL_DIR}-$") - -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) - -set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SUFFIXED_INSTALL_DIR}/include CACHE PATH "List of Draco include directories") - -if (UNIX) - set(LIB_PREFIX "lib") - set(LIB_EXT "a") -elseif (WIN32) - set(LIB_EXT "lib") -endif () - -foreach(lib glsl msl cpp hlsl reflect util core) - list(APPEND ${EXTERNAL_NAME_UPPER}_LIBRARIES ${SUFFIXED_INSTALL_DIR}/lib/spirv-cross-${lib}.${LIB_EXT}) -endforeach() - -set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${${EXTERNAL_NAME_UPPER}_LIBRARIES} CACHE FILEPATH "Path to SPIRV-Cross libraries") diff --git a/cmake/externals/spirv_headers/CMakeLists.txt b/cmake/externals/spirv_headers/CMakeLists.txt deleted file mode 100644 index 9613f97991..0000000000 --- a/cmake/externals/spirv_headers/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -set(EXTERNAL_NAME spirv_headers) -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) - -include(ExternalProject) -ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://github.com/KhronosGroup/SPIRV-Headers/archive/2c512180ca03b5d4f56283efc85745775b45fdc4.zip - URL_MD5 83e652221b5f21d5fdb61c45f5b4d9f9 - CONFIGURE_COMMAND CMAKE_ARGS ${ANDROID_CMAKE_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH= ${EXTRA_CMAKE_FLAGS} - LOG_DOWNLOAD 1 - LOG_CONFIGURE 1 - LOG_BUILD 1 -) - -# Hide this external target (for ide users) -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") -ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) -set(${EXTERNAL_NAME_UPPER}_ROOT ${INSTALL_DIR} CACHE PATH "List of include directories") diff --git a/cmake/externals/spirv_tools/CMakeLists.txt b/cmake/externals/spirv_tools/CMakeLists.txt deleted file mode 100644 index a58d72502e..0000000000 --- a/cmake/externals/spirv_tools/CMakeLists.txt +++ /dev/null @@ -1,33 +0,0 @@ -set(EXTERNAL_NAME spirv_tools) -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) - -include(ExternalProject) -ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://github.com/KhronosGroup/SPIRV-Tools/archive/v2018.4.zip - URL_MD5 7a7c69cf6ff0318910b4bfbdf30bcfc9 - CONFIGURE_COMMAND CMAKE_ARGS ${ANDROID_CMAKE_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DSPIRV-Headers_SOURCE_DIR=${SPIRV_HEADERS_ROOT} -DCMAKE_INSTALL_PREFIX:PATH=-$ ${EXTRA_CMAKE_FLAGS} - LOG_DOWNLOAD 1 - LOG_CONFIGURE 1 - LOG_BUILD 1 -) - -# Hide this external target (for ide users) -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") - -ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) -set(SUFFIXED_INSTALL_DIR "${INSTALL_DIR}-$") - -set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SUFFIXED_INSTALL_DIR}/include CACHE PATH "List of SPIRV-Tools include directories") - -if (UNIX) - set(LIB_PREFIX "lib") - set(LIB_EXT "a") -elseif (WIN32) - set(LIB_EXT "lib") -endif () - -list(APPEND ${EXTERNAL_NAME_UPPER}_LIBRARIES ${SUFFIXED_INSTALL_DIR}/lib/SPIRV-Tools-opt.${LIB_EXT}) -list(APPEND ${EXTERNAL_NAME_UPPER}_LIBRARIES ${SUFFIXED_INSTALL_DIR}/lib/SPIRV-Tools-link.${LIB_EXT}) -list(APPEND ${EXTERNAL_NAME_UPPER}_LIBRARIES ${SUFFIXED_INSTALL_DIR}/lib/SPIRV-Tools.${LIB_EXT}) -set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${${EXTERNAL_NAME_UPPER}_LIBRARIES} CACHE FILEPATH "Path to SPIRV-Tool libraries") diff --git a/cmake/externals/zlib/CMakeLists.txt b/cmake/externals/zlib/CMakeLists.txt deleted file mode 100644 index 85506ba0e1..0000000000 --- a/cmake/externals/zlib/CMakeLists.txt +++ /dev/null @@ -1,33 +0,0 @@ -set(EXTERNAL_NAME zlib) -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) - -include(ExternalProject) - -ExternalProject_Add( - ${EXTERNAL_NAME} - URL https://public.highfidelity.com/dependencies/zlib128.zip - URL_MD5 126f8676442ffbd97884eb4d6f32afb4 - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= - BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build - LOG_DOWNLOAD 1 - LOG_CONFIGURE 1 - LOG_BUILD 1 -) - -# Hide this external target (for ide users) -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") - -ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) -set(${EXTERNAL_NAME_UPPER}_ROOT ${INSTALL_DIR} CACHE PATH "Path for Zlib install root") -set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INSTALL_DIR}/include CACHE PATH "List of zlib include directories") -set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${${EXTERNAL_NAME_UPPER}_INCLUDE_DIR} CACHE PATH "List of zlib include directories") -set(${EXTERNAL_NAME_UPPER}_DLL_PATH ${INSTALL_DIR}/bin CACHE FILEPATH "Location of ZLib DLL") -set(${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE ${INSTALL_DIR}/lib/zlib.lib CACHE FILEPATH "Location of zlib release library") -set(${EXTERNAL_NAME_UPPER}_LIBRARY_DEBUG ${INSTALL_DIR}/lib/zlibd.lib CACHE FILEPATH "Location of zlib debug library") - -include(SelectLibraryConfigurations) -select_library_configurations(${EXTERNAL_NAME_UPPER}) - -# Force selected libraries into the cache -set(${EXTERNAL_NAME_UPPER}_LIBRARY ${${EXTERNAL_NAME_UPPER}_LIBRARY} CACHE FILEPATH "Location of zlib libraries") -set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${${EXTERNAL_NAME_UPPER}_LIBRARIES} CACHE FILEPATH "Location of zlib libraries") diff --git a/cmake/macros/AutoScribeShader.cmake b/cmake/macros/AutoScribeShader.cmake index 06c29e06e3..64fbcc4ea6 100755 --- a/cmake/macros/AutoScribeShader.cmake +++ b/cmake/macros/AutoScribeShader.cmake @@ -14,13 +14,6 @@ macro(AUTOSCRIBE_APPEND_QRC) string(CONCAT SHADER_QRC "${SHADER_QRC}" "${ARGV1}\n") endmacro() -set(VULKAN_DIR $ENV{VULKAN_SDK}) -set(GLSLANG_EXEC "${VULKAN_DIR}/Bin/glslangValidator.exe") -set(SPIRV_CROSS_EXEC "${VULKAN_DIR}/Bin/spirv-cross.exe") -set(SPIRV_OPT_EXEC "${VULKAN_DIR}/Bin/spirv-opt.exe") -set(GLSLC_EXEC "${VULKAN_DIR}/Bin/glslc.exe") -set(SCRIBE_EXEC "D:/scribe.exe") - macro(AUTOSCRIBE_PLATFORM_SHADER) set(AUTOSCRIBE_PLATFORM_PATH "${ARGV0}") string(REGEX MATCH "([0-9]+(es)?)(/stereo)?" PLATFORM_PATH_REGEX ${AUTOSCRIBE_PLATFORM_PATH}) @@ -75,36 +68,6 @@ macro(AUTOSCRIBE_PLATFORM_SHADER) list(APPEND SHADER_GEN_LINE ${TEMP_PATH}) list(APPEND SHADER_GEN_LINE ${AUTOSCRIBE_SHADER_SEEN_LIBS}) string(CONCAT AUTOSCRIBE_SHADERGEN_COMMANDS "${AUTOSCRIBE_SHADERGEN_COMMANDS}" "${SHADER_GEN_LINE}\n") - - # # FIXME need better mechanism for determining the include files - # add_custom_command( - # OUTPUT ${AUTOSCRIBE_OUTPUT_FILE} - # COMMAND ${SCRIBE_COMMAND} ${SHADER_FILE} ${SCRIBE_ARGS} -o ${AUTOSCRIBE_OUTPUT_FILE} -h ${AUTOSCRIBE_DIALECT_HEADER} -h ${AUTOSCRIBE_VARIANT_HEADER} - # DEPENDS ${SCRIBE_COMMAND} ${SHADER_FILE} ${AUTOSCRIBE_DIALECT_HEADER} ${AUTOSCRIBE_VARIANT_HEADER}) - - # # Generate the spirv file - # add_custom_command( - # OUTPUT ${AUTOSCRIBE_SPIRV_FILE} - # COMMAND ${GLSLANG_EXEC} -V110 -o ${AUTOSCRIBE_SPIRV_FILE} ${AUTOSCRIBE_OUTPUT_FILE} - # DEPENDS ${AUTOSCRIBE_OUTPUT_FILE} ${GLSLANG_EXEC}) - - # # Generate the optimized spirv file - # add_custom_command( - # OUTPUT ${AUTOSCRIBE_SPIRV_OPT_FILE} - # COMMAND ${SPIRV_OPT_EXEC} -O ${AUTOSCRIBE_SPIRV_FILE} -o ${AUTOSCRIBE_SPIRV_OPT_FILE} - # DEPENDS ${AUTOSCRIBE_SPIRV_FILE} ${SPIRV_OPT_EXEC}) - - # # Generate the optimized GLSL file - # add_custom_command( - # OUTPUT ${AUTOSCRIBE_SPIRV_GLSL_FILE} - # COMMAND ${SPIRV_CROSS_EXEC} ${SPIRV_CROSS_ARGS} ${AUTOSCRIBE_SPIRV_OPT_FILE} --output ${AUTOSCRIBE_SPIRV_GLSL_FILE} - # DEPENDS ${AUTOSCRIBE_SPIRV_OPT_FILE} ${SPIRV_CROSS_EXEC}) - - # # Generate the optimized spirv file - # add_custom_command( - # OUTPUT ${AUTOSCRIBE_SPIRV_JSON_FILE} - # COMMAND ${SPIRV_CROSS_EXEC} --reflect json ${AUTOSCRIBE_SPIRV_OPT_FILE} --output ${AUTOSCRIBE_SPIRV_JSON_FILE} - # DEPENDS ${AUTOSCRIBE_SPIRV_OPT_FILE} ${SPIRV_CROSS_EXEC}) endmacro() macro(AUTOSCRIBE_SHADER) @@ -307,38 +270,16 @@ macro(AUTOSCRIBE_SHADER_LIBS) set(AUTOSCRIBE_SHADERGEN_COMMANDS_FILE ${CMAKE_CURRENT_BINARY_DIR}/shadergen.txt) file(WRITE ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE} "${AUTOSCRIBE_SHADERGEN_COMMANDS}") - # grab the SPIRV binaries we require - # note we don't use the normal ADD_DEPENDENCY_EXTERNAL_PROJECTS macro because only a custom command - # depends on these, not any of our build artifacts, so there's no valid target for the add_dependencies - # call in ADD_DEPENDENCY_EXTERNAL_PROJECTS to use - add_subdirectory(${EXTERNAL_PROJECT_DIR}/spirv_binaries ${EXTERNALS_BINARY_DIR}/spirv_binaries) - - target_python() - - # A custom python script which will generate - if (ANDROID) - add_custom_command( - OUTPUT ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS} - COMMENT "Generating/updating shaders" - COMMAND ${HIFI_PYTHON_EXEC} ${CMAKE_SOURCE_DIR}/tools/shadergen.py - --commands ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE} - --spirv-binaries ${SPIRV_BINARIES_DIR} - --scribe ${NATIVE_SCRIBE} - --build-dir ${CMAKE_CURRENT_BINARY_DIR} - --source-dir ${CMAKE_SOURCE_DIR} - DEPENDS ${AUTOSCRIBE_SHADER_HEADERS} spirv_binaries ${CMAKE_SOURCE_DIR}/tools/shadergen.py ${ALL_SCRIBE_SHADERS}) - else() - add_custom_command( - OUTPUT ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS} - COMMENT "Generating/updating shaders" - COMMAND ${HIFI_PYTHON_EXEC} ${CMAKE_SOURCE_DIR}/tools/shadergen.py - --commands ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE} - --spirv-binaries ${SPIRV_BINARIES_DIR} - --scribe $ - --build-dir ${CMAKE_CURRENT_BINARY_DIR} - --source-dir ${CMAKE_SOURCE_DIR} - DEPENDS ${AUTOSCRIBE_SHADER_HEADERS} scribe spirv_binaries ${CMAKE_SOURCE_DIR}/tools/shadergen.py ${ALL_SCRIBE_SHADERS}) - endif() + # A custom python script which will generate all our shader artifacts + add_custom_command( + OUTPUT ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS} + COMMENT "Generating/updating shaders" + COMMAND ${HIFI_PYTHON_EXEC} ${CMAKE_SOURCE_DIR}/tools/shadergen.py + --commands ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE} + --tools-dir ${VCPKG_TOOLS_DIR} + --build-dir ${CMAKE_CURRENT_BINARY_DIR} + --source-dir ${CMAKE_SOURCE_DIR} + DEPENDS ${AUTOSCRIBE_SHADER_HEADERS} ${CMAKE_SOURCE_DIR}/tools/shadergen.py ${ALL_SCRIBE_SHADERS}) add_custom_target(shadergen DEPENDS ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS}) set_target_properties(shadergen PROPERTIES FOLDER "Shaders") diff --git a/cmake/macros/ManuallyInstallOpenSSLForQt.cmake b/cmake/macros/ManuallyInstallOpenSSLForQt.cmake index ea91bbb83b..eae0eaca58 100644 --- a/cmake/macros/ManuallyInstallOpenSSLForQt.cmake +++ b/cmake/macros/ManuallyInstallOpenSSLForQt.cmake @@ -19,13 +19,13 @@ macro(manually_install_openssl_for_qt) find_package(OpenSSL REQUIRED) install( - FILES "${OPENSSL_DLL_PATH}/ssleay32.dll" + FILES "${VCPKG_INSTALL_ROOT}/bin/ssleay32.dll" DESTINATION ${TARGET_INSTALL_DIR} COMPONENT ${TARGET_INSTALL_COMPONENT} ) install( - FILES "${OPENSSL_DLL_PATH}/libeay32.dll" + FILES "${VCPKG_INSTALL_ROOT}/bin/libeay32.dll" DESTINATION ${TARGET_INSTALL_DIR} COMPONENT ${TARGET_INSTALL_COMPONENT} ) diff --git a/cmake/macros/TargetBullet.cmake b/cmake/macros/TargetBullet.cmake index 48fe0e0c05..1f4050dd42 100644 --- a/cmake/macros/TargetBullet.cmake +++ b/cmake/macros/TargetBullet.cmake @@ -16,7 +16,6 @@ macro(TARGET_BULLET) list(APPEND BULLET_LIBRARIES ${LIB_DIR}/libLinearMath.a) list(APPEND BULLET_LIBRARIES ${LIB_DIR}/libBulletSoftBody.a) else() - add_dependency_external_projects(bullet) find_package(Bullet REQUIRED) endif() # perform the system include hack for OS X to ignore warnings diff --git a/cmake/macros/TargetDraco.cmake b/cmake/macros/TargetDraco.cmake index c198ac35b0..9dbfa865b8 100755 --- a/cmake/macros/TargetDraco.cmake +++ b/cmake/macros/TargetDraco.cmake @@ -1,18 +1,24 @@ macro(TARGET_DRACO) + set(LIBS draco dracodec dracoenc) + find_library(LIBPATH ${LIB} PATHS ) if (ANDROID) set(INSTALL_DIR ${HIFI_ANDROID_PRECOMPILED}/draco) set(DRACO_INCLUDE_DIRS "${INSTALL_DIR}/include" CACHE TYPE INTERNAL) - set(LIB_DIR ${INSTALL_DIR}/lib) list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdraco.a) list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdracodec.a) list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdracoenc.a) + target_link_libraries(${TARGET_NAME} ${DRACO_LIBRARIES}) else() - add_dependency_external_projects(draco) - find_package(Draco REQUIRED) - list(APPEND DRACO_LIBRARIES ${DRACO_LIBRARY}) - list(APPEND DRACO_LIBRARIES ${DRACO_ENCODER_LIBRARY}) + set(LIB_SEARCH_PATH_RELEASE ${VCPKG_INSTALL_ROOT}/lib/) + set(LIB_SEARCH_PATH_DEBUG ${VCPKG_INSTALL_ROOT}/debug/lib/) + foreach(LIB ${LIBS}) + find_library(${LIB}_LIBPATH ${LIB} PATHS ${LIB_SEARCH_PATH_RELEASE} NO_DEFAULT_PATH) + list(APPEND DRACO_LIBRARY_RELEASE ${${LIB}_LIBPATH}) + find_library(${LIB}D_LIBPATH ${LIB} PATHS ${LIB_SEARCH_PATH_DEBUG} NO_DEFAULT_PATH) + list(APPEND DRACO_LIBRARY_DEBUG ${${LIB}D_LIBPATH}) + endforeach() + select_library_configurations(DRACO) + target_link_libraries(${TARGET_NAME} ${DRACO_LIBRARY}) endif() - target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${DRACO_INCLUDE_DIRS}) - target_link_libraries(${TARGET_NAME} ${DRACO_LIBRARIES}) -endmacro() +endmacro() \ No newline at end of file diff --git a/cmake/macros/TargetEtc2Comp.cmake b/cmake/macros/TargetEtc2Comp.cmake index 44152a58d2..d6668e62eb 100644 --- a/cmake/macros/TargetEtc2Comp.cmake +++ b/cmake/macros/TargetEtc2Comp.cmake @@ -8,15 +8,16 @@ macro(TARGET_ETC2COMP) if (ANDROID) set(INSTALL_DIR ${HIFI_ANDROID_PRECOMPILED}/etc2comp) - set(ETC2COMP_INCLUDE_DIRS "${INSTALL_DIR}/include/Etc" "${INSTALL_DIR}/include/EtcCodec") + set(ETC2COMP_INCLUDE_DIRS "${INSTALL_DIR}/include" "${INSTALL_DIR}/include/Etc" "${INSTALL_DIR}/include/EtcCodec") set(ETC2COMP_LIBRARY_DEBUG ${INSTALL_DIR}/lib/libEtcLib.a) set(ETC2COMP_LIBRARY_RELEASE ${INSTALL_DIR}/lib/libEtcLib.a) - select_library_configurations(ETC2COMP) + target_include_directories(${TARGET_NAME} PRIVATE ${ETC2COMP_INCLUDE_DIRS}) else() - add_dependency_external_projects(etc2comp) - find_package(Etc2Comp REQUIRED) + find_library(ETC2COMP_LIBRARY_DEBUG EtcLib PATHS ${VCPKG_INSTALL_ROOT}/debug/lib/ NO_DEFAULT_PATH) + find_library(ETC2COMP_LIBRARY_RELEASE EtcLib PATHS ${VCPKG_INSTALL_ROOT}/lib/ NO_DEFAULT_PATH) endif() - target_include_directories(${TARGET_NAME} PRIVATE ${ETC2COMP_INCLUDE_DIRS}) + select_library_configurations(ETC2COMP) target_link_libraries(${TARGET_NAME} ${ETC2COMP_LIBRARIES}) endmacro() + diff --git a/cmake/macros/TargetGli.cmake b/cmake/macros/TargetGli.cmake index 664fcc00c5..2ed1020b4b 100644 --- a/cmake/macros/TargetGli.cmake +++ b/cmake/macros/TargetGli.cmake @@ -6,7 +6,6 @@ # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html # macro(TARGET_GLI) - add_dependency_external_projects(gli) - find_package(GLI REQUIRED) - target_include_directories(${TARGET_NAME} PUBLIC ${GLI_INCLUDE_DIRS}) + # We use vcpkg for both gli and glm, so we just re-use the target_glm macro here + target_glm() endmacro() \ No newline at end of file diff --git a/cmake/macros/TargetGlm.cmake b/cmake/macros/TargetGlm.cmake index b58e6ba177..99ea9de755 100644 --- a/cmake/macros/TargetGlm.cmake +++ b/cmake/macros/TargetGlm.cmake @@ -7,10 +7,12 @@ # macro(TARGET_GLM) if (ANDROID) - set(GLM_INCLUDE_DIRS "${HIFI_ANDROID_PRECOMPILED}/glm/include") + target_include_directories(${TARGET_NAME} PUBLIC "${VCPKG_INSTALL_ROOT}/include") else() - add_dependency_external_projects(glm) - find_package(GLM REQUIRED) + find_package(glm CONFIG REQUIRED) + target_link_libraries(${TARGET_NAME} glm) endif() - target_include_directories(${TARGET_NAME} PUBLIC ${GLM_INCLUDE_DIRS}) + target_compile_definitions(${TARGET_NAME} PUBLIC GLM_FORCE_RADIANS) + target_compile_definitions(${TARGET_NAME} PUBLIC GLM_ENABLE_EXPERIMENTAL) + target_compile_definitions(${TARGET_NAME} PUBLIC GLM_FORCE_CTOR_INIT) endmacro() \ No newline at end of file diff --git a/cmake/macros/TargetJson.cmake b/cmake/macros/TargetJson.cmake index 9262c2ce48..b96ed90da5 100644 --- a/cmake/macros/TargetJson.cmake +++ b/cmake/macros/TargetJson.cmake @@ -6,7 +6,6 @@ # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html # macro(TARGET_JSON) - add_dependency_external_projects(json) - find_package(JSON REQUIRED) - target_include_directories(${TARGET_NAME} PUBLIC ${JSON_INCLUDE_DIRS}) + # We use vcpkg for both json and glm, so we just re-use the target_glm macro here + target_glm() endmacro() \ No newline at end of file diff --git a/cmake/macros/TargetNvtt.cmake b/cmake/macros/TargetNvtt.cmake index b8198c0cf0..8227355cb9 100644 --- a/cmake/macros/TargetNvtt.cmake +++ b/cmake/macros/TargetNvtt.cmake @@ -15,12 +15,17 @@ macro(TARGET_NVTT) list(APPEND NVTT_LIBS "${NVTT_LIB_DIR}/libnvimage.so") list(APPEND NVTT_LIBS "${NVTT_LIB_DIR}/libnvtt.so") set(NVTT_LIBRARIES ${NVTT_LIBS} CACHE TYPE INTERNAL) + target_include_directories(${TARGET_NAME} PRIVATE ${NVTT_INCLUDE_DIRS}) else() - add_dependency_external_projects(nvtt) - find_package(NVTT REQUIRED) - add_paths_to_fixup_libs(${NVTT_DLL_PATH}) + find_library(NVTT_LIBRARY_RELEASE nvtt PATHS ${VCPKG_INSTALL_ROOT}/lib NO_DEFAULT_PATH) + find_library(NVTT_LIBRARY_DEBUG nvtt PATHS ${VCPKG_INSTALL_ROOT}/debug/lib NO_DEFAULT_PATH) + select_library_configurations(NVTT) endif() - target_include_directories(${TARGET_NAME} PRIVATE ${NVTT_INCLUDE_DIRS}) target_link_libraries(${TARGET_NAME} ${NVTT_LIBRARIES}) + if ((NOT WIN32) AND (NOT ANDROID) AND (NOT APPLE)) + find_package(OpenMP) + target_link_libraries(${TARGET_NAME} OpenMP::OpenMP_C OpenMP::OpenMP_CXX) + endif() + endmacro() diff --git a/cmake/macros/TargetOpenSSL.cmake b/cmake/macros/TargetOpenSSL.cmake index 82601bf6aa..3faaab5801 100644 --- a/cmake/macros/TargetOpenSSL.cmake +++ b/cmake/macros/TargetOpenSSL.cmake @@ -11,15 +11,8 @@ macro(TARGET_OPENSSL) set(OPENSSL_INCLUDE_DIR "${OPENSSL_INSTALL_DIR}/include" CACHE TYPE INTERNAL) set(OPENSSL_LIBRARIES "${OPENSSL_INSTALL_DIR}/lib/libcrypto.a;${OPENSSL_INSTALL_DIR}/lib/libssl.a" CACHE TYPE INTERNAL) else() - + # using VCPKG for OpenSSL find_package(OpenSSL REQUIRED) - - if (APPLE AND ${OPENSSL_INCLUDE_DIR} STREQUAL "/usr/include") - # this is a user on OS X using system OpenSSL, which is going to throw warnings since they're deprecating for their common crypto - message(WARNING "The found version of OpenSSL is the OS X system version. This will produce deprecation warnings." - "\nWe recommend you install a newer version (at least 1.0.1h) in a different directory and set OPENSSL_ROOT_DIR in your env so Cmake can find it.") - endif() - endif() include_directories(SYSTEM "${OPENSSL_INCLUDE_DIR}") diff --git a/cmake/macros/TargetOpenVR.cmake b/cmake/macros/TargetOpenVR.cmake new file mode 100644 index 0000000000..6c08aa605a --- /dev/null +++ b/cmake/macros/TargetOpenVR.cmake @@ -0,0 +1,13 @@ +# +# Created by Bradley Austin Davis on 2018/10/24 +# Copyright 2013-2018 High Fidelity, Inc. +# +# Distributed under the Apache License, Version 2.0. +# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +# +macro(TARGET_OPENVR) + find_library(OPENVR_LIBRARY_RELEASE NAMES openvr_api PATHS ${VCPKG_INSTALL_ROOT}/lib) + find_library(OPENVR_LIBRARY_DEBUG NAMES openvr_api PATHS ${VCPKG_INSTALL_ROOT}/debug/lib) + select_library_configurations(OPENVR) + target_link_libraries(${TARGET_NAME} ${OPENVR_LIBRARY}) +endmacro() diff --git a/cmake/macros/TargetSDL2.cmake b/cmake/macros/TargetSDL2.cmake index ee2328dfff..8163a5ebd9 100644 --- a/cmake/macros/TargetSDL2.cmake +++ b/cmake/macros/TargetSDL2.cmake @@ -6,9 +6,12 @@ # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html # macro(TARGET_SDL2) - add_dependency_external_projects(sdl2) - find_package(SDL2 REQUIRED) - target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${SDL2_INCLUDE_DIR}) - target_link_libraries(${TARGET_NAME} ${SDL2_LIBRARY}) + # using VCPKG for SDL2 + find_package(SDL2 CONFIG REQUIRED) + if (WIN32) + target_link_libraries(${TARGET_NAME} SDL2::SDL2) + else() + target_link_libraries(${TARGET_NAME} SDL2::SDL2-static) + endif() add_definitions(-DHAVE_SDL2) -endmacro() \ No newline at end of file +endmacro() diff --git a/cmake/macros/TargetTBB.cmake b/cmake/macros/TargetTBB.cmake index 1e2e69eeaa..b2aeeb99aa 100644 --- a/cmake/macros/TargetTBB.cmake +++ b/cmake/macros/TargetTBB.cmake @@ -13,12 +13,17 @@ if (ANDROID) set(TBB_LIBRARY ${TBB_INSTALL_DIR}/lib/release/libtbb.so CACHE FILEPATH "TBB library location") set(TBB_MALLOC_LIBRARY ${TBB_INSTALL_DIR}/lib/release/libtbbmalloc.so CACHE FILEPATH "TBB malloc library location") set(TBB_LIBRARIES ${TBB_LIBRARY} ${TBB_MALLOC_LIBRARY}) -else() + target_include_directories(${TARGET_NAME} SYSTEM PUBLIC ${TBB_INCLUDE_DIRS}) + target_link_libraries(${TARGET_NAME} ${TBB_LIBRARIES}) +elseif(APPLE) add_dependency_external_projects(tbb) find_package(TBB REQUIRED) + target_link_libraries(${TARGET_NAME} ${TBB_LIBRARIES}) + target_include_directories(${TARGET_NAME} SYSTEM PUBLIC ${TBB_INCLUDE_DIRS}) +else() + # using VCPKG for TBB + find_package(TBB CONFIG REQUIRED) + target_link_libraries(${TARGET_NAME} TBB::tbb) endif() -target_link_libraries(${TARGET_NAME} ${TBB_LIBRARIES}) -target_include_directories(${TARGET_NAME} SYSTEM PUBLIC ${TBB_INCLUDE_DIRS}) - endmacro() diff --git a/cmake/macros/TargetVulkan.cmake b/cmake/macros/TargetVulkan.cmake index 4702583ff5..e220487eb5 100644 --- a/cmake/macros/TargetVulkan.cmake +++ b/cmake/macros/TargetVulkan.cmake @@ -5,15 +5,7 @@ # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html # macro(TARGET_VULKAN) - find_package(Vulkan) - - if (Vulkan_FOUND) - add_definitions(-DHAVE_VULKAN) - target_include_directories(${TARGET_NAME} PRIVATE ${Vulkan_INCLUDE_DIRS}) - target_link_libraries(${TARGET_NAME} ${Vulkan_LIBRARIES}) - - add_dependency_external_projects(glslang) - target_include_directories(${TARGET_NAME} PRIVATE ${GLSLANG_INCLUDE_DIRS}) - target_link_libraries(${TARGET_NAME} ${GLSLANG_LIBRARIES}) - endif() + find_package(Vulkan REQUIRED) + target_include_directories(${TARGET_NAME} PRIVATE ${VULKAN_INCLUDE_DIR}) + target_link_libraries(${TARGET_NAME} ${VULKAN_LIBRARY}) endmacro() \ No newline at end of file diff --git a/cmake/macros/TargetZlib.cmake b/cmake/macros/TargetZlib.cmake index ef746031e8..79dce01a3d 100644 --- a/cmake/macros/TargetZlib.cmake +++ b/cmake/macros/TargetZlib.cmake @@ -6,17 +6,8 @@ # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html # macro(TARGET_ZLIB) - - if (WIN32) - add_dependency_external_projects(zlib) - endif() - + # using VCPKG for zlib find_package(ZLIB REQUIRED) - - if (WIN32) - add_paths_to_fixup_libs(${ZLIB_DLL_PATH}) - endif() - target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${ZLIB_INCLUDE_DIRS}) target_link_libraries(${TARGET_NAME} ${ZLIB_LIBRARIES}) endmacro() diff --git a/cmake/modules/FindDraco.cmake b/cmake/modules/FindDraco.cmake deleted file mode 100644 index 342797b62e..0000000000 --- a/cmake/modules/FindDraco.cmake +++ /dev/null @@ -1,30 +0,0 @@ -# -# FindDraco.cmake -# -# Try to find Draco libraries and include path. -# Once done this will define -# -# DRACO_FOUND -# DRACO_INCLUDE_DIRS -# DRACO_LIBRARY -# DRACO_ENCODER_LIBRARY -# DRACO_DECODER_LIBRARY -# -# Created on 8/8/2017 by Stephen Birarda -# Copyright 2017 High Fidelity, Inc. -# -# Distributed under the Apache License, Version 2.0. -# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -# - -include("${MACRO_DIR}/HifiLibrarySearchHints.cmake") -hifi_library_search_hints("draco") - -find_path(DRACO_INCLUDE_DIRS draco/core/draco_types.h PATH_SUFFIXES include/draco/src include HINTS ${DRACO_SEARCH_DIRS}) - -find_library(DRACO_LIBRARY draco PATH_SUFFIXES "lib" HINTS ${DRACO_SEARCH_DIRS}) -find_library(DRACO_ENCODER_LIBRARY draco PATH_SUFFIXES "lib" HINTS ${DRACO_SEARCH_DIRS}) -find_library(DRACO_DECODER_LIBRARY draco PATH_SUFFIXES "lib" HINTS ${DRACO_SEARCH_DIRS}) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(DRACO DEFAULT_MSG DRACO_INCLUDE_DIRS DRACO_LIBRARY DRACO_ENCODER_LIBRARY DRACO_DECODER_LIBRARY) diff --git a/cmake/modules/FindEtc2Comp.cmake b/cmake/modules/FindEtc2Comp.cmake deleted file mode 100644 index 1b990368fd..0000000000 --- a/cmake/modules/FindEtc2Comp.cmake +++ /dev/null @@ -1,37 +0,0 @@ -# -# FindEtc2Comp.cmake -# -# Try to find the Etc2Comp compression library. -# -# Once done this will define -# -# ETC2COMP_FOUND - system found Etc2Comp -# ETC2COMP_INCLUDE_DIRS - the Etc2Comp include directory -# ETC2COMP_LIBRARIES - link to this to use Etc2Comp -# -# Created on 5/2/2018 by Sam Gondelman -# Copyright 2018 High Fidelity, Inc. -# -# Distributed under the Apache License, Version 2.0. -# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -# - -include("${MACRO_DIR}/HifiLibrarySearchHints.cmake") -hifi_library_search_hints("etc2comp") - -find_path(ETC_INCLUDE_DIR NAMES Etc.h HINTS ${ETC2COMP_SEARCH_DIRS}) -find_path(ETCCODEC_INCLUDE_DIR NAMES EtcBlock4x4.h HINTS ${ETC2COMP_SEARCH_DIRS}) -set(ETC2COMP_INCLUDE_DIRS "${ETC_INCLUDE_DIR}" "${ETCCODEC_INCLUDE_DIR}") - -find_library(ETC2COMP_LIBRARY_DEBUG NAMES ETC2COMP ETC2COMP_LIB PATH_SUFFIXES EtcLib/Debug HINTS ${ETC2COMP_SEARCH_DIRS}) -find_library(ETC2COMP_LIBRARY_RELEASE NAMES ETC2COMP ETC2COMP_LIB PATH_SUFFIXES EtcLib/Release EtcLib HINTS ${ETC2COMP_SEARCH_DIRS}) - -include(SelectLibraryConfigurations) -select_library_configurations(ETC2COMP) - -set(ETC2COMP_LIBRARIES ${ETC2COMP_LIBRARY}) - -find_package_handle_standard_args(ETC2COMP "Could NOT find ETC2COMP, try to set the path to ETC2COMP root folder in the system variable ETC2COMP_ROOT_DIR or create a directory etc2comp in HIFI_LIB_DIR and paste the necessary files there" - ETC2COMP_INCLUDE_DIRS ETC2COMP_LIBRARIES) - -mark_as_advanced(ETC2COMP_INCLUDE_DIRS ETC2COMP_LIBRARIES ETC2COMP_SEARCH_DIRS) diff --git a/cmake/modules/FindGLEW.cmake b/cmake/modules/FindGLEW.cmake deleted file mode 100644 index f4eca0eddf..0000000000 --- a/cmake/modules/FindGLEW.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# -# FindGLEW.cmake -# -# Try to find GLEW library and include path. Note that this only handles static GLEW. -# Once done this will define -# -# GLEW_FOUND -# GLEW_INCLUDE_DIRS -# GLEW_LIBRARIES -# -# Created on 2/6/2014 by Stephen Birarda -# Copyright 2014 High Fidelity, Inc. -# -# Adapted from FindGLEW.cmake available in the nvidia-texture-tools repository -# (https://code.google.com/p/nvidia-texture-tools/source/browse/trunk/cmake/FindGLEW.cmake?r=96) -# -# Distributed under the Apache License, Version 2.0. -# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -# - -include("${MACRO_DIR}/HifiLibrarySearchHints.cmake") -hifi_library_search_hints("glew") - -find_path(GLEW_INCLUDE_DIRS GL/glew.h PATH_SUFFIXES include HINTS ${GLEW_SEARCH_DIRS}) - -find_library(GLEW_LIBRARY_RELEASE glew32 PATH_SUFFIXES "lib/Release/Win32" "lib" HINTS ${GLEW_SEARCH_DIRS}) -find_library(GLEW_LIBRARY_DEBUG glew32d PATH_SUFFIXES "lib/Debug/Win32" "lib" HINTS ${GLEW_SEARCH_DIRS}) - -include(SelectLibraryConfigurations) -select_library_configurations(GLEW) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(GLEW DEFAULT_MSG GLEW_INCLUDE_DIRS GLEW_LIBRARIES) \ No newline at end of file diff --git a/cmake/modules/FindJSON.cmake b/cmake/modules/FindJSON.cmake deleted file mode 100644 index d5011bd5dd..0000000000 --- a/cmake/modules/FindJSON.cmake +++ /dev/null @@ -1,19 +0,0 @@ -# -# Created by Bradley Austin Davis on 2018/07/22 -# Copyright 2013-2018 High Fidelity, Inc. -# -# Distributed under the Apache License, Version 2.0. -# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -# - -# setup hints for JSON search -include("${MACRO_DIR}/HifiLibrarySearchHints.cmake") -hifi_library_search_hints("json") - -# locate header -find_path(JSON_INCLUDE_DIRS "json/json.hpp" HINTS ${JSON_SEARCH_DIRS}) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(JSON DEFAULT_MSG JSON_INCLUDE_DIRS) - -mark_as_advanced(JSON_INCLUDE_DIRS JSON_SEARCH_DIRS) \ No newline at end of file diff --git a/cmake/modules/FindOpenSSL.cmake b/cmake/modules/FindOpenSSL.cmake deleted file mode 100644 index 0619c4d587..0000000000 --- a/cmake/modules/FindOpenSSL.cmake +++ /dev/null @@ -1,174 +0,0 @@ -# - Try to find the OpenSSL encryption library -# Once done this will define -# -# OPENSSL_ROOT_DIR - Set this variable to the root installation of OpenSSL -# -# Read-Only variables: -# OPENSSL_FOUND - system has the OpenSSL library -# OPENSSL_INCLUDE_DIR - the OpenSSL include directory -# OPENSSL_LIBRARIES - The libraries needed to use OpenSSL -# OPENSSL_VERSION - This is set to $major.$minor.$revision$path (eg. 0.9.8s) -# -# Modified on 7/16/2014 by Stephen Birarda -# This is an adapted version of the FindOpenSSL.cmake module distributed with Cmake 2.8.12.2 -# The original license for that file is displayed below. -# -#============================================================================= -# Copyright 2006-2009 Kitware, Inc. -# Copyright 2006 Alexander Neundorf -# Copyright 2009-2011 Mathieu Malaterre -# -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= -# (To distribute this file outside of CMake, substitute the full -# License text for the above reference.) - -if (UNIX) - find_package(PkgConfig QUIET) - pkg_check_modules(_OPENSSL QUIET openssl) -endif () - -if (WIN32) - if (("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")) - set(_OPENSSL_ROOT_HINTS_AND_PATHS $ENV{VCPKG_ROOT}/installed/x64-windows) - else() - set(_OPENSSL_ROOT_HINTS_AND_PATHS $ENV{VCPKG_ROOT}/installed/x86-windows) - endif() -else () - include("${MACRO_DIR}/HifiLibrarySearchHints.cmake") - hifi_library_search_hints("openssl") - - set(_OPENSSL_ROOT_HINTS_AND_PATHS ${OPENSSL_SEARCH_DIRS}) -endif () - -find_path(OPENSSL_INCLUDE_DIR NAMES openssl/ssl.h HINTS ${_OPENSSL_ROOT_HINTS_AND_PATHS} ${_OPENSSL_INCLUDEDIR} - PATH_SUFFIXES include -) - -if (WIN32 AND NOT CYGWIN) - if (MSVC) - # Using vcpkg builds of openssl - find_library(LIB_EAY_LIBRARY_RELEASE NAMES libeay32 HINTS ${_OPENSSL_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES "lib") - find_library(SSL_EAY_LIBRARY_RELEASE NAMES ssleay32 HINTS ${_OPENSSL_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES "lib") - - include(SelectLibraryConfigurations) - select_library_configurations(LIB_EAY) - select_library_configurations(SSL_EAY) - set(OPENSSL_LIBRARIES ${SSL_EAY_LIBRARY} ${LIB_EAY_LIBRARY}) - find_path(OPENSSL_DLL_PATH NAMES ssleay32.dll PATH_SUFFIXES "bin" HINTS ${_OPENSSL_ROOT_HINTS_AND_PATHS} NO_DEFAULT_PATH) - endif() -else() - - find_library(OPENSSL_SSL_LIBRARY NAMES ssl ssleay32 ssleay32MD HINTS ${_OPENSSL_ROOT_HINTS_AND_PATHS} ${_OPENSSL_LIBDIR} - PATH_SUFFIXES lib - ) - - find_library(OPENSSL_CRYPTO_LIBRARY NAMES crypto HINTS ${_OPENSSL_ROOT_HINTS_AND_PATHS} ${_OPENSSL_LIBDIR} - PATH_SUFFIXES lib - ) - - mark_as_advanced(OPENSSL_CRYPTO_LIBRARY OPENSSL_SSL_LIBRARY) - - # compat defines - set(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY}) - set(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY}) - - set(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY}) - -endif () - -function(from_hex HEX DEC) - string(TOUPPER "${HEX}" HEX) - set(_res 0) - string(LENGTH "${HEX}" _strlen) - - while (_strlen GREATER 0) - math(EXPR _res "${_res} * 16") - string(SUBSTRING "${HEX}" 0 1 NIBBLE) - string(SUBSTRING "${HEX}" 1 -1 HEX) - if (NIBBLE STREQUAL "A") - math(EXPR _res "${_res} + 10") - elseif (NIBBLE STREQUAL "B") - math(EXPR _res "${_res} + 11") - elseif (NIBBLE STREQUAL "C") - math(EXPR _res "${_res} + 12") - elseif (NIBBLE STREQUAL "D") - math(EXPR _res "${_res} + 13") - elseif (NIBBLE STREQUAL "E") - math(EXPR _res "${_res} + 14") - elseif (NIBBLE STREQUAL "F") - math(EXPR _res "${_res} + 15") - else() - math(EXPR _res "${_res} + ${NIBBLE}") - endif() - - string(LENGTH "${HEX}" _strlen) - endwhile() - - set(${DEC} ${_res} PARENT_SCOPE) -endfunction() - -if (OPENSSL_INCLUDE_DIR) - if(OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h") - file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str - REGEX "^#[ ]?define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*") - - # The version number is encoded as 0xMNNFFPPS: major minor fix patch status - # The status gives if this is a developer or prerelease and is ignored here. - # Major, minor, and fix directly translate into the version numbers shown in - # the string. The patch field translates to the single character suffix that - # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so - # on. - - string(REGEX REPLACE "^.*OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F]).*$" - "\\1;\\2;\\3;\\4;\\5" OPENSSL_VERSION_LIST "${openssl_version_str}") - list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR) - list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR) - from_hex("${OPENSSL_VERSION_MINOR}" OPENSSL_VERSION_MINOR) - list(GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX) - from_hex("${OPENSSL_VERSION_FIX}" OPENSSL_VERSION_FIX) - list(GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH) - - if (NOT OPENSSL_VERSION_PATCH STREQUAL "00") - from_hex("${OPENSSL_VERSION_PATCH}" _tmp) - # 96 is the ASCII code of 'a' minus 1 - math(EXPR OPENSSL_VERSION_PATCH_ASCII "${_tmp} + 96") - unset(_tmp) - # Once anyone knows how OpenSSL would call the patch versions beyond 'z' - # this should be updated to handle that, too. This has not happened yet - # so it is simply ignored here for now. - string(ASCII "${OPENSSL_VERSION_PATCH_ASCII}" OPENSSL_VERSION_PATCH_STRING) - endif () - - set(OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}") - endif () -endif () - -include(FindPackageHandleStandardArgs) - -set(OPENSSL_REQUIREMENTS OPENSSL_LIBRARIES OPENSSL_INCLUDE_DIR) -if (WIN32) - list(APPEND OPENSSL_REQUIREMENTS OPENSSL_DLL_PATH) -endif () - -if (OPENSSL_VERSION) - find_package_handle_standard_args(OpenSSL - REQUIRED_VARS - ${OPENSSL_REQUIREMENTS} - VERSION_VAR - OPENSSL_VERSION - FAIL_MESSAGE - "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR" - ) -else () - find_package_handle_standard_args(OpenSSL "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR" - ${OPENSSL_REQUIREMENTS} - ) -endif () - -mark_as_advanced(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES OPENSSL_SEARCH_DIRS) diff --git a/cmake/modules/FindOpenVR.cmake b/cmake/modules/FindOpenVR.cmake deleted file mode 100644 index 9cbe790a7f..0000000000 --- a/cmake/modules/FindOpenVR.cmake +++ /dev/null @@ -1,21 +0,0 @@ -# -# FindLibOVR.cmake -# -# Try to find the LibOVR library to use the Oculus - -# Once done this will define -# -# OPENVR_FOUND - system found LibOVR -# OPENVR_INCLUDE_DIRS - the LibOVR include directory -# OPENVR_LIBRARIES - Link this to use LibOVR -# -# Distributed under the Apache License, Version 2.0. -# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -# - -if (NOT ANDROID) - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(OPENVR DEFAULT_MSG OPENVR_INCLUDE_DIRS OPENVR_LIBRARIES) -endif() - -mark_as_advanced(OPENVR_INCLUDE_DIRS OPENVR_LIBRARIES OPENVR_SEARCH_DIRS) diff --git a/cmake/modules/FindSDL2.cmake b/cmake/modules/FindSDL2.cmake deleted file mode 100644 index 1a089bcb60..0000000000 --- a/cmake/modules/FindSDL2.cmake +++ /dev/null @@ -1,224 +0,0 @@ -# Locate SDL2 library -# This module defines -# SDL2_LIBRARY, the name of the library to link against -# SDL2_FOUND, if false, do not try to link to SDL2 -# SDL2_INCLUDE_DIR, where to find SDL.h -# -# This module responds to the the flag: -# SDL2_BUILDING_LIBRARY -# If this is defined, then no SDL2_main will be linked in because -# only applications need main(). -# Otherwise, it is assumed you are building an application and this -# module will attempt to locate and set the the proper link flags -# as part of the returned SDL2_LIBRARY variable. -# -# Don't forget to include SDL2main.h and SDL2main.m your project for the -# OS X framework based version. (Other versions link to -lSDL2main which -# this module will try to find on your behalf.) Also for OS X, this -# module will automatically add the -framework Cocoa on your behalf. -# -# -# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your configuration -# and no SDL2_LIBRARY, it means CMake did not find your SDL2 library -# (SDL2.dll, libsdl2.so, SDL2.framework, etc). -# Set SDL2_LIBRARY_TEMP to point to your SDL2 library, and configure again. -# Similarly, if you see an empty SDL2MAIN_LIBRARY, you should set this value -# as appropriate. These values are used to generate the final SDL2_LIBRARY -# variable, but when these values are unset, SDL2_LIBRARY does not get created. -# -# -# $SDL2 is an environment variable that would -# correspond to the ./configure --prefix=$SDL2 -# used in building SDL2. -# l.e.galup 9-20-02 -# -# Modified by Eric Wing. -# Added code to assist with automated building by using environmental variables -# and providing a more controlled/consistent search behavior. -# Added new modifications to recognize OS X frameworks and -# additional Unix paths (FreeBSD, etc). -# Also corrected the header search path to follow "proper" SDL2 guidelines. -# Added a search for SDL2main which is needed by some platforms. -# Added a search for threads which is needed by some platforms. -# Added needed compile switches for MinGW. -# -# On OSX, this will prefer the Framework version (if found) over others. -# People will have to manually change the cache values of -# SDL2_LIBRARY to override this selection or set the CMake environment -# CMAKE_INCLUDE_PATH to modify the search paths. -# -# Note that the header path has changed from SDL2/SDL.h to just SDL.h -# This needed to change because "proper" SDL2 convention -# is #include "SDL.h", not . This is done for portability -# reasons because not all systems place things in SDL2/ (see FreeBSD). -# -# Ported by Johnny Patterson. This is a literal port for SDL2 of the FindSDL.cmake -# module with the minor edit of changing "SDL" to "SDL2" where necessary. This -# was not created for redistribution, and exists temporarily pending official -# SDL2 CMake modules. -# -# Note that on windows this will only search for the 32bit libraries, to search -# for 64bit change x86/i686-w64 to x64/x86_64-w64 - -#============================================================================= -# Copyright 2003-2009 Kitware, Inc. -# -# CMake - Cross Platform Makefile Generator -# Copyright 2000-2014 Kitware, Inc. -# Copyright 2000-2011 Insight Software Consortium -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# * Neither the names of Kitware, Inc., the Insight Software Consortium, -# nor the names of their contributors may be used to endorse or promote -# products derived from this software without specific prior written -# permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= -# (To distribute this file outside of CMake, substitute the full -# License text for the above reference.) -include("${MACRO_DIR}/HifiLibrarySearchHints.cmake") -hifi_library_search_hints("sdl2") - -FIND_PATH(SDL2_INCLUDE_DIR SDL.h - HINTS - ${SDL2_SEARCH_DIRS} - $ENV{SDL2} - PATH_SUFFIXES include/SDL2 include SDL2 - i686-w64-mingw32/include/SDL2 - x86_64-w64-mingw32/include/SDL2 - PATHS - ~/Library/Frameworks - /Library/Frameworks - /usr/local/include/SDL2 - /usr/include/SDL2 - /sw # Fink - /opt/local # DarwinPorts - /opt/csw # Blastwave - /opt -) - -# Lookup the 64 bit libs on x64 -IF(CMAKE_SIZEOF_VOID_P EQUAL 8) - FIND_LIBRARY(SDL2_LIBRARY_TEMP SDL2 - HINTS - ${SDL2_SEARCH_DIRS} - $ENV{SDL2} - PATH_SUFFIXES lib64 lib - lib/x64 - x86_64-w64-mingw32/lib - PATHS - /sw - /opt/local - /opt/csw - /opt - ) - - if (WIN32) - find_path(SDL2_DLL_PATH SDL2.dll PATH_SUFFIXES lib/x64 HINTS ${SDL2_SEARCH_DIRS}) - endif () -# On 32bit build find the 32bit libs -ELSE(CMAKE_SIZEOF_VOID_P EQUAL 8) - FIND_LIBRARY(SDL2_LIBRARY_TEMP SDL2 - HINTS - ${SDL2_SEARCH_DIRS} - $ENV{SDL2} - PATH_SUFFIXES lib - lib/x86 - i686-w64-mingw32/lib - PATHS - /sw - /opt/local - /opt/csw - /opt - ) - - if (WIN32) - find_path(SDL2_DLL_PATH SDL2.dll PATH_SUFFIXES lib/x86 HINTS ${SDL2_SEARCH_DIRS}) - endif () -ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8) - -# SDL2 may require threads on your system. -# The Apple build may not need an explicit flag because one of the -# frameworks may already provide it. -# But for non-OSX systems, I will use the CMake Threads package. -IF(NOT APPLE) - FIND_PACKAGE(Threads) -ENDIF(NOT APPLE) - -# MinGW needs an additional library, mwindows -# It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -lmwindows -# (Actually on second look, I think it only needs one of the m* libraries.) -IF(MINGW) - SET(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW") -ENDIF(MINGW) - -SET(SDL2_FOUND "NO") - IF(SDL2_LIBRARY_TEMP) - # For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa. - # CMake doesn't display the -framework Cocoa string in the UI even - # though it actually is there if I modify a pre-used variable. - # I think it has something to do with the CACHE STRING. - # So I use a temporary variable until the end so I can set the - # "real" variable in one-shot. - IF(APPLE) - SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa") - ENDIF(APPLE) - - # For threads, as mentioned Apple doesn't need this. - # In fact, there seems to be a problem if I used the Threads package - # and try using this line, so I'm just skipping it entirely for OS X. - IF(NOT APPLE) - SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT}) - ENDIF(NOT APPLE) - - # For MinGW library - IF(MINGW) - SET(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP}) - ENDIF(MINGW) - - # Set the final string here so the GUI reflects the final state. - SET(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL2 Library can be found") - # Set the temp variable to INTERNAL so it is not seen in the CMake GUI - SET(SDL2_LIBRARY_TEMP "${SDL2_LIBRARY_TEMP}" CACHE INTERNAL "") - - SET(SDL2_FOUND "YES") -ENDIF(SDL2_LIBRARY_TEMP) - -INCLUDE(FindPackageHandleStandardArgs) - -set(SDL2_REQUIREMENTS SDL2_LIBRARY SDL2_INCLUDE_DIR) -if (WIN32) - list(APPEND SDL2_REQUIREMENTS SDL2_DLL_PATH) -endif () - -FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 REQUIRED_VARS ${SDL2_REQUIREMENTS}) - -if (WIN32) - add_paths_to_fixup_libs(${SDL2_DLL_PATH}) -endif () diff --git a/cmake/ports/bullet3/CONTROL b/cmake/ports/bullet3/CONTROL new file mode 100644 index 0000000000..4941ec3e7e --- /dev/null +++ b/cmake/ports/bullet3/CONTROL @@ -0,0 +1,3 @@ +Source: bullet3 +Version: ab8f16961e19a86ee20c6a1d61f662392524cc77 +Description: Bullet Physics is a professional collision detection, rigid body, and soft body dynamics library diff --git a/cmake/ports/bullet3/portfile.cmake b/cmake/ports/bullet3/portfile.cmake new file mode 100644 index 0000000000..d4e7aaf787 --- /dev/null +++ b/cmake/ports/bullet3/portfile.cmake @@ -0,0 +1,57 @@ +# Common Ambient Variables: +# CURRENT_BUILDTREES_DIR = ${VCPKG_ROOT_DIR}\buildtrees\${PORT} +# CURRENT_PACKAGES_DIR = ${VCPKG_ROOT_DIR}\packages\${PORT}_${TARGET_TRIPLET} +# CURRENT_PORT_DIR = ${VCPKG_ROOT_DIR}\ports\${PORT} +# PORT = current port name (zlib, etc) +# TARGET_TRIPLET = current triplet (x86-windows, x64-windows-static, etc) +# VCPKG_CRT_LINKAGE = C runtime linkage type (static, dynamic) +# VCPKG_LIBRARY_LINKAGE = target library linkage type (static, dynamic) +# VCPKG_ROOT_DIR = +# VCPKG_TARGET_ARCHITECTURE = target architecture (x64, x86, arm) +# +include(vcpkg_common_functions) + +if (VCPKG_LIBRARY_LINKAGE STREQUAL dynamic) + message(WARNING "Dynamic not supported, building static") + set(VCPKG_LIBRARY_LINKAGE static) + set(VCPKG_CRT_LINKAGE dynamic) +endif() + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO bulletphysics/bullet3 + REF ab8f16961e19a86ee20c6a1d61f662392524cc77 + SHA512 927742db29867517283d45e475f0c534a9a57e165cae221f26e08e88057253a1682ac9919b2dc547b9cf388ba0b931b175623461d44f28c9184796ba90b1ed55 + HEAD_REF master +) + + +vcpkg_configure_cmake( + SOURCE_PATH ${SOURCE_PATH} + OPTIONS + -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON + -DUSE_MSVC_RUNTIME_LIBRARY_DLL=ON + -DUSE_GLUT=0 + -DUSE_DX11=0 + -DBUILD_DEMOS=OFF + -DBUILD_OPENGL3_DEMOS=OFF + -DBUILD_BULLET3=OFF + -DBUILD_BULLET2_DEMOS=OFF + -DBUILD_CPU_DEMOS=OFF + -DBUILD_EXTRAS=OFF + -DBUILD_UNIT_TESTS=OFF + -DBUILD_SHARED_LIBS=ON + -DINSTALL_LIBS=ON +) + +vcpkg_install_cmake() + +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/lib/cmake) +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/lib/cmake) +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/include/bullet/BulletInverseDynamics/details) + +vcpkg_copy_pdbs() + +# Handle copyright +file(INSTALL ${SOURCE_PATH}/LICENSE.txt DESTINATION ${CURRENT_PACKAGES_DIR}/share/bullet3 RENAME copyright) \ No newline at end of file diff --git a/cmake/ports/draco/CONTROL b/cmake/ports/draco/CONTROL new file mode 100644 index 0000000000..faa63303ae --- /dev/null +++ b/cmake/ports/draco/CONTROL @@ -0,0 +1,4 @@ +Source: draco +Version: 1.3.3 +Description: A library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics. +Build-Depends: diff --git a/cmake/ports/draco/portfile.cmake b/cmake/ports/draco/portfile.cmake new file mode 100644 index 0000000000..853d45e862 --- /dev/null +++ b/cmake/ports/draco/portfile.cmake @@ -0,0 +1,56 @@ +# Common Ambient Variables: +# CURRENT_BUILDTREES_DIR = ${VCPKG_ROOT_DIR}\buildtrees\${PORT} +# CURRENT_PACKAGES_DIR = ${VCPKG_ROOT_DIR}\packages\${PORT}_${TARGET_TRIPLET} +# CURRENT_PORT DIR = ${VCPKG_ROOT_DIR}\ports\${PORT} +# PORT = current port name (zlib, etc) +# TARGET_TRIPLET = current triplet (x86-windows, x64-windows-static, etc) +# VCPKG_CRT_LINKAGE = C runtime linkage type (static, dynamic) +# VCPKG_LIBRARY_LINKAGE = target library linkage type (static, dynamic) +# VCPKG_ROOT_DIR = +# VCPKG_TARGET_ARCHITECTURE = target architecture (x64, x86, arm) +# + +if (VCPKG_LIBRARY_LINKAGE STREQUAL dynamic) + message(STATUS "Warning: Dynamic building not supported yet. Building static.") + set(VCPKG_LIBRARY_LINKAGE static) +endif() + +include(vcpkg_common_functions) + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO google/draco + REF 1.3.3 + SHA512 80ed5a623046822f5bb26b2454c8ee8cc93ffe9eb3012e8461cefdfc577b26d69a92ea0f0c5e14f5f48c1ef99f9a7263b01710df376792e74358ae14e49c3897 + HEAD_REF master +) + +vcpkg_configure_cmake( + SOURCE_PATH ${SOURCE_PATH} + PREFER_NINJA +) + +vcpkg_install_cmake() + +vcpkg_fixup_cmake_targets(CONFIG_PATH lib/draco/cmake) + +# Install tools and plugins +file(GLOB TOOLS "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/*.exe") +if(TOOLS) + file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/tools/draco) + file(COPY ${TOOLS} DESTINATION ${CURRENT_PACKAGES_DIR}/tools/draco) +endif() + +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin) +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/lib/draco) +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/bin) +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/lib/draco) + +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share) + +vcpkg_copy_pdbs() + +# Handle copyright +file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/draco) +file(RENAME ${CURRENT_PACKAGES_DIR}/share/draco/LICENSE ${CURRENT_PACKAGES_DIR}/share/draco/copyright) diff --git a/cmake/ports/etc2comp/CONTROL b/cmake/ports/etc2comp/CONTROL new file mode 100644 index 0000000000..e9034dea19 --- /dev/null +++ b/cmake/ports/etc2comp/CONTROL @@ -0,0 +1,3 @@ +Source: etc2comp +Version: 7f1843bf07825c21cab711360c1ddbad04641036 +Description: ETC2 image compression library diff --git a/cmake/ports/etc2comp/portfile.cmake b/cmake/ports/etc2comp/portfile.cmake new file mode 100644 index 0000000000..d25f24cd39 --- /dev/null +++ b/cmake/ports/etc2comp/portfile.cmake @@ -0,0 +1,39 @@ +# Common Ambient Variables: +# CURRENT_BUILDTREES_DIR = ${VCPKG_ROOT_DIR}\buildtrees\${PORT} +# CURRENT_PACKAGES_DIR = ${VCPKG_ROOT_DIR}\packages\${PORT}_${TARGET_TRIPLET} +# CURRENT_PORT_DIR = ${VCPKG_ROOT_DIR}\ports\${PORT} +# PORT = current port name (zlib, etc) +# TARGET_TRIPLET = current triplet (x86-windows, x64-windows-static, etc) +# VCPKG_CRT_LINKAGE = C runtime linkage type (static, dynamic) +# VCPKG_LIBRARY_LINKAGE = target library linkage type (static, dynamic) +# VCPKG_ROOT_DIR = +# VCPKG_TARGET_ARCHITECTURE = target architecture (x64, x86, arm) +# +if (VCPKG_LIBRARY_LINKAGE STREQUAL dynamic) + message(STATUS "Warning: Dynamic building not supported yet. Building static.") + set(VCPKG_LIBRARY_LINKAGE static) + set(VCPKG_CRT_LINKAGE dynamic) +endif() + +include(vcpkg_common_functions) + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO highfidelity/etc2comp + REF 7f1843bf07825c21cab711360c1ddbad04641036 + SHA512 d747076acda8537d39585858c793a35c3dcc9ef283d723619a47f8c81ec1454c95b3340ad35f0655a939eae5b8271c801c48a9a7568311a01903a344c44af25b + HEAD_REF master +) + +vcpkg_configure_cmake( + SOURCE_PATH ${SOURCE_PATH} +) + +vcpkg_install_cmake() + +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) +file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/etc2comp) +file(RENAME ${CURRENT_PACKAGES_DIR}/share/etc2comp/LICENSE ${CURRENT_PACKAGES_DIR}/share/etc2comp/copyright) + +vcpkg_copy_pdbs() + diff --git a/cmake/ports/gli/CONTROL b/cmake/ports/gli/CONTROL new file mode 100644 index 0000000000..b8edac798c --- /dev/null +++ b/cmake/ports/gli/CONTROL @@ -0,0 +1,4 @@ +Source: gli +Version: 0.8.2-1 +Build-Depends: glm +Description: OpenGL Image (GLI) https://gli.g-truc.net diff --git a/cmake/ports/gli/portfile.cmake b/cmake/ports/gli/portfile.cmake new file mode 100644 index 0000000000..3052336198 --- /dev/null +++ b/cmake/ports/gli/portfile.cmake @@ -0,0 +1,19 @@ +#header-only library +include(vcpkg_common_functions) + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO g-truc/gli + REF 0.8.2.0 + SHA512 c254a4e1497d0add985e4a882c552db99c512cc0e9cc72145d51a6e7deada817d624d9818099a47136a8a3ef1223a26a34e355e3c713166f0bb062e506059834 + HEAD_REF master +) + +# Put the license file where vcpkg expects it +# manual.md contains the "licenses" section for the project +file(COPY ${SOURCE_PATH}/manual.md DESTINATION ${CURRENT_PACKAGES_DIR}/share/gli/) +file(RENAME ${CURRENT_PACKAGES_DIR}/share/gli/manual.md ${CURRENT_PACKAGES_DIR}/share/gli/copyright) + +# Copy the glm header files +file(GLOB HEADER_FILES "${SOURCE_PATH}/gli/*.hpp" "${SOURCE_PATH}/gli/core") +file(COPY ${HEADER_FILES} DESTINATION ${CURRENT_PACKAGES_DIR}/include/gli) diff --git a/cmake/ports/glm/CONTROL b/cmake/ports/glm/CONTROL new file mode 100644 index 0000000000..3da56cf543 --- /dev/null +++ b/cmake/ports/glm/CONTROL @@ -0,0 +1,3 @@ +Source: glm +Version: 0.9.9.3 +Description: OpenGL Mathematics (GLM) https://glm.g-truc.net diff --git a/cmake/ports/glm/disable_warnings_as_error.patch b/cmake/ports/glm/disable_warnings_as_error.patch new file mode 100644 index 0000000000..f87616b1ec --- /dev/null +++ b/cmake/ports/glm/disable_warnings_as_error.patch @@ -0,0 +1,13 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 756673a3..5fbc8906 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -216,7 +216,7 @@ elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + message("GLM: Visual C++ - ${CMAKE_CXX_COMPILER_ID} compiler") + endif() + +- add_compile_options(/W4 /WX) ++ add_compile_options(/W4) + add_compile_options(/wd4309 /wd4324 /wd4389 /wd4127 /wd4267 /wd4146 /wd4201 /wd4464 /wd4514 /wd4701 /wd4820 /wd4365) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) + endif() diff --git a/cmake/ports/glm/portfile.cmake b/cmake/ports/glm/portfile.cmake new file mode 100644 index 0000000000..69ddd267cf --- /dev/null +++ b/cmake/ports/glm/portfile.cmake @@ -0,0 +1,32 @@ +include(vcpkg_common_functions) + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO g-truc/glm + REF 0.9.9.3 + SHA512 44152ea6438763feda3b78813287fd59d3574a9630a41647a157825bf5ce4a18fbbecae5a5ccd94acc118ed3d42cbce53d3a67f25632d0c00ab77e7de2bb4650 + HEAD_REF master +) + +vcpkg_apply_patches( + SOURCE_PATH ${SOURCE_PATH} + PATCHES "${CMAKE_CURRENT_LIST_DIR}/disable_warnings_as_error.patch" +) + +vcpkg_configure_cmake( + SOURCE_PATH ${SOURCE_PATH} + OPTIONS -DGLM_TEST_ENABLE=OFF +) + +vcpkg_install_cmake() + +vcpkg_fixup_cmake_targets(CONFIG_PATH "lib/cmake/glm") + +vcpkg_copy_pdbs() + +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share) + +# Put the license file where vcpkg expects it +file(COPY ${SOURCE_PATH}/manual.md DESTINATION ${CURRENT_PACKAGES_DIR}/share/glm/) +file(RENAME ${CURRENT_PACKAGES_DIR}/share/glm/manual.md ${CURRENT_PACKAGES_DIR}/share/glm/copyright) diff --git a/cmake/ports/glslang/CONTROL b/cmake/ports/glslang/CONTROL new file mode 100644 index 0000000000..74a2530e4c --- /dev/null +++ b/cmake/ports/glslang/CONTROL @@ -0,0 +1,3 @@ +Source: glslang +Version: untagged-048c4dbc7f021224a933-1 +Description: Khronos reference front-end for GLSL and ESSL, and sample SPIR-V generator diff --git a/cmake/ports/glslang/copyright b/cmake/ports/glslang/copyright new file mode 100644 index 0000000000..dfffea6a8c --- /dev/null +++ b/cmake/ports/glslang/copyright @@ -0,0 +1,35 @@ +// +//Copyright (C) 2002-2005 3Dlabs Inc. Ltd. +//Copyright (C) 2012-2013 LunarG, Inc. +// +//All rights reserved. +// +//Redistribution and use in source and binary forms, with or without +//modification, are permitted provided that the following conditions +//are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of 3Dlabs Inc. Ltd. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +//POSSIBILITY OF SUCH DAMAGE. +// diff --git a/cmake/ports/glslang/portfile.cmake b/cmake/ports/glslang/portfile.cmake new file mode 100644 index 0000000000..72d62d26f3 --- /dev/null +++ b/cmake/ports/glslang/portfile.cmake @@ -0,0 +1,26 @@ +include(vcpkg_common_functions) + +vcpkg_check_linkage(ONLY_STATIC_LIBRARY) + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO KhronosGroup/glslang + REF untagged-048c4dbc7f021224a933 + SHA512 e3097dd2db88320982d7da1ddce138839daf3251935909c3998a114aeadd408760b26b2d7c7ee547fb0519895ac1853a45c23df2eecf61135849b080252e9dec + HEAD_REF master +) + +vcpkg_configure_cmake( + SOURCE_PATH ${SOURCE_PATH} + PREFER_NINJA + OPTIONS -DCMAKE_DEBUG_POSTFIX=d +) + +vcpkg_install_cmake() + +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) +file(RENAME "${CURRENT_PACKAGES_DIR}/bin" "${CURRENT_PACKAGES_DIR}/tools") +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/bin") + +# Handle copyright +file(COPY ${CMAKE_CURRENT_LIST_DIR}/copyright DESTINATION ${CURRENT_PACKAGES_DIR}/share/glslang) diff --git a/cmake/ports/hifi-client-deps/CONTROL b/cmake/ports/hifi-client-deps/CONTROL new file mode 100644 index 0000000000..7d4727b364 --- /dev/null +++ b/cmake/ports/hifi-client-deps/CONTROL @@ -0,0 +1,4 @@ +Source: hifi-client-deps +Version: 0 +Description: Collected dependencies for High Fidelity applications +Build-Depends: hifi-deps, glslang, nlohmann-json, openvr (windows), sdl2 (!android), spirv-cross (!android), spirv-tools (!android), vulkanmemoryallocator diff --git a/cmake/ports/hifi-client-deps/portfile.cmake b/cmake/ports/hifi-client-deps/portfile.cmake new file mode 100644 index 0000000000..065116c276 --- /dev/null +++ b/cmake/ports/hifi-client-deps/portfile.cmake @@ -0,0 +1 @@ +set(VCPKG_POLICY_EMPTY_PACKAGE enabled) diff --git a/cmake/ports/hifi-deps/CONTROL b/cmake/ports/hifi-deps/CONTROL new file mode 100644 index 0000000000..e202d0c8f8 --- /dev/null +++ b/cmake/ports/hifi-deps/CONTROL @@ -0,0 +1,4 @@ +Source: hifi-deps +Version: 0 +Description: Collected dependencies for High Fidelity applications +Build-Depends: bullet3, draco, etc2comp, glm, nvtt, openssl (windows), tbb (!android&!osx), zlib diff --git a/cmake/ports/hifi-deps/portfile.cmake b/cmake/ports/hifi-deps/portfile.cmake new file mode 100644 index 0000000000..065116c276 --- /dev/null +++ b/cmake/ports/hifi-deps/portfile.cmake @@ -0,0 +1 @@ +set(VCPKG_POLICY_EMPTY_PACKAGE enabled) diff --git a/cmake/ports/hifi-host-tools/CONTROL b/cmake/ports/hifi-host-tools/CONTROL new file mode 100644 index 0000000000..ec8eda965e --- /dev/null +++ b/cmake/ports/hifi-host-tools/CONTROL @@ -0,0 +1,4 @@ +Source: hifi-host-tools +Version: 0 +Description: Host build system compatible tools for building High Fidelity applications +Build-Depends: hifi-scribe, glslang, spirv-cross, spirv-tools diff --git a/cmake/ports/hifi-host-tools/portfile.cmake b/cmake/ports/hifi-host-tools/portfile.cmake new file mode 100644 index 0000000000..065116c276 --- /dev/null +++ b/cmake/ports/hifi-host-tools/portfile.cmake @@ -0,0 +1 @@ +set(VCPKG_POLICY_EMPTY_PACKAGE enabled) diff --git a/cmake/ports/hifi-scribe/CONTROL b/cmake/ports/hifi-scribe/CONTROL new file mode 100644 index 0000000000..630bba8593 --- /dev/null +++ b/cmake/ports/hifi-scribe/CONTROL @@ -0,0 +1,3 @@ +Source: hifi-scribe +Version: 1bd638a36ca771e5a68d01985b6389b71835cbd2 +Description: Scribe is a language for generating glsl files from templates diff --git a/cmake/ports/hifi-scribe/portfile.cmake b/cmake/ports/hifi-scribe/portfile.cmake new file mode 100644 index 0000000000..2b69f7b887 --- /dev/null +++ b/cmake/ports/hifi-scribe/portfile.cmake @@ -0,0 +1,19 @@ +set(VCPKG_POLICY_EMPTY_PACKAGE enabled) +include(vcpkg_common_functions) + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO highfidelity/scribe + REF 1bd638a36ca771e5a68d01985b6389b71835cbd2 + SHA512 dbe241d86df3912e544f6b9839873f9875df54efc93822b145e7b13243eaf2e3d690bc8a28b1e52d05bdcd7e68fca6b0b2f5c43ffd0f56a9b7a50d54dcf9e31e + HEAD_REF master +) + +vcpkg_configure_cmake(SOURCE_PATH ${SOURCE_PATH}) +vcpkg_install_cmake() +vcpkg_copy_pdbs() + +# cleanup +configure_file(${SOURCE_PATH}/LICENSE ${CURRENT_PACKAGES_DIR}/share/hifi-scribe/copyright COPYONLY) +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/tools) + diff --git a/cmake/ports/nlohmann-json/CONTROL b/cmake/ports/nlohmann-json/CONTROL new file mode 100644 index 0000000000..8ee107a92c --- /dev/null +++ b/cmake/ports/nlohmann-json/CONTROL @@ -0,0 +1,3 @@ +Source: nlohmann-json +Version: 3.3.0 +Description: JSON for Modern C++ diff --git a/cmake/ports/nlohmann-json/portfile.cmake b/cmake/ports/nlohmann-json/portfile.cmake new file mode 100644 index 0000000000..5cee9565e8 --- /dev/null +++ b/cmake/ports/nlohmann-json/portfile.cmake @@ -0,0 +1,18 @@ +include(vcpkg_common_functions) + +set(SOURCE_VERSION 3.3.0) + +vcpkg_download_distfile(HEADER + URLS "https://github.com/nlohmann/json/releases/download/v${SOURCE_VERSION}/json.hpp" + FILENAME "nlohmann-json-${SOURCE_VERSION}.hpp" + SHA512 c4e4bb84d1488f87a02c4e12409491225e345cc508e6dbbee1a3542fbd4953052c256d0fe78c4d3ce02d44c3a2155fe66f0c8a93a3851ddf94fec4f9f3fd6918 +) + +vcpkg_download_distfile(LICENSE + URLS "https://github.com/nlohmann/json/raw/v${SOURCE_VERSION}/LICENSE.MIT" + FILENAME "nlohmann-json-LICENSE-${SOURCE_VERSION}.txt" + SHA512 0fdb404547467f4523579acde53066badf458504d33edbb6e39df0ae145ed27d48a720189a60c225c0aab05f2aa4ce4050dcb241b56dc693f7ee9f54c8728a75 +) + +file(INSTALL ${HEADER} DESTINATION ${CURRENT_PACKAGES_DIR}/include/nlohmann RENAME json.hpp) +file(INSTALL ${LICENSE} DESTINATION ${CURRENT_PACKAGES_DIR}/share/nlohmann-json RENAME copyright) diff --git a/cmake/ports/nvtt/CONTROL b/cmake/ports/nvtt/CONTROL new file mode 100644 index 0000000000..59ba36d830 --- /dev/null +++ b/cmake/ports/nvtt/CONTROL @@ -0,0 +1,3 @@ +Source: nvtt +Version: 8c7e6b40ee5095f227b75880fabd89c99d6f34c0 +Description: Texture processing tools with support for Direct3D 10 and 11 formats. \ No newline at end of file diff --git a/cmake/ports/nvtt/portfile.cmake b/cmake/ports/nvtt/portfile.cmake new file mode 100644 index 0000000000..13b1253322 --- /dev/null +++ b/cmake/ports/nvtt/portfile.cmake @@ -0,0 +1,39 @@ +# Common Ambient Variables: +# VCPKG_ROOT_DIR = +# TARGET_TRIPLET is the current triplet (x86-windows, etc) +# PORT is the current port name (zlib, etc) +# CURRENT_BUILDTREES_DIR = ${VCPKG_ROOT_DIR}\buildtrees\${PORT} +# CURRENT_PACKAGES_DIR = ${VCPKG_ROOT_DIR}\packages\${PORT}_${TARGET_TRIPLET} +# +include(vcpkg_common_functions) + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO highfidelity/nvidia-texture-tools + REF 8c7e6b40ee5095f227b75880fabd89c99d6f34c0 + SHA512 f107d19dbbd6651ef2126b1422a5db8db291bf70311ac4fb1dbacb5ceaa8752fee38becbd32964f57596f0b84e1223bb2c3ff9d9c4fdc65c3e77a47836657cef + HEAD_REF master +) + +vcpkg_configure_cmake( + SOURCE_PATH ${SOURCE_PATH} + OPTIONS + -DBUILD_TESTS=OFF + -DBUILD_TOOLS=OFF +) + +vcpkg_install_cmake() + +if(VCPKG_LIBRARY_LINKAGE STREQUAL static) + file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin ${CURRENT_PACKAGES_DIR}/debug/bin) +endif() + +vcpkg_copy_pdbs() + +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share) + +# Handle copyright +file(REMOVE ${CURRENT_PACKAGES_DIR}/share/doc/nvtt/LICENSE) +file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/nvtt) +file(RENAME ${CURRENT_PACKAGES_DIR}/share/nvtt/LICENSE ${CURRENT_PACKAGES_DIR}/share/nvtt/copyright) diff --git a/cmake/ports/openssl-android/CONTROL b/cmake/ports/openssl-android/CONTROL new file mode 100644 index 0000000000..66a7b67ba6 --- /dev/null +++ b/cmake/ports/openssl-android/CONTROL @@ -0,0 +1,3 @@ +Source: openssl-android +Version: 1.0.2p +Description: OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. It is also a general-purpose cryptography library. diff --git a/cmake/ports/openssl-android/LICENSE.txt b/cmake/ports/openssl-android/LICENSE.txt new file mode 100644 index 0000000000..e953f590cb --- /dev/null +++ b/cmake/ports/openssl-android/LICENSE.txt @@ -0,0 +1,125 @@ + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a double license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2018 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + diff --git a/cmake/ports/openssl-android/portfile.cmake b/cmake/ports/openssl-android/portfile.cmake new file mode 100644 index 0000000000..54936d254d --- /dev/null +++ b/cmake/ports/openssl-android/portfile.cmake @@ -0,0 +1,24 @@ +include(vcpkg_common_functions) +set(OPENSSL_VERSION 1.1.0g) +set(MASTER_COPY_SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src) + +message("MASTER_COPY_SOURCE_PATH ${MASTER_COPY_SOURCE_PATH}") +vcpkg_download_distfile( + OPENSSL_SOURCE_ARCHIVE + URLS https://hifi-public.s3.amazonaws.com/dependencies/android/openssl-1.1.0g_armv8.tgz?versionId=AiiPjmgUZTgNj7YV1EEx2lL47aDvvvAW + SHA512 5d7bb6e5d3db2340449e2789bcd72da821f0e57483bac46cf06f735dffb5d73c1ca7cc53dd48f3b3979d0fe22b3ae61997c516fc0c4611af4b4b7f480e42b992 + FILENAME openssl-1.1.0g_armv8.tgz +) + +vcpkg_extract_source_archive(${OPENSSL_SOURCE_ARCHIVE}) + +file(COPY ${MASTER_COPY_SOURCE_PATH}/include DESTINATION ${CURRENT_PACKAGES_DIR}) +file(GLOB LIBS ${MASTER_COPY_SOURCE_PATH}/lib/*.a) +file(COPY ${LIBS} DESTINATION ${CURRENT_PACKAGES_DIR}/libs) +file(COPY ${LIBS} DESTINATION ${CURRENT_PACKAGES_DIR}/debug/libs) +file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/LICENSE.txt DESTINATION ${CURRENT_PACKAGES_DIR}/share/openssl-android RENAME copyright) + + + + + diff --git a/cmake/ports/openssl-unix/CMakeLists.txt b/cmake/ports/openssl-unix/CMakeLists.txt new file mode 100644 index 0000000000..7757a4fe78 --- /dev/null +++ b/cmake/ports/openssl-unix/CMakeLists.txt @@ -0,0 +1,136 @@ +cmake_minimum_required(VERSION 3.9) +project(openssl C) + +if(NOT SOURCE_PATH) + message(FATAL_ERROR "Requires SOURCE_PATH") +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Android") + set(PLATFORM android) +elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64") + set(PLATFORM linux-generic64) + else() + set(PLATFORM linux-generic32) + endif() +elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + set(PLATFORM darwin64-x86_64-cc) +elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + set(PLATFORM BSD-generic64) +else() + message(FATAL_ERROR "Unknown platform") +endif() + +get_filename_component(COMPILER_ROOT "${CMAKE_C_COMPILER}" DIRECTORY) + +message("CMAKE_C_COMPILER=${CMAKE_C_COMPILER}") +message("COMPILER_ROOT=${COMPILER_ROOT}") +message("CMAKE_SYSROOT=${CMAKE_SYSROOT}") +message("CMAKE_C_FLAGS=${CMAKE_C_FLAGS}") +message("CMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE}") +message("CMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}") +message("CMAKE_INCLUDE_SYSTEM_FLAG_C=${CMAKE_INCLUDE_SYSTEM_FLAG_C}") + +set(CFLAGS "${CMAKE_C_FLAGS}") +if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(CFLAGS "-Wno-error=unused-command-line-argument ${CMAKE_C_FLAGS}") +endif() +if(CMAKE_C_COMPILER_TARGET) + set(CFLAGS "${CFLAGS} ${CMAKE_C_COMPILE_OPTIONS_TARGET}${CMAKE_C_COMPILER_TARGET}") +endif() +if(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN) + set(CFLAGS "${CFLAGS} ${CMAKE_C_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN}${CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN}") +endif() +if(CMAKE_SYSROOT AND CMAKE_C_COMPILE_OPTIONS_SYSROOT) + set(CFLAGS "${CFLAGS} ${CMAKE_C_COMPILE_OPTIONS_SYSROOT}${CMAKE_SYSROOT}") +endif() + +string(REGEX REPLACE "^ " "" CFLAGS "${CFLAGS}") + +if(CMAKE_HOST_WIN32) + file(TO_NATIVE_PATH ENV_PATH "${COMPILER_ROOT};$ENV{PATH}") +else() + file(TO_NATIVE_PATH ENV_PATH "${COMPILER_ROOT}:$ENV{PATH}") +endif() +set(ENV{ANDROID_DEV} "${CMAKE_SYSROOT}/usr") +set(ENV{CC} "${CMAKE_C_COMPILER}") + +message("ENV{ANDROID_DEV}=$ENV{ANDROID_DEV}") + +get_filename_component(SOURCE_PATH_NAME "${SOURCE_PATH}" NAME) +set(BUILDDIR "${CMAKE_CURRENT_BINARY_DIR}/${SOURCE_PATH_NAME}") + +if(NOT EXISTS "${BUILDDIR}") + file(COPY ${SOURCE_PATH} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +endif() + +get_filename_component(MSYS_BIN_DIR "${MAKE}" DIRECTORY) + + +file(READ "${BUILDDIR}/Configure" _contents) +string(REPLACE "-mandroid" "" _contents "${_contents}") +file(WRITE "${BUILDDIR}/Configure" "${_contents}") + +if(BUILD_SHARED_LIBS) + set(SHARED shared) +else() + set(SHARED no-shared) +endif() + +if(CMAKE_HOST_WIN32) + set(ENV_COMMAND set) + set(PATH_VAR ";%PATH%") +else() + set(ENV_COMMAND export) + set(PATH_VAR ":$ENV{PATH}") +endif() + +add_custom_command( + OUTPUT "${BUILDDIR}/Makefile" + COMMAND ${ENV_COMMAND} CC=${CMAKE_C_COMPILER} + COMMAND ${ENV_COMMAND} AR=${CMAKE_AR} + COMMAND ${ENV_COMMAND} LD=${CMAKE_LINKER} + COMMAND ${ENV_COMMAND} RANLIB=${CMAKE_RANLIB} + COMMAND ${ENV_COMMAND} MAKE=${MAKE} + COMMAND ${ENV_COMMAND} MAKEDEPPROG=${CMAKE_C_COMPILER} + COMMAND ${ENV_COMMAND} "PATH=${MSYS_BIN_DIR}${PATH_VAR}" + COMMAND "${PERL}" Configure + ${SHARED} + enable-static-engine + no-ssl2 + no-krb5 + no-idea + no-bf + no-cast + no-seed + no-md2 + ${PLATFORM} + "--prefix=${CMAKE_INSTALL_PREFIX}" + "--openssldir=/etc/ssl" + ${CFLAGS} + COMMAND "${CMAKE_COMMAND}" "-DDIR=${BUILDDIR}" -P "${CMAKE_CURRENT_LIST_DIR}/remove-deps.cmake" + VERBATIM + WORKING_DIRECTORY "${BUILDDIR}" +) + +add_custom_target(depend + COMMAND ${ENV_COMMAND} "PATH=${MSYS_BIN_DIR}${PATH_VAR}" + COMMAND "${MAKE}" links # depend MAKEDEPPROG=${CMAKE_C_COMPILER} + VERBATIM + WORKING_DIRECTORY "${BUILDDIR}" + DEPENDS "${BUILDDIR}/Makefile" +) +add_custom_target(build_libs ALL + COMMAND ${ENV_COMMAND} "PATH=${MSYS_BIN_DIR}${PATH_VAR}" + COMMAND "${CMAKE_COMMAND}" -E touch "${BUILDDIR}/krb5.h" + COMMAND "${MAKE}" build_libs + VERBATIM + WORKING_DIRECTORY "${BUILDDIR}" + DEPENDS depend + BYPRODUCTS "${BUILDDIR}/libssl.a" "${BUILDDIR}/libcrypto.a" +) + +install( + FILES "${BUILDDIR}/libssl.a" "${BUILDDIR}/libcrypto.a" + DESTINATION lib +) diff --git a/cmake/ports/openssl-unix/CONTROL b/cmake/ports/openssl-unix/CONTROL new file mode 100644 index 0000000000..6413eb3712 --- /dev/null +++ b/cmake/ports/openssl-unix/CONTROL @@ -0,0 +1,3 @@ +Source: openssl-unix +Version: 1.0.2p +Description: OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. It is also a general-purpose cryptography library. diff --git a/cmake/ports/openssl-unix/ConfigureIncludeQuotesFix.patch b/cmake/ports/openssl-unix/ConfigureIncludeQuotesFix.patch new file mode 100644 index 0000000000..09494f5650 --- /dev/null +++ b/cmake/ports/openssl-unix/ConfigureIncludeQuotesFix.patch @@ -0,0 +1,13 @@ +diff --git a/Configure b/Configure +index c98107a..77ad9d3 100644 +--- a/Configure ++++ b/Configure +@@ -972,7 +972,7 @@ PROCESS_ARGS: + } + elsif (/^--with-zlib-include=(.*)$/) + { +- $withargs{"zlib-include"}="-I$1"; ++ $withargs{"zlib-include"}="-I\"$1\""; + } + elsif (/^--with-fipsdir=(.*)$/) + { diff --git a/cmake/ports/openssl-unix/EmbedSymbolsInStaticLibsZ7.patch b/cmake/ports/openssl-unix/EmbedSymbolsInStaticLibsZ7.patch new file mode 100644 index 0000000000..1a8de2c4bd --- /dev/null +++ b/cmake/ports/openssl-unix/EmbedSymbolsInStaticLibsZ7.patch @@ -0,0 +1,25 @@ +diff --git a/util/pl/VC-32.pl b/util/pl/VC-32.pl +index dba96cb..5722f6e 100644 +--- a/util/pl/VC-32.pl ++++ b/util/pl/VC-32.pl +@@ -154,9 +154,17 @@ else + $cflags=$opt_cflags.$base_cflags; + } + +-# generate symbols.pdb unconditionally +-$app_cflag.=" /Zi /Fd\$(TMP_D)/app"; +-$lib_cflag.=" /Zi /Fd\$(TMP_D)/lib"; ++# generate symbols.pdb when building dlls and embed symbols when building static libs ++if ($shlib) ++ { ++ $app_cflag.=" /Zi /Fd\$(TMP_D)/app.pdb"; ++ $lib_cflag.=" /Zi /Fd\$(TMP_D)/lib.pdb"; ++ } ++else ++ { ++ $app_cflag.=" /Z7"; ++ $lib_cflag.=" /Z7"; ++ } + $lflags.=" /debug"; + + $obj='.obj'; diff --git a/cmake/ports/openssl-unix/STRINGIFYPatch.patch b/cmake/ports/openssl-unix/STRINGIFYPatch.patch new file mode 100644 index 0000000000..dd8f9c2972 --- /dev/null +++ b/cmake/ports/openssl-unix/STRINGIFYPatch.patch @@ -0,0 +1,23 @@ +diff --git a/crypto/cversion.c b/crypto/cversion.c +index bfff699..17b7912 100644 +--- a/crypto/cversion.c ++++ b/crypto/cversion.c +@@ -56,6 +56,9 @@ + * [including the GNU Public Licence.] + */ + ++#define STRINGIFY2(x) #x ++#define STRINGIFY(x) STRINGIFY2(x) ++ + #include "cryptlib.h" + + #ifndef NO_WINDOWS_BRAINDEATH +@@ -79,7 +82,7 @@ const char *SSLeay_version(int t) + } + if (t == SSLEAY_CFLAGS) { + #ifdef CFLAGS +- return (CFLAGS); ++ return STRINGIFY(CFLAGS); + #else + return ("compiler: information not available"); + #endif diff --git a/cmake/ports/openssl-unix/portfile.cmake b/cmake/ports/openssl-unix/portfile.cmake new file mode 100644 index 0000000000..1484fc66c6 --- /dev/null +++ b/cmake/ports/openssl-unix/portfile.cmake @@ -0,0 +1,63 @@ +if(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" OR NOT VCPKG_CMAKE_SYSTEM_NAME) + message(FATAL_ERROR "This port is only for openssl on Unix-like systems") +endif() + +include(vcpkg_common_functions) +set(OPENSSL_VERSION 1.0.2p) +set(MASTER_COPY_SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src/openssl-${OPENSSL_VERSION}) + +vcpkg_find_acquire_program(PERL) + +vcpkg_download_distfile(OPENSSL_SOURCE_ARCHIVE + URLS "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz" "https://www.openssl.org/source/old/1.0.2/openssl-${OPENSSL_VERSION}.tar.gz" + FILENAME "openssl-${OPENSSL_VERSION}.tar.gz" + SHA512 958c5a7c3324bbdc8f07dfb13e11329d9a1b4452c07cf41fbd2d42b5fe29c95679332a3476d24c2dc2b88be16e4a24744aba675a05a388c0905756c77a8a2f16 +) + +vcpkg_extract_source_archive(${OPENSSL_SOURCE_ARCHIVE}) +vcpkg_apply_patches( + SOURCE_PATH ${MASTER_COPY_SOURCE_PATH} + PATCHES ${CMAKE_CURRENT_LIST_DIR}/ConfigureIncludeQuotesFix.patch + ${CMAKE_CURRENT_LIST_DIR}/STRINGIFYPatch.patch + ${CMAKE_CURRENT_LIST_DIR}/EmbedSymbolsInStaticLibsZ7.patch +) + +if(CMAKE_HOST_WIN32) + vcpkg_acquire_msys(MSYS_ROOT PACKAGES make) + set(BASH ${MSYS_ROOT}/usr/bin/bash.exe) + set(MAKE ${MSYS_ROOT}/usr/bin/make.exe) +else() + find_program(MAKE make) + if(NOT MAKE) + message(FATAL_ERROR "Could not find make. Please install it through your package manager.") + endif() +endif() + +vcpkg_configure_cmake( + SOURCE_PATH ${CMAKE_CURRENT_LIST_DIR} + PREFER_NINJA + OPTIONS + -DSOURCE_PATH=${MASTER_COPY_SOURCE_PATH} + -DPERL=${PERL} + -DMAKE=${MAKE} + OPTIONS_RELEASE + -DINSTALL_HEADERS=ON +) + +vcpkg_install_cmake() + +file(GLOB HEADERS ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/*/include/openssl/*.h) +set(RESOLVED_HEADERS) +foreach(HEADER ${HEADERS}) + get_filename_component(X "${HEADER}" REALPATH) + list(APPEND RESOLVED_HEADERS "${X}") +endforeach() + +file(INSTALL ${RESOLVED_HEADERS} DESTINATION ${CURRENT_PACKAGES_DIR}/include/openssl) +file(INSTALL ${MASTER_COPY_SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/openssl-unix RENAME copyright) + +if(VCPKG_LIBRARY_LINKAGE STREQUAL "static") + file(COPY ${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share/openssl) +endif() + +vcpkg_test_cmake(PACKAGE_NAME OpenSSL MODULE) diff --git a/cmake/ports/openssl-unix/remove-deps.cmake b/cmake/ports/openssl-unix/remove-deps.cmake new file mode 100644 index 0000000000..53ad6ef290 --- /dev/null +++ b/cmake/ports/openssl-unix/remove-deps.cmake @@ -0,0 +1,7 @@ +file(GLOB_RECURSE MAKEFILES ${DIR}/*/Makefile) +foreach(MAKEFILE ${MAKEFILES}) + message("removing deps from ${MAKEFILE}") + file(READ "${MAKEFILE}" _contents) + string(REGEX REPLACE "\n# DO NOT DELETE THIS LINE.*" "" _contents "${_contents}") + file(WRITE "${MAKEFILE}" "${_contents}") +endforeach() diff --git a/cmake/ports/openssl-unix/usage b/cmake/ports/openssl-unix/usage new file mode 100644 index 0000000000..cf83f33916 --- /dev/null +++ b/cmake/ports/openssl-unix/usage @@ -0,0 +1,4 @@ +The package openssl is compatible with built-in CMake targets: + + find_package(OpenSSL REQUIRED) + target_link_libraries(main PRIVATE OpenSSL::SSL OpenSSL::Crypto) diff --git a/cmake/ports/openssl-unix/vcpkg-cmake-wrapper.cmake b/cmake/ports/openssl-unix/vcpkg-cmake-wrapper.cmake new file mode 100644 index 0000000000..3d7255c5dd --- /dev/null +++ b/cmake/ports/openssl-unix/vcpkg-cmake-wrapper.cmake @@ -0,0 +1,10 @@ +_find_package(${ARGS}) +if(OPENSSL_FOUND) + find_library(OPENSSL_DL_LIBRARY NAMES dl) + if(OPENSSL_DL_LIBRARY) + list(APPEND OPENSSL_LIBRARIES "dl") + if(TARGET OpenSSL::Crypto) + set_property(TARGET OpenSSL::Crypto APPEND PROPERTY INTERFACE_LINK_LIBRARIES "dl") + endif() + endif() +endif() diff --git a/cmake/ports/openssl-windows/CONTROL b/cmake/ports/openssl-windows/CONTROL new file mode 100644 index 0000000000..881c311d00 --- /dev/null +++ b/cmake/ports/openssl-windows/CONTROL @@ -0,0 +1,3 @@ +Source: openssl-windows +Version: 1.0.2p-1 +Description: OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. It is also a general-purpose cryptography library. diff --git a/cmake/ports/openssl-windows/ConfigureIncludeQuotesFix.patch b/cmake/ports/openssl-windows/ConfigureIncludeQuotesFix.patch new file mode 100644 index 0000000000..09494f5650 --- /dev/null +++ b/cmake/ports/openssl-windows/ConfigureIncludeQuotesFix.patch @@ -0,0 +1,13 @@ +diff --git a/Configure b/Configure +index c98107a..77ad9d3 100644 +--- a/Configure ++++ b/Configure +@@ -972,7 +972,7 @@ PROCESS_ARGS: + } + elsif (/^--with-zlib-include=(.*)$/) + { +- $withargs{"zlib-include"}="-I$1"; ++ $withargs{"zlib-include"}="-I\"$1\""; + } + elsif (/^--with-fipsdir=(.*)$/) + { diff --git a/cmake/ports/openssl-windows/EmbedSymbolsInStaticLibsZ7.patch b/cmake/ports/openssl-windows/EmbedSymbolsInStaticLibsZ7.patch new file mode 100644 index 0000000000..1a8de2c4bd --- /dev/null +++ b/cmake/ports/openssl-windows/EmbedSymbolsInStaticLibsZ7.patch @@ -0,0 +1,25 @@ +diff --git a/util/pl/VC-32.pl b/util/pl/VC-32.pl +index dba96cb..5722f6e 100644 +--- a/util/pl/VC-32.pl ++++ b/util/pl/VC-32.pl +@@ -154,9 +154,17 @@ else + $cflags=$opt_cflags.$base_cflags; + } + +-# generate symbols.pdb unconditionally +-$app_cflag.=" /Zi /Fd\$(TMP_D)/app"; +-$lib_cflag.=" /Zi /Fd\$(TMP_D)/lib"; ++# generate symbols.pdb when building dlls and embed symbols when building static libs ++if ($shlib) ++ { ++ $app_cflag.=" /Zi /Fd\$(TMP_D)/app.pdb"; ++ $lib_cflag.=" /Zi /Fd\$(TMP_D)/lib.pdb"; ++ } ++else ++ { ++ $app_cflag.=" /Z7"; ++ $lib_cflag.=" /Z7"; ++ } + $lflags.=" /debug"; + + $obj='.obj'; diff --git a/cmake/ports/openssl-windows/STRINGIFYPatch.patch b/cmake/ports/openssl-windows/STRINGIFYPatch.patch new file mode 100644 index 0000000000..dd8f9c2972 --- /dev/null +++ b/cmake/ports/openssl-windows/STRINGIFYPatch.patch @@ -0,0 +1,23 @@ +diff --git a/crypto/cversion.c b/crypto/cversion.c +index bfff699..17b7912 100644 +--- a/crypto/cversion.c ++++ b/crypto/cversion.c +@@ -56,6 +56,9 @@ + * [including the GNU Public Licence.] + */ + ++#define STRINGIFY2(x) #x ++#define STRINGIFY(x) STRINGIFY2(x) ++ + #include "cryptlib.h" + + #ifndef NO_WINDOWS_BRAINDEATH +@@ -79,7 +82,7 @@ const char *SSLeay_version(int t) + } + if (t == SSLEAY_CFLAGS) { + #ifdef CFLAGS +- return (CFLAGS); ++ return STRINGIFY(CFLAGS); + #else + return ("compiler: information not available"); + #endif diff --git a/cmake/ports/openssl-windows/portfile.cmake b/cmake/ports/openssl-windows/portfile.cmake new file mode 100644 index 0000000000..d58d51431e --- /dev/null +++ b/cmake/ports/openssl-windows/portfile.cmake @@ -0,0 +1,163 @@ +if(VCPKG_CMAKE_SYSTEM_NAME) + message(FATAL_ERROR "This port is only for building openssl on Windows Desktop") +endif() + +include(vcpkg_common_functions) +set(OPENSSL_VERSION 1.0.2p) +set(MASTER_COPY_SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src/openssl-${OPENSSL_VERSION}) + +vcpkg_find_acquire_program(PERL) + +get_filename_component(PERL_EXE_PATH ${PERL} DIRECTORY) +set(ENV{PATH} "$ENV{PATH};${PERL_EXE_PATH}") + +vcpkg_download_distfile(OPENSSL_SOURCE_ARCHIVE + URLS "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz" "https://www.openssl.org/source/old/1.0.2/openssl-${OPENSSL_VERSION}.tar.gz" + FILENAME "openssl-${OPENSSL_VERSION}.tar.gz" + SHA512 958c5a7c3324bbdc8f07dfb13e11329d9a1b4452c07cf41fbd2d42b5fe29c95679332a3476d24c2dc2b88be16e4a24744aba675a05a388c0905756c77a8a2f16 +) + +vcpkg_extract_source_archive(${OPENSSL_SOURCE_ARCHIVE}) +vcpkg_apply_patches( + SOURCE_PATH ${MASTER_COPY_SOURCE_PATH} + PATCHES ${CMAKE_CURRENT_LIST_DIR}/ConfigureIncludeQuotesFix.patch + ${CMAKE_CURRENT_LIST_DIR}/STRINGIFYPatch.patch + ${CMAKE_CURRENT_LIST_DIR}/EmbedSymbolsInStaticLibsZ7.patch +) + +vcpkg_find_acquire_program(NASM) +get_filename_component(NASM_EXE_PATH ${NASM} DIRECTORY) +set(ENV{PATH} "${NASM_EXE_PATH};$ENV{PATH}") + +vcpkg_find_acquire_program(JOM) + +set(CONFIGURE_COMMAND ${PERL} Configure + enable-static-engine + enable-capieng + no-ssl2 + -utf-8 +) + +if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86") + set(OPENSSL_ARCH VC-WIN32) + set(OPENSSL_DO "ms\\do_nasm.bat") +elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64") + set(OPENSSL_ARCH VC-WIN64A) + set(OPENSSL_DO "ms\\do_win64a.bat") +else() + message(FATAL_ERROR "Unsupported target architecture: ${VCPKG_TARGET_ARCHITECTURE}") +endif() + +if(VCPKG_LIBRARY_LINKAGE STREQUAL dynamic) + set(OPENSSL_MAKEFILE "ms\\ntdll.mak") +else() + set(OPENSSL_MAKEFILE "ms\\nt.mak") +endif() + +file(REMOVE_RECURSE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg) + + +if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release") + file(COPY ${MASTER_COPY_SOURCE_PATH} DESTINATION ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel) + set(SOURCE_PATH_RELEASE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/openssl-${OPENSSL_VERSION}) + set(OPENSSLDIR_RELEASE ${CURRENT_PACKAGES_DIR}) + + message(STATUS "Configure ${TARGET_TRIPLET}-rel") + vcpkg_execute_required_process( + COMMAND ${CONFIGURE_COMMAND} ${OPENSSL_ARCH} "--prefix=${OPENSSLDIR_RELEASE}" "--openssldir=${OPENSSLDIR_RELEASE}" -FS + WORKING_DIRECTORY ${SOURCE_PATH_RELEASE} + LOGNAME configure-perl-${TARGET_TRIPLET}-${CMAKE_BUILD_TYPE}-rel + ) + vcpkg_execute_required_process( + COMMAND ${OPENSSL_DO} + WORKING_DIRECTORY ${SOURCE_PATH_RELEASE} + LOGNAME configure-do-${TARGET_TRIPLET}-${CMAKE_BUILD_TYPE}-rel + ) + message(STATUS "Configure ${TARGET_TRIPLET}-rel done") + + message(STATUS "Build ${TARGET_TRIPLET}-rel") + # Openssl's buildsystem has a race condition which will cause JOM to fail at some point. + # This is ok; we just do as much work as we can in parallel first, then follow up with a single-threaded build. + make_directory(${SOURCE_PATH_RELEASE}/inc32/openssl) + execute_process( + COMMAND ${JOM} -k -j $ENV{NUMBER_OF_PROCESSORS} -f ${OPENSSL_MAKEFILE} + WORKING_DIRECTORY ${SOURCE_PATH_RELEASE} + OUTPUT_FILE ${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-rel-0-out.log + ERROR_FILE ${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-rel-0-err.log + ) + vcpkg_execute_required_process( + COMMAND nmake -f ${OPENSSL_MAKEFILE} install + WORKING_DIRECTORY ${SOURCE_PATH_RELEASE} + LOGNAME build-${TARGET_TRIPLET}-rel-1) + + message(STATUS "Build ${TARGET_TRIPLET}-rel done") +endif() + + +if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug") + message(STATUS "Configure ${TARGET_TRIPLET}-dbg") + file(COPY ${MASTER_COPY_SOURCE_PATH} DESTINATION ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg) + set(SOURCE_PATH_DEBUG ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg/openssl-${OPENSSL_VERSION}) + set(OPENSSLDIR_DEBUG ${CURRENT_PACKAGES_DIR}/debug) + + vcpkg_execute_required_process( + COMMAND ${CONFIGURE_COMMAND} debug-${OPENSSL_ARCH} "--prefix=${OPENSSLDIR_DEBUG}" "--openssldir=${OPENSSLDIR_DEBUG}" -FS + WORKING_DIRECTORY ${SOURCE_PATH_DEBUG} + LOGNAME configure-perl-${TARGET_TRIPLET}-${CMAKE_BUILD_TYPE}-dbg + ) + vcpkg_execute_required_process( + COMMAND ${OPENSSL_DO} + WORKING_DIRECTORY ${SOURCE_PATH_DEBUG} + LOGNAME configure-do-${TARGET_TRIPLET}-${CMAKE_BUILD_TYPE}-dbg + ) + message(STATUS "Configure ${TARGET_TRIPLET}-dbg done") + + message(STATUS "Build ${TARGET_TRIPLET}-dbg") + make_directory(${SOURCE_PATH_DEBUG}/inc32/openssl) + execute_process( + COMMAND ${JOM} -k -j $ENV{NUMBER_OF_PROCESSORS} -f ${OPENSSL_MAKEFILE} + WORKING_DIRECTORY ${SOURCE_PATH_DEBUG} + OUTPUT_FILE ${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-dbg-0-out.log + ERROR_FILE ${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-dbg-0-err.log + ) + vcpkg_execute_required_process( + COMMAND nmake -f ${OPENSSL_MAKEFILE} install + WORKING_DIRECTORY ${SOURCE_PATH_DEBUG} + LOGNAME build-${TARGET_TRIPLET}-dbg-1) + + message(STATUS "Build ${TARGET_TRIPLET}-dbg done") +endif() + + +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) +file(REMOVE + ${CURRENT_PACKAGES_DIR}/debug/bin/openssl.exe + ${CURRENT_PACKAGES_DIR}/debug/openssl.cnf + ${CURRENT_PACKAGES_DIR}/openssl.cnf +) + +file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/tools/openssl/) +file(RENAME ${CURRENT_PACKAGES_DIR}/bin/openssl.exe ${CURRENT_PACKAGES_DIR}/tools/openssl/openssl.exe) + +vcpkg_copy_tool_dependencies(${CURRENT_PACKAGES_DIR}/tools/openssl) + +if(VCPKG_LIBRARY_LINKAGE STREQUAL static) + # They should be empty, only the exes deleted above were in these directories + file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/bin/) + file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin/) +endif() + +file(READ "${CURRENT_PACKAGES_DIR}/include/openssl/dtls1.h" _contents) +string(REPLACE "" "" _contents "${_contents}") +file(WRITE "${CURRENT_PACKAGES_DIR}/include/openssl/dtls1.h" "${_contents}") + +file(READ "${CURRENT_PACKAGES_DIR}/include/openssl/rand.h" _contents) +string(REPLACE "# include " "#ifndef _WINSOCKAPI_\n#define _WINSOCKAPI_\n#endif\n# include " _contents "${_contents}") +file(WRITE "${CURRENT_PACKAGES_DIR}/include/openssl/rand.h" "${_contents}") + +vcpkg_copy_pdbs() + +file(COPY ${CMAKE_CURRENT_LIST_DIR}/usage DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT}) +file(INSTALL ${MASTER_COPY_SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT} RENAME copyright) + +vcpkg_test_cmake(PACKAGE_NAME OpenSSL MODULE) diff --git a/cmake/ports/openssl-windows/usage b/cmake/ports/openssl-windows/usage new file mode 100644 index 0000000000..cf83f33916 --- /dev/null +++ b/cmake/ports/openssl-windows/usage @@ -0,0 +1,4 @@ +The package openssl is compatible with built-in CMake targets: + + find_package(OpenSSL REQUIRED) + target_link_libraries(main PRIVATE OpenSSL::SSL OpenSSL::Crypto) diff --git a/cmake/ports/openssl/CONTROL b/cmake/ports/openssl/CONTROL new file mode 100644 index 0000000000..16a1932485 --- /dev/null +++ b/cmake/ports/openssl/CONTROL @@ -0,0 +1,4 @@ +Source: openssl +Version: 0 +Description: OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. It is also a general-purpose cryptography library. +Build-Depends: openssl-windows (windows), openssl-android (android), openssl-unix (!android&!windows) diff --git a/cmake/ports/openssl/portfile.cmake b/cmake/ports/openssl/portfile.cmake new file mode 100644 index 0000000000..3d55c367f5 --- /dev/null +++ b/cmake/ports/openssl/portfile.cmake @@ -0,0 +1,2 @@ +set(VCPKG_POLICY_EMPTY_PACKAGE enabled) +file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/usage DESTINATION ${CURRENT_PACKAGES_DIR}/share/openssl/) diff --git a/cmake/ports/openssl/usage b/cmake/ports/openssl/usage new file mode 100644 index 0000000000..cf83f33916 --- /dev/null +++ b/cmake/ports/openssl/usage @@ -0,0 +1,4 @@ +The package openssl is compatible with built-in CMake targets: + + find_package(OpenSSL REQUIRED) + target_link_libraries(main PRIVATE OpenSSL::SSL OpenSSL::Crypto) diff --git a/cmake/ports/openvr/CONTROL b/cmake/ports/openvr/CONTROL new file mode 100644 index 0000000000..b0f337d0a9 --- /dev/null +++ b/cmake/ports/openvr/CONTROL @@ -0,0 +1,3 @@ +Source: openvr +Version: 1.0.16 +Description: an API and runtime that allows access to VR hardware from multiple vendors without requiring that applications have specific knowledge of the hardware they are targeting. diff --git a/cmake/ports/openvr/portfile.cmake b/cmake/ports/openvr/portfile.cmake new file mode 100644 index 0000000000..5e4211907d --- /dev/null +++ b/cmake/ports/openvr/portfile.cmake @@ -0,0 +1,47 @@ +include(vcpkg_common_functions) + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO ValveSoftware/openvr + REF v1.0.16 + SHA512 967356563ba4232da5361510c7519d3058e09eced4571aadc00d8a75ab1f299a0aebda2b0b10b0ffb6c6a443fd718634d0c0103964e289961449c93e8d7b9d02 + HEAD_REF master +) + +set(VCPKG_LIBRARY_LINKAGE dynamic) + +if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64") + set(ARCH_PATH "win64") +elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86") + set(ARCH_PATH "win32") +else() + message(FATAL_ERROR "Package only supports x64 and x86 windows.") +endif() + +if(VCPKG_CMAKE_SYSTEM_NAME) + message(FATAL_ERROR "Package only supports windows desktop.") +endif() + +file(MAKE_DIRECTORY + ${CURRENT_PACKAGES_DIR}/lib + ${CURRENT_PACKAGES_DIR}/bin + ${CURRENT_PACKAGES_DIR}/debug/lib + ${CURRENT_PACKAGES_DIR}/debug/bin +) +file(COPY ${SOURCE_PATH}/lib/${ARCH_PATH}/openvr_api.lib DESTINATION ${CURRENT_PACKAGES_DIR}/lib) +file(COPY ${SOURCE_PATH}/lib/${ARCH_PATH}/openvr_api.lib DESTINATION ${CURRENT_PACKAGES_DIR}/debug/lib) +file(COPY + ${SOURCE_PATH}/bin/${ARCH_PATH}/openvr_api.dll + ${SOURCE_PATH}/bin/${ARCH_PATH}/openvr_api.pdb + DESTINATION ${CURRENT_PACKAGES_DIR}/bin +) +file(COPY + ${SOURCE_PATH}/bin/${ARCH_PATH}/openvr_api.dll + ${SOURCE_PATH}/bin/${ARCH_PATH}/openvr_api.pdb + DESTINATION ${CURRENT_PACKAGES_DIR}/debug/bin +) +file(COPY ${SOURCE_PATH}/headers DESTINATION ${CURRENT_PACKAGES_DIR}) +file(RENAME ${CURRENT_PACKAGES_DIR}/headers ${CURRENT_PACKAGES_DIR}/include) + +file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/openvr) +file(RENAME ${CURRENT_PACKAGES_DIR}/share/openvr/LICENSE ${CURRENT_PACKAGES_DIR}/share/openvr/copyright) diff --git a/cmake/ports/sdl2/CONTROL b/cmake/ports/sdl2/CONTROL new file mode 100644 index 0000000000..6f39484dd6 --- /dev/null +++ b/cmake/ports/sdl2/CONTROL @@ -0,0 +1,3 @@ +Source: sdl2 +Version: 2.0.8-1 +Description: Simple DirectMedia Layer is a cross-platform development library designed to provide low level access to audio, keyboard, mouse, joystick, and graphics hardware via OpenGL and Direct3D. diff --git a/cmake/ports/sdl2/enable-winrt-cmake.patch b/cmake/ports/sdl2/enable-winrt-cmake.patch new file mode 100644 index 0000000000..dcd2afa67c --- /dev/null +++ b/cmake/ports/sdl2/enable-winrt-cmake.patch @@ -0,0 +1,206 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 73d9407..082fbc5 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -3,7 +3,11 @@ if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) + endif() + + cmake_minimum_required(VERSION 2.8.11) +-project(SDL2 C) ++if(CMAKE_SYSTEM_NAME STREQUAL "WindowsStore") ++ project(SDL2 C CXX) ++else() ++ project(SDL2 C) ++endif() + + # !!! FIXME: this should probably do "MACOSX_RPATH ON" as a target property + # !!! FIXME: for the SDL2 shared library (so you get an +@@ -358,7 +362,6 @@ file(GLOB SOURCE_FILES + ${SDL2_SOURCE_DIR}/src/timer/*.c + ${SDL2_SOURCE_DIR}/src/video/*.c) + +- + if(ASSERTIONS STREQUAL "auto") + # Do nada - use optimization settings to determine the assertion level + elseif(ASSERTIONS STREQUAL "disabled") +@@ -1132,6 +1135,22 @@ elseif(WINDOWS) + file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES}) + ++ if(WINDOWS_STORE) ++ cmake_minimum_required(VERSION 3.0) ++ add_definitions(-DSDL_BUILDING_WINRT=1 -ZW) ++ link_libraries( ++ -nodefaultlib:vccorlib$<$:d> ++ -nodefaultlib:msvcrt$<$:d> ++ vccorlib$<$:d>.lib ++ msvcrt$<$:d>.lib ++ ) ++ endif() ++ ++ if(WINDOWS_STORE) ++ file(GLOB WINRT_SOURCE_FILES ${SDL2_SOURCE_DIR}/src/core/winrt/*.c ${SDL2_SOURCE_DIR}/src/core/winrt/*.cpp) ++ set(SOURCE_FILES ${SOURCE_FILES} ${WINRT_SOURCE_FILES}) ++ endif() ++ + if(MSVC) + # Prevent codegen that would use the VC runtime libraries. + set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/GS-") +@@ -1176,7 +1195,11 @@ elseif(WINDOWS) + check_include_file(d3d11_1.h HAVE_D3D11_H) + check_include_file(ddraw.h HAVE_DDRAW_H) + check_include_file(dsound.h HAVE_DSOUND_H) +- check_include_file(dinput.h HAVE_DINPUT_H) ++ if(WINDOWS_STORE) ++ set(HAVE_DINPUT_H 0) ++ else() ++ check_include_file(dinput.h HAVE_DINPUT_H) ++ endif() + check_include_file(xaudio2.h HAVE_XAUDIO2_H) + check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H) + check_include_file(audioclient.h HAVE_AUDIOCLIENT_H) +@@ -1193,12 +1216,14 @@ elseif(WINDOWS) + endif() + + if(SDL_AUDIO) +- set(SDL_AUDIO_DRIVER_WINMM 1) +- file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c) +- set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES}) +- set(HAVE_SDL_AUDIO TRUE) ++ if(NOT WINDOWS_STORE) ++ set(SDL_AUDIO_DRIVER_WINMM 1) ++ file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c) ++ set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES}) ++ set(HAVE_SDL_AUDIO TRUE) ++ endif() + +- if(HAVE_DSOUND_H) ++ if(HAVE_DSOUND_H AND NOT WINDOWS_STORE) + set(SDL_AUDIO_DRIVER_DSOUND 1) + file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES}) +@@ -1208,9 +1233,10 @@ elseif(WINDOWS) + set(SDL_AUDIO_DRIVER_XAUDIO2 1) + file(GLOB XAUDIO2_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/xaudio2/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${XAUDIO2_AUDIO_SOURCES}) ++ set(HAVE_SDL_AUDIO TRUE) + endif() + +- if(HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H) ++ if(HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H AND NOT WINDOWS_STORE) + set(SDL_AUDIO_DRIVER_WASAPI 1) + file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES}) +@@ -1222,11 +1248,20 @@ elseif(WINDOWS) + if(NOT SDL_LOADSO) + message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled") + endif() +- set(SDL_VIDEO_DRIVER_WINDOWS 1) +- file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c) ++ if(WINDOWS_STORE) ++ set(SDL_VIDEO_DRIVER_WINRT 1) ++ file(GLOB WIN_VIDEO_SOURCES ++ ${SDL2_SOURCE_DIR}/src/video/winrt/*.c ++ ${SDL2_SOURCE_DIR}/src/video/winrt/*.cpp ++ ${SDL2_SOURCE_DIR}/src/render/direct3d11/*.cpp ++ ) ++ else() ++ set(SDL_VIDEO_DRIVER_WINDOWS 1) ++ file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c) ++ endif() + set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES}) + +- if(RENDER_D3D AND HAVE_D3D_H) ++ if(RENDER_D3D AND HAVE_D3D_H AND NOT WINDOWS_STORE) + set(SDL_VIDEO_RENDER_D3D 1) + set(HAVE_RENDER_D3D TRUE) + endif() +@@ -1249,20 +1284,31 @@ elseif(WINDOWS) + endif() + + if(SDL_POWER) +- set(SDL_POWER_WINDOWS 1) +- set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c) ++ if(WINDOWS_STORE) ++ set(SDL_POWER_WINRT 1) ++ set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/winrt/SDL_syspower.cpp) ++ else() ++ set(SDL_POWER_WINDOWS 1) ++ set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c) ++ endif() + set(HAVE_SDL_POWER TRUE) + endif() + + if(SDL_FILESYSTEM) + set(SDL_FILESYSTEM_WINDOWS 1) +- file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c) ++ if(WINDOWS_STORE) ++ file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/winrt/*.cpp) ++ else() ++ file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c) ++ endif() + set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES}) + set(HAVE_SDL_FILESYSTEM TRUE) + endif() + + # Libraries for Win32 native and MinGW +- list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid) ++ if(NOT WINDOWS_STORE) ++ list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid) ++ endif() + + # TODO: in configure.in the check for timers is set on + # cygwin | mingw32* - does this include mingw32CE? +@@ -1284,7 +1330,7 @@ elseif(WINDOWS) + set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES}) + + if(SDL_VIDEO) +- if(VIDEO_OPENGL) ++ if(VIDEO_OPENGL AND NOT WINDOWS_STORE) + set(SDL_VIDEO_OPENGL 1) + set(SDL_VIDEO_OPENGL_WGL 1) + set(SDL_VIDEO_RENDER_OGL 1) +@@ -1688,9 +1734,11 @@ endif() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") + + # Always build SDLmain +-add_library(SDL2main STATIC ${SDLMAIN_SOURCES}) +-target_include_directories(SDL2main PUBLIC $) +-set(_INSTALL_LIBS "SDL2main") ++if(NOT WINDOWS_STORE) ++ add_library(SDL2main STATIC ${SDLMAIN_SOURCES}) ++ target_include_directories(SDL2main PUBLIC $) ++ set(_INSTALL_LIBS "SDL2main") ++endif() + + if(SDL_SHARED) + add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES}) +diff --git a/include/SDL_config.h.cmake b/include/SDL_config.h.cmake +index 9b20398..7ae6e35 100644 +--- a/include/SDL_config.h.cmake ++++ b/include/SDL_config.h.cmake +@@ -298,6 +298,7 @@ + #cmakedefine SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC @SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC@ + #cmakedefine SDL_VIDEO_DRIVER_DUMMY @SDL_VIDEO_DRIVER_DUMMY@ + #cmakedefine SDL_VIDEO_DRIVER_WINDOWS @SDL_VIDEO_DRIVER_WINDOWS@ ++#cmakedefine SDL_VIDEO_DRIVER_WINRT @SDL_VIDEO_DRIVER_WINRT@ + #cmakedefine SDL_VIDEO_DRIVER_WAYLAND @SDL_VIDEO_DRIVER_WAYLAND@ + #cmakedefine SDL_VIDEO_DRIVER_RPI @SDL_VIDEO_DRIVER_RPI@ + #cmakedefine SDL_VIDEO_DRIVER_VIVANTE @SDL_VIDEO_DRIVER_VIVANTE@ +@@ -365,6 +366,7 @@ + #cmakedefine SDL_POWER_ANDROID @SDL_POWER_ANDROID@ + #cmakedefine SDL_POWER_LINUX @SDL_POWER_LINUX@ + #cmakedefine SDL_POWER_WINDOWS @SDL_POWER_WINDOWS@ ++#cmakedefine SDL_POWER_WINRT @SDL_POWER_WINRT@ + #cmakedefine SDL_POWER_MACOSX @SDL_POWER_MACOSX@ + #cmakedefine SDL_POWER_HAIKU @SDL_POWER_HAIKU@ + #cmakedefine SDL_POWER_EMSCRIPTEN @SDL_POWER_EMSCRIPTEN@ +@@ -387,7 +389,7 @@ + #cmakedefine SDL_LIBSAMPLERATE_DYNAMIC @SDL_LIBSAMPLERATE_DYNAMIC@ + + /* Platform specific definitions */ +-#if !defined(__WIN32__) ++#if !defined(__WIN32__) && !defined(__WINRT__) + # if !defined(_STDINT_H_) && !defined(_STDINT_H) && !defined(HAVE_STDINT_H) && !defined(_HAVE_STDINT_H) + typedef unsigned int size_t; + typedef signed char int8_t; diff --git a/cmake/ports/sdl2/export-symbols-only-in-shared-build.patch b/cmake/ports/sdl2/export-symbols-only-in-shared-build.patch new file mode 100644 index 0000000000..7e6d503e23 --- /dev/null +++ b/cmake/ports/sdl2/export-symbols-only-in-shared-build.patch @@ -0,0 +1,24 @@ +# HG changeset patch +# User Mikhail Paulyshka +# Date 1506252750 -10800 +# Sun Sep 24 14:32:30 2017 +0300 +# Branch SDL2-WIN-SYMBOLS_LEACKAGE +# Node ID 46ec9baae30cd4e0c584de125cae4a3cce2864ad +# Parent 8df7a59b55283aa09889522369a2b32674c048de +win32: fix symbols leakage for static libraries + +diff -r 8df7a59b5528 -r 46ec9baae30c include/begin_code.h +--- a/include/begin_code.h Fri Sep 22 11:25:52 2017 -0700 ++++ b/include/begin_code.h Sun Sep 24 14:32:30 2017 +0300 +@@ -58,8 +58,10 @@ + # else + # define DECLSPEC __declspec(dllimport) + # endif ++# elif defined(_DLL) ++# define DECLSPEC __declspec(dllexport) + # else +-# define DECLSPEC __declspec(dllexport) ++# define DECLSPEC + # endif + # elif defined(__OS2__) + # ifdef BUILD_SDL diff --git a/cmake/ports/sdl2/portfile.cmake b/cmake/ports/sdl2/portfile.cmake new file mode 100644 index 0000000000..5d7ac5314d --- /dev/null +++ b/cmake/ports/sdl2/portfile.cmake @@ -0,0 +1,79 @@ +include(vcpkg_common_functions) + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO SDL-Mirror/SDL + REF release-2.0.8 + SHA512 5922dbeb14bb22991160251664b417d3f846867c18b5ecc1bd19c328ffd69b16252b7d45b9a317bafd1207fdb66d93a022dfb239e02447db9babd941956b6b37 + HEAD_REF master +) + +vcpkg_apply_patches( + SOURCE_PATH ${SOURCE_PATH} + PATCHES + ${CMAKE_CURRENT_LIST_DIR}/export-symbols-only-in-shared-build.patch + ${CMAKE_CURRENT_LIST_DIR}/enable-winrt-cmake.patch +) + +string(COMPARE EQUAL "${VCPKG_LIBRARY_LINKAGE}" "static" SDL_STATIC) +string(COMPARE EQUAL "${VCPKG_LIBRARY_LINKAGE}" "dynamic" SDL_SHARED) +string(COMPARE EQUAL "${VCPKG_CRT_LINKAGE}" "static" FORCE_STATIC_VCRT) + +vcpkg_configure_cmake( + SOURCE_PATH ${SOURCE_PATH} + PREFER_NINJA + OPTIONS + -DSDL_STATIC=${SDL_STATIC} + -DSDL_SHARED=${SDL_SHARED} + -DVIDEO_VULKAN=OFF + -DFORCE_STATIC_VCRT=${FORCE_STATIC_VCRT} + -DLIBC=ON +) + +vcpkg_install_cmake() + +if(EXISTS "${CURRENT_PACKAGES_DIR}/cmake") + vcpkg_fixup_cmake_targets(CONFIG_PATH "cmake") +elseif(EXISTS "${CURRENT_PACKAGES_DIR}/lib/cmake/SDL2") + vcpkg_fixup_cmake_targets(CONFIG_PATH "lib/cmake/SDL2") +elseif(EXISTS "${CURRENT_PACKAGES_DIR}/SDL2.framework/Resources") + vcpkg_fixup_cmake_targets(CONFIG_PATH "SDL2.framework/Resources") +endif() + +file(REMOVE_RECURSE + ${CURRENT_PACKAGES_DIR}/debug/include + ${CURRENT_PACKAGES_DIR}/debug/share + ${CURRENT_PACKAGES_DIR}/bin/sdl2-config + ${CURRENT_PACKAGES_DIR}/debug/bin/sdl2-config + ${CURRENT_PACKAGES_DIR}/SDL2.framework + ${CURRENT_PACKAGES_DIR}/debug/SDL2.framework +) + +file(GLOB BINS ${CURRENT_PACKAGES_DIR}/debug/bin/* ${CURRENT_PACKAGES_DIR}/bin/*) +if(NOT BINS) + file(REMOVE_RECURSE + ${CURRENT_PACKAGES_DIR}/bin + ${CURRENT_PACKAGES_DIR}/debug/bin + ) +endif() + +if(NOT VCPKG_CMAKE_SYSTEM_NAME) + if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release") + file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/lib/manual-link) + file(RENAME ${CURRENT_PACKAGES_DIR}/lib/SDL2main.lib ${CURRENT_PACKAGES_DIR}/lib/manual-link/SDL2main.lib) + endif() + if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug") + file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/debug/lib/manual-link) + file(RENAME ${CURRENT_PACKAGES_DIR}/debug/lib/SDL2maind.lib ${CURRENT_PACKAGES_DIR}/debug/lib/manual-link/SDL2maind.lib) + endif() + + file(GLOB SHARE_FILES ${CURRENT_PACKAGES_DIR}/share/sdl2/*.cmake) + foreach(SHARE_FILE ${SHARE_FILES}) + file(READ "${SHARE_FILE}" _contents) + string(REPLACE "lib/SDL2main" "lib/manual-link/SDL2main" _contents "${_contents}") + file(WRITE "${SHARE_FILE}" "${_contents}") + endforeach() +endif() + +file(INSTALL ${SOURCE_PATH}/COPYING.txt DESTINATION ${CURRENT_PACKAGES_DIR}/share/sdl2 RENAME copyright) +vcpkg_copy_pdbs() diff --git a/cmake/ports/shaderc/0001-Do-not-generate-build-version.inc.patch b/cmake/ports/shaderc/0001-Do-not-generate-build-version.inc.patch new file mode 100644 index 0000000000..41cc812201 --- /dev/null +++ b/cmake/ports/shaderc/0001-Do-not-generate-build-version.inc.patch @@ -0,0 +1,30 @@ +From e8e12e856cbc41f9bdcc83bc87eb5013df199ee1 Mon Sep 17 00:00:00 2001 +From: vlj +Date: Fri, 2 Dec 2016 16:36:25 +0100 +Subject: [PATCH] Do not generate build-version.inc + +--- + CMakeLists.txt | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index a4c2fac..5544a2d 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -53,8 +53,8 @@ add_subdirectory(libshaderc) + add_subdirectory(glslc) + add_subdirectory(examples) + +-add_custom_target(build-version +- ${PYTHON_EXE} +- ${CMAKE_CURRENT_SOURCE_DIR}/utils/update_build_version.py +- ${shaderc_SOURCE_DIR} ${spirv-tools_SOURCE_DIR} ${glslang_SOURCE_DIR} +- COMMENT "Update build-version.inc in the Shaderc build directory (if necessary).") ++#add_custom_target(build-version ++# ${PYTHON_EXE} ++# ${CMAKE_CURRENT_SOURCE_DIR}/utils/update_build_version.py ++# ${shaderc_SOURCE_DIR} ${spirv-tools_SOURCE_DIR} ${glslang_SOURCE_DIR} ++# COMMENT "Update build-version.inc in the Shaderc build directory (if necessary).") +-- +2.10.2.windows.1 + diff --git a/cmake/ports/shaderc/CMakeLists.txt b/cmake/ports/shaderc/CMakeLists.txt new file mode 100644 index 0000000000..c4f15a8846 --- /dev/null +++ b/cmake/ports/shaderc/CMakeLists.txt @@ -0,0 +1,31 @@ +option(SUFFIX_D "Add d Suffix to lib" ${SUFFIX_D}) +if(NOT SUFFIX_D) + find_library(GLSLANG glslang) + find_library(OSDEPENDENT OSDependent) + find_library(OGLCOMPILER OGLCompiler) + find_library(HLSLLIB HLSL) + find_library(SPIRVLIB SPIRV) +ELSE() + find_library(GLSLANG glslangd) + find_library(OSDEPENDENT OSDependentd) + find_library(OGLCOMPILER OGLCompilerd) + find_library(HLSLLIB HLSLd) + find_library(SPIRVLIB SPIRVd) +ENDIF() + +add_library(glslang STATIC IMPORTED GLOBAL) +set_property(TARGET glslang PROPERTY IMPORTED_LOCATION "${GLSLANG}") +find_path(glslang_SOURCE_DIR glslang/Include/Common) +set_property(TARGET glslang APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${glslang_SOURCE_DIR}") + +add_library(OSDependent STATIC IMPORTED GLOBAL) +set_property(TARGET OSDependent PROPERTY IMPORTED_LOCATION "${OSDEPENDENT}") + +add_library(OGLCompiler STATIC IMPORTED GLOBAL) +set_property(TARGET OGLCompiler PROPERTY IMPORTED_LOCATION "${OGLCOMPILER}") + +add_library(HLSL STATIC IMPORTED GLOBAL) +set_property(TARGET HLSL PROPERTY IMPORTED_LOCATION "${HLSLLIB}") + +add_library(SPIRV STATIC IMPORTED GLOBAL) +set_property(TARGET SPIRV PROPERTY IMPORTED_LOCATION "${SPIRVLIB}") diff --git a/cmake/ports/shaderc/CMakeLists_spirv.txt b/cmake/ports/shaderc/CMakeLists_spirv.txt new file mode 100644 index 0000000000..d9e0136012 --- /dev/null +++ b/cmake/ports/shaderc/CMakeLists_spirv.txt @@ -0,0 +1,8 @@ +find_library(SPIRVTOOLSOPT SPIRV-Tools-opt) +find_library(SPIRVTOOLS SPIRV-Tools) + +add_library(SPIRV-Tools-opt STATIC IMPORTED GLOBAL) +set_property(TARGET SPIRV-Tools-opt PROPERTY IMPORTED_LOCATION "${SPIRVTOOLSOPT}") + +add_library(SPIRV-Tools STATIC IMPORTED GLOBAL) +set_property(TARGET SPIRV-Tools PROPERTY IMPORTED_LOCATION "${SPIRVTOOLS}") diff --git a/cmake/ports/shaderc/CONTROL b/cmake/ports/shaderc/CONTROL new file mode 100644 index 0000000000..0cd3de96d8 --- /dev/null +++ b/cmake/ports/shaderc/CONTROL @@ -0,0 +1,4 @@ +Source: shaderc +Version: 2018.0-1 +Description: A collection of tools, libraries and tests for shader compilation. +Build-Depends: glslang, spirv-tools diff --git a/cmake/ports/shaderc/build-version.inc b/cmake/ports/shaderc/build-version.inc new file mode 100644 index 0000000000..853e89916e --- /dev/null +++ b/cmake/ports/shaderc/build-version.inc @@ -0,0 +1,3 @@ +"shaderc v2016.2-dev unknown hash, 2016-12-02\n" +"spirv-tools v2016.6-dev unknown hash, 2016-12-02\n" +"glslang unknown hash, 2016-12-02\n" diff --git a/cmake/ports/shaderc/portfile.cmake b/cmake/ports/shaderc/portfile.cmake new file mode 100644 index 0000000000..c43e591ec1 --- /dev/null +++ b/cmake/ports/shaderc/portfile.cmake @@ -0,0 +1,49 @@ +include(vcpkg_common_functions) + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO google/shaderc + REF v2018.0 + SHA512 7a420fde73c9f2aae3f13558d538a1f4ae43bba19e2b4d2da8fbbd017e9e4f328ece5f330f1bbcb9fe84c91b7eb84b9158dc2e3d144c82939090a0fa6f5b4ef0 + HEAD_REF master + PATCHES + 0001-Do-not-generate-build-version.inc.patch +) + +file(COPY ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt DESTINATION ${SOURCE_PATH}/third_party/glslang) +file(COPY ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_spirv.txt DESTINATION ${SOURCE_PATH}/third_party/spirv-tools) +file(RENAME ${SOURCE_PATH}/third_party/spirv-tools/CMakeLists_spirv.txt ${SOURCE_PATH}/third_party/spirv-tools/CMakeLists.txt) +file(COPY ${CMAKE_CURRENT_LIST_DIR}/build-version.inc DESTINATION ${SOURCE_PATH}/glslc/src) + +#Note: glslang and spir tools doesn't export symbol and need to be build as static lib for cmake to work +set(VCPKG_LIBRARY_LINKAGE "static") +set(OPTIONS) +if(VCPKG_CRT_LINKAGE STREQUAL "dynamic") + list(APPEND OPTIONS -DSHADERC_ENABLE_SHARED_CRT=ON) +endif() + +# shaderc uses python to manipulate copyright information +vcpkg_find_acquire_program(PYTHON3) +get_filename_component(PYTHON3_EXE_PATH ${PYTHON3} DIRECTORY) +vcpkg_add_to_path(PREPEND "${PYTHON3_EXE_PATH}") + +vcpkg_configure_cmake( + SOURCE_PATH ${SOURCE_PATH} + OPTIONS -DSHADERC_SKIP_TESTS=true ${OPTIONS} -Dglslang_SOURCE_DIR=${CURRENT_INSTALLED_DIR}/include + OPTIONS_DEBUG -DSUFFIX_D=true + OPTIONS_RELEASE -DSUFFIX_D=false +) + +vcpkg_install_cmake() + +file(GLOB EXES "${CURRENT_PACKAGES_DIR}/bin/*.exe") +file(COPY ${EXES} DESTINATION ${CURRENT_PACKAGES_DIR}/tools) + +#Safe to remove as libs are static +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin) +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/bin) +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) + +# Handle copyright +file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/shaderc) +file(RENAME ${CURRENT_PACKAGES_DIR}/share/shaderc/LICENSE ${CURRENT_PACKAGES_DIR}/share/shaderc/copyright) diff --git a/cmake/ports/spirv-cross/CONTROL b/cmake/ports/spirv-cross/CONTROL new file mode 100644 index 0000000000..9068608da6 --- /dev/null +++ b/cmake/ports/spirv-cross/CONTROL @@ -0,0 +1,3 @@ +Source: spirv-cross +Version: 2018-08-07-1 +Description: SPIRV-Cross is a practical tool and library for performing reflection on SPIR-V and disassembling SPIR-V back to high level languages. diff --git a/cmake/ports/spirv-cross/portfile.cmake b/cmake/ports/spirv-cross/portfile.cmake new file mode 100644 index 0000000000..6495e82bc3 --- /dev/null +++ b/cmake/ports/spirv-cross/portfile.cmake @@ -0,0 +1,33 @@ +include(vcpkg_common_functions) + +vcpkg_check_linkage(ONLY_STATIC_LIBRARY) + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO KhronosGroup/SPIRV-Cross + REF 2018-08-07 + SHA512 1ac6ee6b2864d950199d4e856ae1576f9435827501baa5d53821a973cd68aaa03ec428094bf74c570784997baac5b2e3802ddc7f02844e2ee546741fa726bf91 + HEAD_REF master +) + +vcpkg_configure_cmake( + SOURCE_PATH ${SOURCE_PATH} + PREFER_NINJA + OPTIONS -DSPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS=OFF +) + +vcpkg_install_cmake() +vcpkg_copy_pdbs() + +foreach(COMPONENT core cpp glsl hlsl msl reflect util) + vcpkg_fixup_cmake_targets(CONFIG_PATH share/spirv_cross_${COMPONENT}/cmake TARGET_PATH share/spirv_cross_${COMPONENT}) +endforeach() + +file(GLOB EXES "${CURRENT_PACKAGES_DIR}/bin/*") +file(COPY ${EXES} DESTINATION ${CURRENT_PACKAGES_DIR}/tools) + +# cleanup +configure_file(${SOURCE_PATH}/LICENSE ${CURRENT_PACKAGES_DIR}/share/spirv-cross/copyright COPYONLY) +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share) +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin ${CURRENT_PACKAGES_DIR}/debug/bin) diff --git a/cmake/ports/spirv-tools/CONTROL b/cmake/ports/spirv-tools/CONTROL new file mode 100644 index 0000000000..057fe5db0a --- /dev/null +++ b/cmake/ports/spirv-tools/CONTROL @@ -0,0 +1,3 @@ +Source: spirv-tools +Version: 2018.5-1 +Description: API and commands for processing SPIR-V modules diff --git a/cmake/ports/spirv-tools/portfile.cmake b/cmake/ports/spirv-tools/portfile.cmake new file mode 100644 index 0000000000..b52a3b96c2 --- /dev/null +++ b/cmake/ports/spirv-tools/portfile.cmake @@ -0,0 +1,43 @@ +include(vcpkg_common_functions) + +vcpkg_check_linkage(ONLY_STATIC_LIBRARY) + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO KhronosGroup/SPIRV-Tools + REF v2018.5 + SHA512 068a39e15111f24ad2a6b27e7ada786b3124b239aa8b13e187a4d512044db57a8e6a0fccadd0451155e1f57c96c8dec91a2338996c59fc883007cf7be07f2cad + HEAD_REF master +) + +vcpkg_from_github( + OUT_SOURCE_PATH SPIRV_HEADERS_PATH + REPO KhronosGroup/SPIRV-Headers + REF 801cca8104245c07e8cc53292da87ee1b76946fe + SHA512 2bfc37beec1f6afb565fa7dad08eb838c8fe4bacda7f80a3a6c75d80c7eb1caea7e7716dc1da11b337b723a0870700d524c6617c5b7cab8b28048fa8c0785ba9 + HEAD_REF master +) + +vcpkg_find_acquire_program(PYTHON3) +get_filename_component(PYTHON3_DIR "${PYTHON3}" DIRECTORY) +vcpkg_add_to_path("${PYTHON3_DIR}") + +vcpkg_configure_cmake( + SOURCE_PATH ${SOURCE_PATH} + PREFER_NINJA + OPTIONS + -DSPIRV-Headers_SOURCE_DIR=${SPIRV_HEADERS_PATH} + -DSPIRV_WERROR=OFF +) + +vcpkg_install_cmake() + +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) +file(GLOB EXES "${CURRENT_PACKAGES_DIR}/bin/*") +file(COPY ${EXES} DESTINATION ${CURRENT_PACKAGES_DIR}/tools) +file(REMOVE ${EXES}) +file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin ${CURRENT_PACKAGES_DIR}/debug/bin) + +# Handle copyright +file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/spirv-tools) +file(RENAME ${CURRENT_PACKAGES_DIR}/share/spirv-tools/LICENSE ${CURRENT_PACKAGES_DIR}/share/spirv-tools/copyright) diff --git a/cmake/ports/tbb/CMakeLists.txt b/cmake/ports/tbb/CMakeLists.txt new file mode 100644 index 0000000000..edfaf63200 --- /dev/null +++ b/cmake/ports/tbb/CMakeLists.txt @@ -0,0 +1,18 @@ +project(tbb CXX) + +file(GLOB SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*) +file(COPY ${SOURCES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/src) + +include(${CMAKE_CURRENT_BINARY_DIR}/src/cmake/TBBBuild.cmake REQUIRED) +tbb_build(TBB_ROOT ${CMAKE_CURRENT_BINARY_DIR}/src MAKE_ARGS extra_inc=big_iron.inc) + +set(SUBDIR ${CMAKE_CURRENT_BINARY_DIR}/tbb_cmake_build/tbb_cmake_build_subdir) +if(CMAKE_BUILD_TYPE STREQUAL "Release") + set(SUBDIR "${SUBDIR}_release") +else() + set(SUBDIR "${SUBDIR}_debug") +endif() + +file(GLOB OUTPUTS ${SUBDIR}/*.so.* ${SUBDIR}/*.so ${SUBDIR}/*.a ${SUBDIR}/*.dylib ${SUBDIR}/*.dylib.*) + +install(FILES ${OUTPUTS} DESTINATION lib) diff --git a/cmake/ports/tbb/CONTROL b/cmake/ports/tbb/CONTROL new file mode 100644 index 0000000000..e87106dc3c --- /dev/null +++ b/cmake/ports/tbb/CONTROL @@ -0,0 +1,3 @@ +Source: tbb +Version: 2018_U5-4 +Description: Intel's Threading Building Blocks. diff --git a/cmake/ports/tbb/portfile.cmake b/cmake/ports/tbb/portfile.cmake new file mode 100644 index 0000000000..ac47360f8c --- /dev/null +++ b/cmake/ports/tbb/portfile.cmake @@ -0,0 +1,86 @@ +include(vcpkg_common_functions) + +if(NOT VCPKG_CMAKE_SYSTEM_NAME OR VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore") + vcpkg_check_linkage(ONLY_DYNAMIC_LIBRARY) +endif() + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO 01org/tbb + REF 2018_U5 + SHA512 3e8d20276ccb1b50099f96b6cf968e3d0ada53caea1fa836ecb8652f1dca236fbbbf2c783e64ea2f761f7f21725064d19b72d176e35e4dc29706b8a30965153b + HEAD_REF tbb_2018 +) + +file(COPY ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt DESTINATION ${SOURCE_PATH}) + +if(VCPKG_CMAKE_SYSTEM_NAME AND NOT VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore") + vcpkg_configure_cmake( + SOURCE_PATH ${SOURCE_PATH} + PREFER_NINJA + ) + + vcpkg_install_cmake() + + # Settings for TBBConfigForSource.cmake.in + set(TBB_LIB_EXT a) + set(TBB_LIB_PREFIX lib) +else() + if (VCPKG_CRT_LINKAGE STREQUAL static) + set(RELEASE_CONFIGURATION Release-MT) + set(DEBUG_CONFIGURATION Debug-MT) + else() + set(RELEASE_CONFIGURATION Release) + set(DEBUG_CONFIGURATION Debug) + endif() + + vcpkg_install_msbuild( + SOURCE_PATH ${SOURCE_PATH} + PROJECT_SUBPATH build/vs2013/makefile.sln + RELEASE_CONFIGURATION ${RELEASE_CONFIGURATION} + DEBUG_CONFIGURATION ${DEBUG_CONFIGURATION} + ) + # Settings for TBBConfigForSource.cmake.in + set(TBB_LIB_EXT lib) + set(TBB_LIB_PREFIX) +endif() + +file(COPY + ${SOURCE_PATH}/include/tbb + ${SOURCE_PATH}/include/serial + DESTINATION ${CURRENT_PACKAGES_DIR}/include) + +# Settings for TBBConfigForSource.cmake.in +if(VCPKG_LIBRARY_LINKAGE STREQUAL "static") + set(TBB_DEFAULT_COMPONENTS tbb tbbmalloc) +else() + set(TBB_DEFAULT_COMPONENTS tbb tbbmalloc tbbmalloc_proxy) +endif() +file(READ "${SOURCE_PATH}/include/tbb/tbb_stddef.h" _tbb_stddef) +string(REGEX REPLACE ".*#define TBB_VERSION_MAJOR ([0-9]+).*" "\\1" _tbb_ver_major "${_tbb_stddef}") +string(REGEX REPLACE ".*#define TBB_VERSION_MINOR ([0-9]+).*" "\\1" _tbb_ver_minor "${_tbb_stddef}") +string(REGEX REPLACE ".*#define TBB_INTERFACE_VERSION ([0-9]+).*" "\\1" TBB_INTERFACE_VERSION "${_tbb_stddef}") +set(TBB_VERSION "${_tbb_ver_major}.${_tbb_ver_minor}") +set(TBB_RELEASE_DIR "\${_tbb_root}/lib") +set(TBB_DEBUG_DIR "\${_tbb_root}/debug/lib") + +configure_file( + ${SOURCE_PATH}/cmake/templates/TBBConfigForSource.cmake.in + ${CURRENT_PACKAGES_DIR}/share/tbb/TBBConfig.cmake + @ONLY +) +file(READ ${CURRENT_PACKAGES_DIR}/share/tbb/TBBConfig.cmake _contents) +string(REPLACE + "get_filename_component(_tbb_root \"\${_tbb_root}\" PATH)" + "get_filename_component(_tbb_root \"\${_tbb_root}\" PATH)\nget_filename_component(_tbb_root \"\${_tbb_root}\" PATH)" + _contents + "${_contents}" +) +string(REPLACE "SHARED IMPORTED)" "UNKNOWN IMPORTED)" _contents "${_contents}") +file(WRITE ${CURRENT_PACKAGES_DIR}/share/tbb/TBBConfig.cmake "${_contents}") + +# Handle copyright +file(COPY ${SOURCE_PATH}/LICENSE ${CMAKE_CURRENT_LIST_DIR}/usage DESTINATION ${CURRENT_PACKAGES_DIR}/share/tbb) +file(RENAME ${CURRENT_PACKAGES_DIR}/share/tbb/LICENSE ${CURRENT_PACKAGES_DIR}/share/tbb/copyright) + +vcpkg_test_cmake(PACKAGE_NAME TBB) diff --git a/cmake/ports/tbb/usage b/cmake/ports/tbb/usage new file mode 100644 index 0000000000..2972bafbd6 --- /dev/null +++ b/cmake/ports/tbb/usage @@ -0,0 +1,4 @@ +The package tbb provides CMake targets: + + find_package(TBB CONFIG REQUIRED) + target_link_libraries(main PRIVATE TBB::tbb) diff --git a/cmake/ports/vulkanmemoryallocator/CONTROL b/cmake/ports/vulkanmemoryallocator/CONTROL new file mode 100644 index 0000000000..cd97502527 --- /dev/null +++ b/cmake/ports/vulkanmemoryallocator/CONTROL @@ -0,0 +1,3 @@ +Source: vulkanmemoryallocator +Version: 3a7249f313b047417fbb1d36a3fbe6c3bf1505b5 +Description: Vulkan Memory Allocator diff --git a/cmake/ports/vulkanmemoryallocator/portfile.cmake b/cmake/ports/vulkanmemoryallocator/portfile.cmake new file mode 100644 index 0000000000..2b02bc1175 --- /dev/null +++ b/cmake/ports/vulkanmemoryallocator/portfile.cmake @@ -0,0 +1,14 @@ +include(vcpkg_common_functions) + +set(SOURCE_VERSION 3.3.0) + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator + REF 3a7249f313b047417fbb1d36a3fbe6c3bf1505b5 + SHA512 ddeac01a25bfe47d4e749d150aeaea43760c9732db78bf6d15231b9de1b7fb5218f1ced07710cb1929175ddcb05848239edaf0f6cc47be48896211293ffd236c + HEAD_REF master +) + +file(INSTALL ${SOURCE_PATH}/src/vk_mem_alloc.h DESTINATION ${CURRENT_PACKAGES_DIR}/include/vma) +file(INSTALL ${SOURCE_PATH}/LICENSE.txt DESTINATION ${CURRENT_PACKAGES_DIR}/share/vulkanmemoryallocator RENAME copyright) diff --git a/cmake/ports/zlib/CONTROL b/cmake/ports/zlib/CONTROL new file mode 100644 index 0000000000..c559637834 --- /dev/null +++ b/cmake/ports/zlib/CONTROL @@ -0,0 +1,3 @@ +Source: zlib +Version: 1.2.11-3 +Description: A compression library diff --git a/cmake/ports/zlib/LICENSE b/cmake/ports/zlib/LICENSE new file mode 100644 index 0000000000..ca5fddfe0d --- /dev/null +++ b/cmake/ports/zlib/LICENSE @@ -0,0 +1,20 @@ + Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu \ No newline at end of file diff --git a/cmake/ports/zlib/cmake_dont_build_more_than_needed.patch b/cmake/ports/zlib/cmake_dont_build_more_than_needed.patch new file mode 100644 index 0000000000..229a2d055b --- /dev/null +++ b/cmake/ports/zlib/cmake_dont_build_more_than_needed.patch @@ -0,0 +1,42 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 0fe939d..8d2f5f1 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -7,6 +7,7 @@ set(VERSION "1.2.11") + + option(ASM686 "Enable building i686 assembly implementation") + option(AMD64 "Enable building amd64 assembly implementation") ++option(SKIP_BUILD_EXAMPLES "Skip build of the examples" OFF) + + set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables") + set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries") +@@ -211,7 +212,15 @@ elseif(BUILD_SHARED_LIBS AND WIN32) + endif() + + if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL ) +- install(TARGETS zlib zlibstatic ++ if (BUILD_SHARED_LIBS) ++ set(ZLIB_TARGETS zlib) ++ set_target_properties(zlibstatic PROPERTIES EXCLUDE_FROM_ALL ON) ++ else() ++ set(ZLIB_TARGETS zlibstatic) ++ set_target_properties(zlib PROPERTIES EXCLUDE_FROM_ALL ON) ++ endif() ++ ++ install(TARGETS ${ZLIB_TARGETS} + RUNTIME DESTINATION "${INSTALL_BIN_DIR}" + ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" + LIBRARY DESTINATION "${INSTALL_LIB_DIR}" ) +@@ -230,6 +239,7 @@ endif() + # Example binaries + #============================================================================ + ++if (NOT SKIP_BUILD_EXAMPLES) + add_executable(example test/example.c) + target_link_libraries(example zlib) + add_test(example example) +@@ -247,3 +257,4 @@ if(HAVE_OFF64_T) + target_link_libraries(minigzip64 zlib) + set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") + endif() ++endif() diff --git a/cmake/ports/zlib/portfile.cmake b/cmake/ports/zlib/portfile.cmake new file mode 100644 index 0000000000..f2cc68b7a3 --- /dev/null +++ b/cmake/ports/zlib/portfile.cmake @@ -0,0 +1,47 @@ +include(vcpkg_common_functions) +set(SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src/zlib-1.2.11) +vcpkg_download_distfile(ARCHIVE_FILE + URLS "http://www.zlib.net/zlib-1.2.11.tar.gz" "https://downloads.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz" + FILENAME "zlib1211.tar.gz" + SHA512 73fd3fff4adeccd4894084c15ddac89890cd10ef105dd5e1835e1e9bbb6a49ff229713bd197d203edfa17c2727700fce65a2a235f07568212d820dca88b528ae +) +vcpkg_extract_source_archive(${ARCHIVE_FILE}) + +vcpkg_apply_patches( + SOURCE_PATH ${SOURCE_PATH} + PATCHES + ${CMAKE_CURRENT_LIST_DIR}/cmake_dont_build_more_than_needed.patch +) + +# This is generated during the cmake build +file(REMOVE ${SOURCE_PATH}/zconf.h) + +vcpkg_configure_cmake( + SOURCE_PATH ${SOURCE_PATH} + PREFER_NINJA + OPTIONS + -DSKIP_INSTALL_FILES=ON + -DSKIP_BUILD_EXAMPLES=ON + OPTIONS_DEBUG + -DSKIP_INSTALL_HEADERS=ON +) + +vcpkg_install_cmake() + +# Both dynamic and static are built, so keep only the one needed +if(VCPKG_LIBRARY_LINKAGE STREQUAL static) + if(EXISTS ${CURRENT_PACKAGES_DIR}/lib/zlibstatic.lib) + file(RENAME ${CURRENT_PACKAGES_DIR}/lib/zlibstatic.lib ${CURRENT_PACKAGES_DIR}/lib/zlib.lib) + endif() + if(EXISTS ${CURRENT_PACKAGES_DIR}/debug/lib/zlibstaticd.lib) + file(RENAME ${CURRENT_PACKAGES_DIR}/debug/lib/zlibstaticd.lib ${CURRENT_PACKAGES_DIR}/debug/lib/zlibd.lib) + endif() +endif() + +file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/zlib RENAME copyright) + +vcpkg_copy_pdbs() + +file(COPY ${CMAKE_CURRENT_LIST_DIR}/usage DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT}) + +#vcpkg_test_cmake(PACKAGE_NAME ZLIB MODULE) diff --git a/cmake/ports/zlib/usage b/cmake/ports/zlib/usage new file mode 100644 index 0000000000..0dfed74930 --- /dev/null +++ b/cmake/ports/zlib/usage @@ -0,0 +1,4 @@ +The package zlib is compatible with built-in CMake targets: + + find_package(ZLIB REQUIRED) + target_link_libraries(main PRIVATE ZLIB::ZLIB) diff --git a/cmake/templates/NSIS.template.in b/cmake/templates/NSIS.template.in index fd48a792dc..9ce11ca032 100644 --- a/cmake/templates/NSIS.template.in +++ b/cmake/templates/NSIS.template.in @@ -28,6 +28,78 @@ !include "WinVer.nsh" +;-------------------------------- +;Include Installer Logging +; taken from http://nsis.sourceforge.net/Logging:_Simple_Text_File_Logging_Functions_and_Macros +; TextLog.nsh v1.1 - 2005-12-26 +; Written by Mike Schinkel [http://www.mikeschinkel.com/blog/] + + Var /GLOBAL __TextLog_FileHandle + Var /GLOBAL __TextLog_FileName + Var /GLOBAL __TextLog_State + + !define LogMsg '!insertmacro LogMsgCall' + !macro LogMsgCall _text + Call LogSetOn + Push "${_text}" + Call LogText + Call LogSetOff + !macroend + + + !define LogText '!insertmacro LogTextCall' + !macro LogTextCall _text + Push "${_text}" + Call LogText + !macroend + + Function LogText + Exch $0 ; pABC -> 0ABC + FileWrite $__TextLog_FileHandle "$0$\r$\n" + Pop $0 ; 0ABC -> ABC + FunctionEnd + + !define LogSetFileName '!insertmacro LogSetFileNameCall' + !macro LogSetFileNameCall _filename + Push "${_filename}" + Call LogSetFileName + !macroend + + Function LogSetFileName + Exch $0 ; pABC -> 0ABC + StrCpy $__TextLog_FileName "$0" + StrCmp $__TextLog_State "open" +1 +3 + Call LogSetOff + Call LogSetOn + Pop $0 ; 0ABC -> ABC + FunctionEnd + + !define LogSetOn '!insertmacro LogSetOnCall' + !macro LogSetOnCall + Call LogSetOn + !macroend + + Function LogSetOn + StrCmp $__TextLog_FileName "" +1 AlreadySet + StrCpy $__TextLog_FileName "$INSTDIR\install.log" + AlreadySet: + StrCmp $__TextLog_State "open" +2 + FileOpen $__TextLog_FileHandle "$__TextLog_FileName" a + FileSeek $__TextLog_FileHandle 0 END + StrCpy $__TextLog_State "open" + FunctionEnd + + !define LogSetOff '!insertmacro LogSetOffCall' + !macro LogSetOffCall + Call LogSetOff + !macroend + + Function LogSetOff + StrCmp $__TextLog_State "open" +1 +2 + FileClose $__TextLog_FileHandle + StrCpy $__TextLog_State "" + FunctionEnd + ;-------------------------------- ; Utilities and Functions ;-------------------------------- @@ -375,6 +447,10 @@ Var GAClientID !insertmacro CreateGUID $GAClientID !macroend +!macro LogStep Category Action Label Value + ${LogText} "Step: ${Category} ${Action} ${Label} ${Value}" +!macroend + !macro GoogleAnalytics Category Action Label Value ${If} "@GA_TRACKING_ID@" != "" Push $0 @@ -557,11 +633,13 @@ Var Express !macro MaybeSkipPage ; Check if Express is set, if so, abort the post install options page ${If} $Express == "1" + ${LogText} "Express Install: Skipping Post Install Options Page" Abort ${EndIf} !macroend !macro DownloadSlideshowImages + ${LogText} "Download Slideshow Images" InitPluginsDir Push $0 @@ -583,32 +661,40 @@ Var Express !macroend Function OnUserAbort + !insertmacro LogStep "Installer" "Abort" "User Abort" "" !insertmacro GoogleAnalytics "Installer" "Abort" "User Abort" "" FunctionEnd Function PageWelcomePre + !insertmacro LogStep "Installer" "Welcome" "" "" !insertmacro GoogleAnalytics "Installer" "Welcome" "" "" !insertmacro DownloadSlideshowImages FunctionEnd Function PageLicensePre + !insertmacro LogStep "Installer" "License" "" "" !insertmacro GoogleAnalytics "Installer" "License" "" "" FunctionEnd Function PageDirectoryPre !insertmacro MaybeSkipPage + !insertmacro LogStep "Installer" "Directory" "" "" !insertmacro GoogleAnalytics "Installer" "Directory" "" "" FunctionEnd Function PageStartMenuPre !insertmacro MaybeSkipPage + !insertmacro LogStep "Installer" "StartMenu" "" "" !insertmacro GoogleAnalytics "Installer" "StartMenu" "" "" FunctionEnd Function PageComponentsPre !insertmacro MaybeSkipPage + !insertmacro LogStep "Installer" "Components" "" "" !insertmacro GoogleAnalytics "Installer" "Components" "" "" FunctionEnd Function PageInstallFilesPre + !insertmacro LogStep "Installer" "Install" "" "" !insertmacro GoogleAnalytics "Installer" "Install" "" "" FunctionEnd !macro SetInstallOption Checkbox OptionName Default + ${LogText} "SetInstallOption ${OptionName} ${Default}" ; reads the value for the given install option to the registry ReadRegStr $0 HKLM "@REGISTRY_HKLM_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\@POST_INSTALL_OPTIONS_REG_GROUP@" "${OptionName}" @@ -625,6 +711,7 @@ FunctionEnd !macroend Function InstallTypesPage + !insertmacro LogStep "Installer" "Install Types" "" "" !insertmacro GoogleAnalytics "Installer" "Install Types" "" "" !insertmacro MUI_HEADER_TEXT "Choose Installation Type" "Express or Custom Install" @@ -688,6 +775,7 @@ FunctionEnd Function StartInstallSlideshow ; create a slideshow file based on what files we have available + ${LogText} "Start Installs Slideshow" ; stash $0 and $1 Push $0 @@ -730,7 +818,11 @@ Function StartInstallSlideshow FunctionEnd Function PostInstallOptionsPage + + ${LogText} "Install Directory: $INSTDIR" + !insertmacro MaybeSkipPage + !insertmacro LogStep "Installer" "Post Install Options" "" "" !insertmacro GoogleAnalytics "Installer" "Post Install Options" "" "" !insertmacro MUI_HEADER_TEXT "Setup Options" "" @@ -876,30 +968,43 @@ Function ReadPostInstallOptions ; check if the user asked for a desktop shortcut to console ${NSD_GetState} $DesktopConsoleCheckbox $DesktopConsoleState - + ${LogText} "Option: Start Desktop Console: $DesktopConsoleState" + ; check if the user asked to have console launched every startup ${NSD_GetState} $ConsoleStartupCheckbox $ConsoleStartupState + ${LogText} "Option: Start Desktop Console On Startup: $ConsoleStartupState" + ${If} @SERVER_COMPONENT_CONDITIONAL@ + ${LogText} "Option: Install Server" + ${EndIf} + ${If} @CLIENT_COMPONENT_CONDITIONAL@ + ${LogText} "Option: Install Client" ; check if the user asked for a desktop shortcut to High Fidelity ${NSD_GetState} $DesktopClientCheckbox $DesktopClientState + ${LogText} "Option: Create Client Desktop Shortcut: $DesktopClientState" ${EndIf} ${If} @PR_BUILD@ == 1 + ${LogText} "Option: PR Build" ; check if we need to copy settings/content from production for this PR build ${NSD_GetState} $CopyFromProductionCheckbox $CopyFromProductionState + ${LogText} "Option: Copy Settings From Production: $CopyFromProductionState" ${EndIf} ; check if we need to launch the console post-install ${NSD_GetState} $LaunchConsoleNowCheckbox $LaunchConsoleNowState + ${LogText} "Option: Launch Console Now: $LaunchConsoleNowState" ${If} @CLIENT_COMPONENT_CONDITIONAL@ ; check if we need to launch the client post-install ${NSD_GetState} $LaunchClientNowCheckbox $LaunchClientNowState + ${LogText} "Option: Launch Client Now: $LaunchClientNowState" ${EndIf} ; check if the user asked for a clean install ${NSD_GetState} $CleanInstallCheckbox $CleanInstallState + ${LogText} "Option: Clean Install: $CleanInstallState" FunctionEnd Function HandlePostInstallOptions @@ -1225,6 +1330,7 @@ Section "-Core installation" ; Handle whichever post install options were set Call HandlePostInstallOptions + !insertmacro LogStep "Installer" "Done" "" "" !insertmacro GoogleAnalytics "Installer" "Done" "" "" SectionEnd @@ -1232,7 +1338,6 @@ SectionEnd !macro PromptForRunningApplication applicationName displayName action prompter !define UniqueID ${__LINE__} - Prompt_${UniqueID}: ${nsProcess::FindProcess} ${applicationName} $R0 @@ -1478,6 +1583,11 @@ InstallDirRegKey HKLM "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_RE Function .onInit + Delete "$TEMP\hifi_install.log" + ${LogSetFileName} "$TEMP\hifi_install.log" + ${LogSetOn} + ${LogText} "In .onInit" + !ifdef INNER ; If INNER is defined, then we aren't supposed to do anything except write out ; the installer. This is better than processing a command line option as it means @@ -1495,6 +1605,7 @@ Function .onInit !insertmacro GoogleAnalytics "Installer" "Start" "$CampaignName" "" ; make sure none of the installed applications are still running + ${LogText} "Checking For Running Applications" !insertmacro CheckForRunningApplications "installed" "Installer" ${nsProcess::Unload} diff --git a/domain-server/CMakeLists.txt b/domain-server/CMakeLists.txt index 458dcb5ab8..693132a8f7 100644 --- a/domain-server/CMakeLists.txt +++ b/domain-server/CMakeLists.txt @@ -27,30 +27,8 @@ include_hifi_library_headers(graphics) link_hifi_libraries(embedded-webserver networking shared avatars octree) target_zlib() - -add_dependency_external_projects(quazip) - -find_package(QuaZip REQUIRED) -target_include_directories(${TARGET_NAME} SYSTEM PUBLIC ${QUAZIP_INCLUDE_DIRS}) -target_link_libraries(${TARGET_NAME} ${QUAZIP_LIBRARIES}) - -if (WIN32) - add_paths_to_fixup_libs(${QUAZIP_DLL_PATH}) -endif () - -# find OpenSSL -find_package(OpenSSL REQUIRED) - -if (APPLE AND ${OPENSSL_INCLUDE_DIR} STREQUAL "/usr/include") - # this is a user on OS X using system OpenSSL, which is going to throw warnings since they're deprecating for their common crypto - message(WARNING "The found version of OpenSSL is the OS X system version. This will produce deprecation warnings." - "\nWe recommend you install a newer version (at least 1.0.1h) in a different directory and set OPENSSL_ROOT_DIR in your env so Cmake can find it.") -endif () - -include_directories(SYSTEM "${OPENSSL_INCLUDE_DIR}") - -# append OpenSSL to our list of libraries to link -target_link_libraries(${TARGET_NAME} ${OPENSSL_LIBRARIES}) +target_quazip() +target_openssl() # libcrypto uses dlopen in libdl if (UNIX) diff --git a/domain-server/src/AssetsBackupHandler.cpp b/domain-server/src/AssetsBackupHandler.cpp index 6bcabc0bf1..b3ba74a985 100644 --- a/domain-server/src/AssetsBackupHandler.cpp +++ b/domain-server/src/AssetsBackupHandler.cpp @@ -15,9 +15,18 @@ #include #include +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsuggest-override" +#endif + #include #include +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + #include #include #include diff --git a/domain-server/src/ContentSettingsBackupHandler.cpp b/domain-server/src/ContentSettingsBackupHandler.cpp index 8ffd25b7a4..de7669b6a5 100644 --- a/domain-server/src/ContentSettingsBackupHandler.cpp +++ b/domain-server/src/ContentSettingsBackupHandler.cpp @@ -11,8 +11,19 @@ #include "ContentSettingsBackupHandler.h" +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsuggest-override" +#endif + #include #include +#include + +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + ContentSettingsBackupHandler::ContentSettingsBackupHandler(DomainServerSettingsManager& domainServerSettingsManager) : _settingsManager(domainServerSettingsManager) diff --git a/domain-server/src/EntitiesBackupHandler.cpp b/domain-server/src/EntitiesBackupHandler.cpp index 599a730107..90a066036d 100644 --- a/domain-server/src/EntitiesBackupHandler.cpp +++ b/domain-server/src/EntitiesBackupHandler.cpp @@ -13,9 +13,18 @@ #include +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsuggest-override" +#endif + #include #include +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + #include EntitiesBackupHandler::EntitiesBackupHandler(QString entitiesFilePath, QString entitiesReplacementFilePath) : diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index cc9fe8ef4c..50247b1145 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -190,8 +190,6 @@ if (WIN32) add_dependency_external_projects(sixense) endif () - add_dependency_external_projects(sdl2) - add_dependency_external_projects(OpenVR) add_dependency_external_projects(neuron) add_dependency_external_projects(wasapi) add_dependency_external_projects(steamworks) diff --git a/interface/resources/avatar/animations/teleport.fbx b/interface/resources/avatar/animations/teleport.fbx new file mode 100644 index 0000000000..99c950ced6 Binary files /dev/null and b/interface/resources/avatar/animations/teleport.fbx differ diff --git a/interface/resources/avatar/network-animation.json b/interface/resources/avatar/network-animation.json index 0ba4ea465c..d1046d2c6b 100644 --- a/interface/resources/avatar/network-animation.json +++ b/interface/resources/avatar/network-animation.json @@ -1,70 +1,138 @@ { "version": "1.1", "root": { - "id": "userAnimStateMachine", + "id": "networkAnimStateMachine", "type": "stateMachine", "data": { - "currentState": "idleAnim", + "currentState": "transitAnimStateMachine", "states": [ { - "id": "idleAnim", + "id": "transitAnimStateMachine", "interpTarget": 6, "interpDuration": 6, "transitions": [ - { "var": "postTransitAnim", "state": "postTransitAnim" }, - { "var": "preTransitAnim", "state": "preTransitAnim" } + { "var": "userNetworkAnimA", "state": "userNetworkAnimA" }, + { "var": "userNetworkAnimB", "state": "userNetworkAnimB" } ] }, { - "id": "preTransitAnim", + "id": "userNetworkAnimA", "interpTarget": 6, "interpDuration": 6, "transitions": [ - { "var": "idleAnim", "state": "idleAnim" }, - { "var": "transitAnim", "state": "transitAnim" } + { "var": "transitAnimStateMachine", "state": "transitAnimStateMachine" }, + { "var": "userNetworkAnimB", "state": "userNetworkAnimB" } ] }, { - "id": "transitAnim", + "id": "userNetworkAnimB", "interpTarget": 6, "interpDuration": 6, "transitions": [ - { "var": "preTransitAnim", "state": "preTransitAnim" }, - { "var": "postTransitAnim", "state": "postTransitAnim" } - ] - }, - { - "id": "postTransitAnim", - "interpTarget": 6, - "interpDuration": 6, - "transitions": [ - { "var": "transitAnim", "state": "transitAnim" }, - { "var": "idleAnim", "state": "idleAnim" } - ] - }, - { - "id": "userAnimA", - "interpTarget": 6, - "interpDuration": 6, - "transitions": [ - { "var": "idleAnim", "state": "idleAnim" }, - { "var": "userAnimB", "state": "userAnimB" } - ] - }, - { - "id": "userAnimB", - "interpTarget": 6, - "interpDuration": 6, - "transitions": [ - { "var": "idleAnim", "state": "idleAnim" }, - { "var": "userAnimA", "state": "userAnimA" } + { "var": "transitAnimStateMachine", "state": "transitAnimStateMachine" }, + { "var": "userNetworkAnimA", "state": "userNetworkAnimA" } ] } ] }, "children": [ { - "id": "idleAnim", + "id": "transitAnimStateMachine", + "type": "stateMachine", + "data": { + "currentState": "idleAnim", + "states": [ + { + "id": "idleAnim", + "interpTarget": 6, + "interpDuration": 6, + "transitions": [ + { "var": "postTransitAnim", "state": "postTransitAnim" }, + { "var": "preTransitAnim", "state": "preTransitAnim" } + ] + }, + { + "id": "preTransitAnim", + "interpTarget": 4, + "interpDuration": 4, + "transitions": [ + { "var": "idleAnim", "state": "idleAnim" }, + { "var": "transitAnim", "state": "transitAnim" } + ] + }, + { + "id": "transitAnim", + "interpTarget": 2, + "interpDuration": 2, + "transitions": [ + { "var": "preTransitAnim", "state": "preTransitAnim" }, + { "var": "postTransitAnim", "state": "postTransitAnim" } + ] + }, + { + "id": "postTransitAnim", + "interpTarget": 4, + "interpDuration": 4, + "transitions": [ + { "var": "transitAnim", "state": "transitAnim" }, + { "var": "idleAnim", "state": "idleAnim" } + ] + } + ] + }, + "children" : [ + { + "id": "idleAnim", + "type": "clip", + "data": { + "url": "qrc:///avatar/animations/idle.fbx", + "startFrame": 0.0, + "endFrame": 90.0, + "timeScale": 1.0, + "loopFlag": true + }, + "children": [] + }, + { + "id": "preTransitAnim", + "type": "clip", + "data": { + "url": "qrc:///avatar/animations/teleport.fbx", + "startFrame": 0.0, + "endFrame": 10.0, + "timeScale": 1.0, + "loopFlag": false + }, + "children": [] + }, + { + "id": "transitAnim", + "type": "clip", + "data": { + "url": "qrc:///avatar/animations/teleport.fbx", + "startFrame": 11.0, + "endFrame": 18.0, + "timeScale": 1.0, + "loopFlag": false + }, + "children": [] + }, + { + "id": "postTransitAnim", + "type": "clip", + "data": { + "url": "qrc:///avatar/animations/teleport.fbx", + "startFrame": 19.0, + "endFrame": 44.0, + "timeScale": 1.0, + "loopFlag": false + }, + "children": [] + } + ] + }, + { + "id": "userNetworkAnimA", "type": "clip", "data": { "url": "qrc:///avatar/animations/idle.fbx", @@ -76,55 +144,7 @@ "children": [] }, { - "id": "preTransitAnim", - "type": "clip", - "data": { - "url": "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx", - "startFrame": 0.0, - "endFrame": 10.0, - "timeScale": 1.0, - "loopFlag": false - }, - "children": [] - }, - { - "id": "transitAnim", - "type": "clip", - "data": { - "url": "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx", - "startFrame": 11.0, - "endFrame": 11.0, - "timeScale": 1.0, - "loopFlag": true - }, - "children": [] - }, - { - "id": "postTransitAnim", - "type": "clip", - "data": { - "url": "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx", - "startFrame": 22.0, - "endFrame": 49.0, - "timeScale": 1.0, - "loopFlag": false - }, - "children": [] - }, - { - "id": "userAnimA", - "type": "clip", - "data": { - "url": "qrc:///avatar/animations/idle.fbx", - "startFrame": 0.0, - "endFrame": 90.0, - "timeScale": 1.0, - "loopFlag": true - }, - "children": [] - }, - { - "id": "userAnimB", + "id": "userNetworkAnimB", "type": "clip", "data": { "url": "qrc:///avatar/animations/idle.fbx", diff --git a/interface/resources/html/raiseAndLowerKeyboard.js b/interface/resources/html/raiseAndLowerKeyboard.js index f40c0d7376..8cdb3c2327 100644 --- a/interface/resources/html/raiseAndLowerKeyboard.js +++ b/interface/resources/html/raiseAndLowerKeyboard.js @@ -18,6 +18,11 @@ window.isKeyboardRaised = false; window.isNumericKeyboard = false; window.isPasswordField = false; + window.lastActiveElement = null; + + function getActiveElement() { + return document.activeElement; + } function shouldSetPasswordField() { var nodeType = document.activeElement.type; @@ -65,10 +70,11 @@ var keyboardRaised = shouldRaiseKeyboard(); var numericKeyboard = shouldSetNumeric(); var passwordField = shouldSetPasswordField(); + var activeElement = getActiveElement(); if (isWindowFocused && (keyboardRaised !== window.isKeyboardRaised || numericKeyboard !== window.isNumericKeyboard - || passwordField !== window.isPasswordField)) { + || passwordField !== window.isPasswordField || activeElement !== window.lastActiveElement)) { if (typeof EventBridge !== "undefined" && EventBridge !== null) { EventBridge.emitWebEvent( @@ -90,6 +96,7 @@ window.isKeyboardRaised = keyboardRaised; window.isNumericKeyboard = numericKeyboard; window.isPasswordField = passwordField; + window.lastActiveElement = activeElement; } }, POLL_FREQUENCY); diff --git a/interface/resources/icons/tablet-icons/inventory-a-msg.svg b/interface/resources/icons/tablet-icons/inventory-a-msg.svg index 794bd1e414..b028c08b50 100644 --- a/interface/resources/icons/tablet-icons/inventory-a-msg.svg +++ b/interface/resources/icons/tablet-icons/inventory-a-msg.svg @@ -1,4 +1,20 @@ - - - - + + + + + + + + + + + + + + diff --git a/interface/resources/icons/tablet-icons/inventory-a.svg b/interface/resources/icons/tablet-icons/inventory-a.svg index 8b6f34eaa3..584ebd3b9b 100644 --- a/interface/resources/icons/tablet-icons/inventory-a.svg +++ b/interface/resources/icons/tablet-icons/inventory-a.svg @@ -1,3 +1,16 @@ - - + + + + + + + + + + + diff --git a/interface/resources/icons/tablet-icons/inventory-i-msg.svg b/interface/resources/icons/tablet-icons/inventory-i-msg.svg index 35d4fb54ae..d2abc7b7ca 100644 --- a/interface/resources/icons/tablet-icons/inventory-i-msg.svg +++ b/interface/resources/icons/tablet-icons/inventory-i-msg.svg @@ -1,4 +1,21 @@ - - - - + + + + + + + + + + + + + + diff --git a/interface/resources/icons/tablet-icons/inventory-i.svg b/interface/resources/icons/tablet-icons/inventory-i.svg index 071fabce88..733ea6df9a 100644 --- a/interface/resources/icons/tablet-icons/inventory-i.svg +++ b/interface/resources/icons/tablet-icons/inventory-i.svg @@ -1,3 +1,19 @@ - - + + + + + + + + + + + + diff --git a/interface/resources/meshes/mannequin/+gles/Eyes.ktx b/interface/resources/meshes/mannequin/+gles/Eyes.ktx deleted file mode 100644 index 0cccc03dc5..0000000000 Binary files a/interface/resources/meshes/mannequin/+gles/Eyes.ktx and /dev/null differ diff --git a/interface/resources/meshes/mannequin/+gles/lambert1_Base_Color.ktx b/interface/resources/meshes/mannequin/+gles/lambert1_Base_Color.ktx deleted file mode 100644 index b0baa696d5..0000000000 Binary files a/interface/resources/meshes/mannequin/+gles/lambert1_Base_Color.ktx and /dev/null differ diff --git a/interface/resources/meshes/mannequin/+gles/lambert1_Normal_OpenGL.ktx b/interface/resources/meshes/mannequin/+gles/lambert1_Normal_OpenGL.ktx deleted file mode 100644 index 0960d30ce6..0000000000 Binary files a/interface/resources/meshes/mannequin/+gles/lambert1_Normal_OpenGL.ktx and /dev/null differ diff --git a/interface/resources/meshes/mannequin/+gles/lambert1_Roughness.ktx b/interface/resources/meshes/mannequin/+gles/lambert1_Roughness.ktx deleted file mode 100644 index 6d87e6e337..0000000000 Binary files a/interface/resources/meshes/mannequin/+gles/lambert1_Roughness.ktx and /dev/null differ diff --git a/interface/resources/meshes/mannequin/Eyes.texmeta.json b/interface/resources/meshes/mannequin/Eyes.texmeta.json new file mode 100644 index 0000000000..c5b215cbe8 --- /dev/null +++ b/interface/resources/meshes/mannequin/Eyes.texmeta.json @@ -0,0 +1,8 @@ +{ + "compressed": { + "COMPRESSED_SRGB8_ALPHA8_ETC2_EAC": "../Eyes_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.ktx", + "COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT": "../Eyes_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT.ktx" + }, + "original": "../Eyes.png", + "uncompressed": "" +} diff --git a/interface/resources/meshes/mannequin/Eyes_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.ktx b/interface/resources/meshes/mannequin/Eyes_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.ktx new file mode 100644 index 0000000000..3abfdebce0 Binary files /dev/null and b/interface/resources/meshes/mannequin/Eyes_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.ktx differ diff --git a/interface/resources/meshes/mannequin/Eyes_bcn.ktx b/interface/resources/meshes/mannequin/Eyes_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT.ktx similarity index 100% rename from interface/resources/meshes/mannequin/Eyes_bcn.ktx rename to interface/resources/meshes/mannequin/Eyes_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT.ktx diff --git a/interface/resources/meshes/mannequin/StingrayPBS10_Base_Color.png b/interface/resources/meshes/mannequin/StingrayPBS10_Base_Color.png deleted file mode 100644 index 941955916a..0000000000 Binary files a/interface/resources/meshes/mannequin/StingrayPBS10_Base_Color.png and /dev/null differ diff --git a/interface/resources/meshes/mannequin/StingrayPBS10_Base_Color_bcn.ktx b/interface/resources/meshes/mannequin/StingrayPBS10_Base_Color_bcn.ktx deleted file mode 100644 index cbb6cfa992..0000000000 Binary files a/interface/resources/meshes/mannequin/StingrayPBS10_Base_Color_bcn.ktx and /dev/null differ diff --git a/interface/resources/meshes/mannequin/StingrayPBS10_Normal_OpenGL.png b/interface/resources/meshes/mannequin/StingrayPBS10_Normal_OpenGL.png deleted file mode 100644 index fc86048656..0000000000 Binary files a/interface/resources/meshes/mannequin/StingrayPBS10_Normal_OpenGL.png and /dev/null differ diff --git a/interface/resources/meshes/mannequin/StingrayPBS10_Normal_OpenGL_bcn.ktx b/interface/resources/meshes/mannequin/StingrayPBS10_Normal_OpenGL_bcn.ktx deleted file mode 100644 index aad0b108b3..0000000000 Binary files a/interface/resources/meshes/mannequin/StingrayPBS10_Normal_OpenGL_bcn.ktx and /dev/null differ diff --git a/interface/resources/meshes/mannequin/lambert1_Base_Color.png b/interface/resources/meshes/mannequin/lambert1_Base_Color.png new file mode 100644 index 0000000000..3553c39442 Binary files /dev/null and b/interface/resources/meshes/mannequin/lambert1_Base_Color.png differ diff --git a/interface/resources/meshes/mannequin/lambert1_Base_Color.texmeta.json b/interface/resources/meshes/mannequin/lambert1_Base_Color.texmeta.json new file mode 100644 index 0000000000..e7d39041b9 --- /dev/null +++ b/interface/resources/meshes/mannequin/lambert1_Base_Color.texmeta.json @@ -0,0 +1,8 @@ +{ + "compressed": { + "COMPRESSED_SRGB8_ALPHA8_ETC2_EAC": "../lambert1_Base_Color_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.ktx", + "COMPRESSED_SRGB_S3TC_DXT1_EXT": "../lambert1_Base_Color_COMPRESSED_SRGB_S3TC_DXT1_EXT.ktx" + }, + "original": "../lambert1_Base_Color.png", + "uncompressed": "" +} diff --git a/interface/resources/meshes/mannequin/lambert1_Base_Color_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.ktx b/interface/resources/meshes/mannequin/lambert1_Base_Color_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.ktx new file mode 100644 index 0000000000..88761cfc54 Binary files /dev/null and b/interface/resources/meshes/mannequin/lambert1_Base_Color_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.ktx differ diff --git a/interface/resources/meshes/mannequin/lambert1_Base_Color_COMPRESSED_SRGB_S3TC_DXT1_EXT.ktx b/interface/resources/meshes/mannequin/lambert1_Base_Color_COMPRESSED_SRGB_S3TC_DXT1_EXT.ktx new file mode 100644 index 0000000000..d2bc8e1659 Binary files /dev/null and b/interface/resources/meshes/mannequin/lambert1_Base_Color_COMPRESSED_SRGB_S3TC_DXT1_EXT.ktx differ diff --git a/interface/resources/meshes/mannequin/lambert1_Normal_OpenGL.png b/interface/resources/meshes/mannequin/lambert1_Normal_OpenGL.png new file mode 100644 index 0000000000..10fd7d4da6 Binary files /dev/null and b/interface/resources/meshes/mannequin/lambert1_Normal_OpenGL.png differ diff --git a/interface/resources/meshes/mannequin/lambert1_Normal_OpenGL.texmeta.json b/interface/resources/meshes/mannequin/lambert1_Normal_OpenGL.texmeta.json new file mode 100644 index 0000000000..9f101d15f2 --- /dev/null +++ b/interface/resources/meshes/mannequin/lambert1_Normal_OpenGL.texmeta.json @@ -0,0 +1,8 @@ +{ + "compressed": { + "COMPRESSED_RG11_EAC": "../lambert1_Normal_OpenGL_COMPRESSED_RG11_EAC.ktx", + "COMPRESSED_RG_RGTC2": "../lambert1_Normal_OpenGL_COMPRESSED_RG_RGTC2.ktx" + }, + "original": "../lambert1_Normal_OpenGL.png", + "uncompressed": "" +} diff --git a/interface/resources/meshes/mannequin/lambert1_Normal_OpenGL_COMPRESSED_RG11_EAC.ktx b/interface/resources/meshes/mannequin/lambert1_Normal_OpenGL_COMPRESSED_RG11_EAC.ktx new file mode 100644 index 0000000000..4026edb51c Binary files /dev/null and b/interface/resources/meshes/mannequin/lambert1_Normal_OpenGL_COMPRESSED_RG11_EAC.ktx differ diff --git a/interface/resources/meshes/mannequin/lambert1_Normal_OpenGL_COMPRESSED_RG_RGTC2.ktx b/interface/resources/meshes/mannequin/lambert1_Normal_OpenGL_COMPRESSED_RG_RGTC2.ktx new file mode 100644 index 0000000000..576895ae69 Binary files /dev/null and b/interface/resources/meshes/mannequin/lambert1_Normal_OpenGL_COMPRESSED_RG_RGTC2.ktx differ diff --git a/interface/resources/meshes/mannequin/lambert1_Roughness.png b/interface/resources/meshes/mannequin/lambert1_Roughness.png index 9efa372541..aa8073623e 100644 Binary files a/interface/resources/meshes/mannequin/lambert1_Roughness.png and b/interface/resources/meshes/mannequin/lambert1_Roughness.png differ diff --git a/interface/resources/meshes/mannequin/lambert1_Roughness.texmeta.json b/interface/resources/meshes/mannequin/lambert1_Roughness.texmeta.json new file mode 100644 index 0000000000..ce0a3d9aa0 --- /dev/null +++ b/interface/resources/meshes/mannequin/lambert1_Roughness.texmeta.json @@ -0,0 +1,8 @@ +{ + "compressed": { + "COMPRESSED_R11_EAC": "../lambert1_Roughness_COMPRESSED_R11_EAC.ktx", + "COMPRESSED_RED_RGTC1": "../lambert1_Roughness_COMPRESSED_RED_RGTC1.ktx" + }, + "original": "../lambert1_Roughness.png", + "uncompressed": "" +} diff --git a/interface/resources/meshes/mannequin/lambert1_Roughness_COMPRESSED_R11_EAC.ktx b/interface/resources/meshes/mannequin/lambert1_Roughness_COMPRESSED_R11_EAC.ktx new file mode 100644 index 0000000000..c5f8d8e7d9 Binary files /dev/null and b/interface/resources/meshes/mannequin/lambert1_Roughness_COMPRESSED_R11_EAC.ktx differ diff --git a/interface/resources/meshes/mannequin/lambert1_Roughness_COMPRESSED_RED_RGTC1.ktx b/interface/resources/meshes/mannequin/lambert1_Roughness_COMPRESSED_RED_RGTC1.ktx new file mode 100644 index 0000000000..8cced84f77 Binary files /dev/null and b/interface/resources/meshes/mannequin/lambert1_Roughness_COMPRESSED_RED_RGTC1.ktx differ diff --git a/interface/resources/meshes/mannequin/lambert1_Roughness_bcn.ktx b/interface/resources/meshes/mannequin/lambert1_Roughness_bcn.ktx deleted file mode 100644 index 628e6ce99b..0000000000 Binary files a/interface/resources/meshes/mannequin/lambert1_Roughness_bcn.ktx and /dev/null differ diff --git a/interface/resources/meshes/mannequin/mannequin.baked.fbx b/interface/resources/meshes/mannequin/mannequin.baked.fbx index 63611b0b6c..6151caa89e 100644 Binary files a/interface/resources/meshes/mannequin/mannequin.baked.fbx and b/interface/resources/meshes/mannequin/mannequin.baked.fbx differ diff --git a/interface/resources/qml/controls/FlickableWebViewCore.qml b/interface/resources/qml/controls/FlickableWebViewCore.qml index cce32c137a..a89a0cf37b 100644 --- a/interface/resources/qml/controls/FlickableWebViewCore.qml +++ b/interface/resources/qml/controls/FlickableWebViewCore.qml @@ -34,10 +34,34 @@ Item { webViewCore.stop(); } + Timer { + id: delayedUnfocuser + repeat: false + interval: 200 + onTriggered: { + + // The idea behind this is to delay unfocusing, so that fast lower/raise will not result actual unfocusing. + // Fast lower/raise happens every time keyboard is being re-raised (see the code below in OffscreenQmlSurface::setKeyboardRaised) + // + // if (raised) { + // item->setProperty("keyboardRaised", QVariant(!raised)); + // } + // + // item->setProperty("keyboardRaised", QVariant(raised)); + // + + webViewCore.runJavaScript("if (document.activeElement) document.activeElement.blur();", function(result) { + console.log('unfocus completed: ', result); + }); + } + } + function unfocus() { - webViewCore.runJavaScript("if (document.activeElement) document.activeElement.blur();", function(result) { - console.log('unfocus completed: ', result); - }); + delayedUnfocuser.start(); + } + + function stopUnfocus() { + delayedUnfocuser.stop(); } function onLoadingChanged(loadRequest) { diff --git a/interface/resources/qml/controls/TabletWebScreen.qml b/interface/resources/qml/controls/TabletWebScreen.qml index be11f16498..8aaafbd0fe 100644 --- a/interface/resources/qml/controls/TabletWebScreen.qml +++ b/interface/resources/qml/controls/TabletWebScreen.qml @@ -13,6 +13,8 @@ Item { onKeyboardRaisedChanged: { if(!keyboardRaised) { webroot.unfocus(); + } else { + webroot.stopUnfocus(); } } property bool punctuationMode: false diff --git a/interface/resources/qml/controls/TabletWebView.qml b/interface/resources/qml/controls/TabletWebView.qml index 94f4c7978c..3959dbf01b 100644 --- a/interface/resources/qml/controls/TabletWebView.qml +++ b/interface/resources/qml/controls/TabletWebView.qml @@ -17,6 +17,8 @@ Item { onKeyboardRaisedChanged: { if(!keyboardRaised) { webroot.unfocus(); + } else { + webroot.stopUnfocus(); } } property bool punctuationMode: false diff --git a/interface/resources/qml/controls/WebView.qml b/interface/resources/qml/controls/WebView.qml index 375bcd50e0..6d72c529f6 100644 --- a/interface/resources/qml/controls/WebView.qml +++ b/interface/resources/qml/controls/WebView.qml @@ -15,6 +15,8 @@ Item { onKeyboardRaisedChanged: { if(!keyboardRaised) { webroot.unfocus(); + } else { + webroot.stopUnfocus(); } } property bool punctuationMode: false diff --git a/interface/resources/qml/hifi/Card.qml b/interface/resources/qml/hifi/Card.qml index 7f29324416..f7147e1264 100644 --- a/interface/resources/qml/hifi/Card.qml +++ b/interface/resources/qml/hifi/Card.qml @@ -49,6 +49,7 @@ Item { property string defaultThumbnail: Qt.resolvedUrl("../../images/default-domain.gif"); property int shadowHeight: 10; property bool hovered: false + property bool scrolling: false HifiConstants { id: hifi } @@ -236,11 +237,12 @@ Item { property var hoverThunk: function () { }; property var unhoverThunk: function () { }; Rectangle { - anchors.fill: parent; - visible: root.hovered - color: "transparent"; - border.width: 4; border.color: hifiStyleConstants.colors.primaryHighlight; - z: 1; + anchors.fill: parent + visible: root.hovered && !root.scrolling + color: "transparent" + border.width: 4 + border.color: hifiStyleConstants.colors.primaryHighlight + z: 1 } MouseArea { anchors.fill: parent; @@ -255,6 +257,12 @@ Item { hoverThunk(); } onExited: unhoverThunk(); + onCanceled: unhoverThunk(); + } + MouseArea { + // This second mouse area causes onEntered to fire on the first if you scroll just a little and the cursor stays on + // the original card. I.e., the original card is re-highlighted if the cursor is on it after scrolling finishes. + anchors.fill: parent } StateImage { id: actionIcon; diff --git a/interface/resources/qml/hifi/Feed.qml b/interface/resources/qml/hifi/Feed.qml index 4cfd4804b3..6928fc6f02 100644 --- a/interface/resources/qml/hifi/Feed.qml +++ b/interface/resources/qml/hifi/Feed.qml @@ -141,6 +141,8 @@ Column { textSizeSmall: root.textSizeSmall; stackShadowNarrowing: root.stackShadowNarrowing; shadowHeight: root.stackedCardShadowHeight; + scrolling: scroll.moving + hoverThunk: function () { hovered = true; if(root.autoScrollTimerEnabled) { diff --git a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml index 0740914440..b707d41025 100644 --- a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml +++ b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml @@ -48,16 +48,32 @@ Rectangle { refresh(avatar); } + function extractTitleFromUrl(url) { + for (var j = (url.length - 1); j >= 0; --j) { + if (url[j] === '/') { + return url.substring(j + 1); + } + } + return url; + } + function refresh(avatar) { wearablesCombobox.model.clear(); wearablesCombobox.currentIndex = -1; for (var i = 0; i < avatar.wearables.count; ++i) { var wearable = avatar.wearables.get(i).properties; - for (var j = (wearable.modelURL.length - 1); j >= 0; --j) { - if (wearable.modelURL[j] === '/') { - wearable.text = wearable.modelURL.substring(j + 1); - break; + if (wearable.modelURL) { + wearable.text = extractTitleFromUrl(wearable.modelURL); + } else if (wearable.materialURL) { + var materialUrlOrJson = ''; + if (!wearable.materialURL.startsWith('materialData')) { + materialUrlOrJson = extractTitleFromUrl(wearable.materialURL); + } else if (wearable.materialData) { + materialUrlOrJson = JSON.stringify(JSON.parse(wearable.materialData)) + } + if(materialUrlOrJson) { + wearable.text = 'Material: ' + materialUrlOrJson; } } wearablesCombobox.model.append(wearable); diff --git a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml index 81fec4ace3..37ce50b469 100644 --- a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml +++ b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml @@ -536,8 +536,8 @@ Rectangle { Rectangle { id: exchangeMoneyMessagesWaitingLight; visible: parent.messagesWaiting; - anchors.right: exchangeMoneyTabIcon.left; - anchors.rightMargin: 9; + anchors.left: parent.left; + anchors.leftMargin: 16; anchors.top: exchangeMoneyTabIcon.top; anchors.topMargin: 4; height: 10; diff --git a/interface/resources/qml/hifi/dialogs/security/Security.qml b/interface/resources/qml/hifi/dialogs/security/Security.qml index 08605033a5..b754cb06ab 100644 --- a/interface/resources/qml/hifi/dialogs/security/Security.qml +++ b/interface/resources/qml/hifi/dialogs/security/Security.qml @@ -15,7 +15,7 @@ import Hifi 1.0 as Hifi import QtQuick 2.5 import QtGraphicalEffects 1.0 import stylesUit 1.0 as HifiStylesUit -import controlsUit 1.0 as as HifiControlsUit +import controlsUit 1.0 as HifiControlsUit import "qrc:////qml//controls" as HifiControls import "qrc:////qml//hifi//commerce//common" as HifiCommerceCommon diff --git a/interface/resources/qml/hifi/dialogs/security/SecurityImageChange.qml b/interface/resources/qml/hifi/dialogs/security/SecurityImageChange.qml index 82d094144d..e563bd13ca 100644 --- a/interface/resources/qml/hifi/dialogs/security/SecurityImageChange.qml +++ b/interface/resources/qml/hifi/dialogs/security/SecurityImageChange.qml @@ -13,7 +13,7 @@ import Hifi 1.0 as Hifi import QtQuick 2.5 -import stylesUit 1.0 +import stylesUit 1.0 as HifiStylesUit import controlsUit 1.0 as HifiControlsUit import "qrc:////qml//controls" as HifiControls diff --git a/interface/resources/qml/hifi/dialogs/security/SecurityImageSelection.qml b/interface/resources/qml/hifi/dialogs/security/SecurityImageSelection.qml index 366372622c..3451cbcf50 100644 --- a/interface/resources/qml/hifi/dialogs/security/SecurityImageSelection.qml +++ b/interface/resources/qml/hifi/dialogs/security/SecurityImageSelection.qml @@ -13,7 +13,7 @@ import Hifi 1.0 as Hifi import QtQuick 2.5 -import stylesUit 1.0 +import stylesUit 1.0 as HifiStylesUit import controlsUit 1.0 as HifiControlsUit import "qrc:////qml//controls" as HifiControls diff --git a/interface/resources/qml/hifi/tablet/TabletHome.qml b/interface/resources/qml/hifi/tablet/TabletHome.qml index 934ed91995..f1f54e8419 100644 --- a/interface/resources/qml/hifi/tablet/TabletHome.qml +++ b/interface/resources/qml/hifi/tablet/TabletHome.qml @@ -251,17 +251,29 @@ Item { height: 15 Rectangle { + property bool isHovered: false anchors.centerIn: parent - opacity: index === pageIndicator.currentIndex ? 0.95 : 0.45 - implicitWidth: index === pageIndicator.currentIndex ? 15 : 10 + opacity: index === pageIndicator.currentIndex || isHovered ? 0.95 : 0.45 + implicitWidth: index === pageIndicator.currentIndex || isHovered ? 15 : 10 implicitHeight: implicitWidth radius: width/2 - color: "white" + color: isHovered && index !== pageIndicator.currentIndex ? "#1fc6a6" : "white" Behavior on opacity { OpacityAnimator { duration: 100 } } + + MouseArea { + anchors.centerIn: parent + width: 20 + height: 30 // Make it easier to target with laser. + hoverEnabled: true + enabled: true + onEntered: parent.isHovered = true; + onExited: parent.isHovered = false; + onClicked: swipeView.currentIndex = index; + } } } diff --git a/interface/src/AndroidHelper.cpp b/interface/src/AndroidHelper.cpp index ae6aa34cc9..708859c00a 100644 --- a/interface/src/AndroidHelper.cpp +++ b/interface/src/AndroidHelper.cpp @@ -73,6 +73,14 @@ void AndroidHelper::notifyHeadsetOn(bool pluggedIn) { #endif } +void AndroidHelper::muteMic() { + auto audioClient = DependencyManager::get(); + if (audioClient) { + QMetaObject::invokeMethod(audioClient.data(), "setMuted", Q_ARG(bool, true), Q_ARG(bool, true)); + } +} + + void AndroidHelper::signup(QString email, QString username, QString password) { JSONCallbackParameters callbackParams; callbackParams.callbackReceiver = this; diff --git a/interface/src/AndroidHelper.h b/interface/src/AndroidHelper.h index f1917deca0..f0aaa84214 100644 --- a/interface/src/AndroidHelper.h +++ b/interface/src/AndroidHelper.h @@ -35,6 +35,7 @@ public: void performHapticFeedback(int duration); void processURL(const QString &url); void notifyHeadsetOn(bool pluggedIn); + void muteMic(); AndroidHelper(AndroidHelper const&) = delete; void operator=(AndroidHelper const&) = delete; diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 368f4d4d9a..75a9f598f7 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2809,6 +2809,7 @@ void Application::initializeGL() { } // Build a shared canvas / context for the QML rendering +#if !defined(DISABLE_QML) { _qmlShareContext = new OffscreenGLCanvas(); _qmlShareContext->setObjectName("QmlShareContext"); @@ -2822,6 +2823,8 @@ void Application::initializeGL() { qCWarning(interfaceapp, "Unable to make window context current"); } } +#endif + _renderEventHandler = new RenderEventHandler(); @@ -3534,7 +3537,17 @@ void Application::handleSandboxStatus(QNetworkReply* reply) { } else { #if !defined(Q_OS_ANDROID) - qCDebug(interfaceapp) << "Not first run... going to" << qPrintable(addressLookupString.isEmpty() ? QString("previous location") : addressLookupString); + QString goingTo = ""; + if (addressLookupString.isEmpty()) { + if (Menu::getInstance()->isOptionChecked(MenuOption::HomeLocation)) { + auto locationBookmarks = DependencyManager::get(); + addressLookupString = locationBookmarks->addressForBookmark(LocationBookmarks::HOME_BOOKMARK); + goingTo = "home location"; + } else { + goingTo = "previous location"; + } + } + qCDebug(interfaceapp) << "Not first run... going to" << qPrintable(!goingTo.isEmpty() ? goingTo : addressLookupString); DependencyManager::get()->loadSettings(addressLookupString); sentTo = SENT_TO_PREVIOUS_LOCATION; #endif diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 1fc1e0c033..9d2d266b5c 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -226,6 +226,14 @@ Menu::Menu() { addActionToQMenuAndActionHash(navigateMenu, MenuOption::CopyPath, 0, addressManager.data(), SLOT(copyPath())); + // Navigate > Start-up Location + MenuWrapper* startupLocationMenu = navigateMenu->addMenu(MenuOption::StartUpLocation); + QActionGroup* startupLocatiopnGroup = new QActionGroup(startupLocationMenu); + startupLocatiopnGroup->setExclusive(true); + startupLocatiopnGroup->addAction(addCheckableActionToQMenuAndActionHash(startupLocationMenu, MenuOption::HomeLocation, 0, + false)); + startupLocatiopnGroup->addAction(addCheckableActionToQMenuAndActionHash(startupLocationMenu, MenuOption::LastLocation, 0, + true)); // Settings menu ---------------------------------- MenuWrapper* settingsMenu = addMenu("Settings"); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index f1d56825b5..d26879c816 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -117,9 +117,11 @@ namespace MenuOption { const QString FrameTimer = "Show Timer"; const QString FullscreenMirror = "Mirror"; const QString Help = "Help..."; + const QString HomeLocation = "Home"; const QString IncreaseAvatarSize = "Increase Avatar Size"; const QString IndependentMode = "Independent Mode"; const QString ActionMotorControl = "Enable Default Motor Control"; + const QString LastLocation = "Last Location"; const QString LoadScript = "Open and Run Script File..."; const QString LoadScriptURL = "Open and Run Script from URL..."; const QString LodTools = "LOD Tools"; @@ -197,6 +199,7 @@ namespace MenuOption { const QString SimulateEyeTracking = "Simulate"; const QString SMIEyeTracking = "SMI Eye Tracking"; const QString SparseTextureManagement = "Enable Sparse Texture Management"; + const QString StartUpLocation = "Start-Up Location"; const QString Stats = "Show Statistics"; const QString AnimStats = "Show Animation Stats"; const QString StopAllScripts = "Stop All Scripts"; diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index e5e94da68a..bc72c7d7c5 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #include diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index aa57336a3c..a5c6f7b000 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -127,16 +127,16 @@ void AvatarManager::setSpace(workload::SpacePointer& space ) { void AvatarManager::handleTransitAnimations(AvatarTransit::Status status) { switch (status) { case AvatarTransit::Status::STARTED: - _myAvatar->getSkeletonModel()->getRig().triggerNetworkAnimation("preTransitAnim"); + _myAvatar->getSkeletonModel()->getRig().triggerNetworkRole("preTransitAnim"); break; case AvatarTransit::Status::START_TRANSIT: - _myAvatar->getSkeletonModel()->getRig().triggerNetworkAnimation("transitAnim"); + _myAvatar->getSkeletonModel()->getRig().triggerNetworkRole("transitAnim"); break; case AvatarTransit::Status::END_TRANSIT: - _myAvatar->getSkeletonModel()->getRig().triggerNetworkAnimation("postTransitAnim"); + _myAvatar->getSkeletonModel()->getRig().triggerNetworkRole("postTransitAnim"); break; case AvatarTransit::Status::ENDED: - _myAvatar->getSkeletonModel()->getRig().triggerNetworkAnimation("idleAnim"); + _myAvatar->getSkeletonModel()->getRig().triggerNetworkRole("idleAnim"); break; case AvatarTransit::Status::PRE_TRANSIT: break; @@ -837,7 +837,7 @@ void AvatarManager::setAvatarSortCoefficient(const QString& name, const QScriptV } } -QVariantMap AvatarManager::getPalData(const QList specificAvatarIdentifiers) { +QVariantMap AvatarManager::getPalData(const QStringList& specificAvatarIdentifiers) { QJsonArray palData; auto avatarMap = getHashCopy(); diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 78dac2d3ad..422f6acffb 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -184,11 +184,11 @@ public: * than iterating over each avatar and obtaining data about them in JavaScript, as that method * locks and unlocks each avatar's data structure potentially hundreds of times per update tick. * @function AvatarManager.getPalData - * @param {string[]} [specificAvatarIdentifiers] - A list of specific Avatar Identifiers about - * which you want to get PAL data - * @returns {object} + * @param {string[]} [specificAvatarIdentifiers=[]] - The list of IDs of the avatars you want the PAL data for. + * If an empty list, the PAL data for all nearby avatars is returned. + * @returns {object[]} An array of objects, each object being the PAL data for an avatar. */ - Q_INVOKABLE QVariantMap getPalData(const QList specificAvatarIdentifiers = QList()); + Q_INVOKABLE QVariantMap getPalData(const QStringList& specificAvatarIdentifiers = QStringList()); float getMyAvatarSendRate() const { return _myAvatarSendRate.rate(); } int getIdentityRequestsSent() const { return _identityRequestsSent; } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 8d47591d40..6b2264c924 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -538,17 +538,25 @@ void MyAvatar::update(float deltaTime) { // put the average hand azimuth into sensor space. // then mix it with head facing direction to determine rotation recenter - if (getControllerPoseInAvatarFrame(controller::Action::LEFT_HAND).isValid() && getControllerPoseInAvatarFrame(controller::Action::RIGHT_HAND).isValid()) { - glm::vec3 handHipAzimuthWorldSpace = transformVectorFast(getTransform().getMatrix(), glm::vec3(_hipToHandController.x, 0.0f, _hipToHandController.y)); + int spine2Index = _skeletonModel->getRig().indexOfJoint("Spine2"); + if (getControllerPoseInAvatarFrame(controller::Action::LEFT_HAND).isValid() && getControllerPoseInAvatarFrame(controller::Action::RIGHT_HAND).isValid() && !(spine2Index < 0)) { + + // use the spine for the azimuth origin. + glm::quat spine2Rot = getAbsoluteJointRotationInObjectFrame(spine2Index); + glm::vec3 handHipAzimuthAvatarSpace = spine2Rot * glm::vec3(_hipToHandController.x, 0.0f, _hipToHandController.y); + glm::vec3 handHipAzimuthWorldSpace = transformVectorFast(getTransform().getMatrix(), handHipAzimuthAvatarSpace); glm::mat4 sensorToWorldMat = getSensorToWorldMatrix(); glm::mat4 worldToSensorMat = glm::inverse(sensorToWorldMat); glm::vec3 handHipAzimuthSensorSpace = transformVectorFast(worldToSensorMat, handHipAzimuthWorldSpace); glm::vec2 normedHandHipAzimuthSensorSpace(0.0f, 1.0f); if (glm::length(glm::vec2(handHipAzimuthSensorSpace.x, handHipAzimuthSensorSpace.z)) > 0.0f) { normedHandHipAzimuthSensorSpace = glm::normalize(glm::vec2(handHipAzimuthSensorSpace.x, handHipAzimuthSensorSpace.z)); + glm::vec2 headFacingPlusHandHipAzimuthMix = lerp(normedHandHipAzimuthSensorSpace, _headControllerFacing, PERCENTAGE_WEIGHT_HEAD_VS_SHOULDERS_AZIMUTH); + _headControllerFacingMovingAverage = lerp(_headControllerFacingMovingAverage, headFacingPlusHandHipAzimuthMix, tau); + } else { + // use head facing if the chest arms vector is up or down. + _headControllerFacingMovingAverage = lerp(_headControllerFacingMovingAverage, _headControllerFacing, tau); } - glm::vec2 headFacingPlusHandHipAzimuthMix = lerp(normedHandHipAzimuthSensorSpace, _headControllerFacing, PERCENTAGE_WEIGHT_HEAD_VS_SHOULDERS_AZIMUTH); - _headControllerFacingMovingAverage = lerp(_headControllerFacingMovingAverage, headFacingPlusHandHipAzimuthMix, tau); } else { _headControllerFacingMovingAverage = lerp(_headControllerFacingMovingAverage, _headControllerFacing, tau); } @@ -979,35 +987,48 @@ void MyAvatar::updateFromHMDSensorMatrix(const glm::mat4& hmdSensorMatrix) { } // Find the vector halfway between the hip to hand azimuth vectors -// This midpoint hand azimuth is in Avatar space +// This midpoint hand azimuth is in Spine2 space glm::vec2 MyAvatar::computeHandAzimuth() const { controller::Pose leftHandPoseAvatarSpace = getLeftHandPose(); controller::Pose rightHandPoseAvatarSpace = getRightHandPose(); controller::Pose headPoseAvatarSpace = getControllerPoseInAvatarFrame(controller::Action::HEAD); const float HALFWAY = 0.50f; + glm::vec2 latestHipToHandController = _hipToHandController; - if (leftHandPoseAvatarSpace.isValid() && rightHandPoseAvatarSpace.isValid() && headPoseAvatarSpace.isValid()) { + int spine2Index = _skeletonModel->getRig().indexOfJoint("Spine2"); + if (leftHandPoseAvatarSpace.isValid() && rightHandPoseAvatarSpace.isValid() && headPoseAvatarSpace.isValid() && !(spine2Index < 0)) { + + glm::vec3 spine2Position = getAbsoluteJointTranslationInObjectFrame(spine2Index); + glm::quat spine2Rotation = getAbsoluteJointRotationInObjectFrame(spine2Index); + + glm::vec3 rightHandOffset = rightHandPoseAvatarSpace.translation - spine2Position; + glm::vec3 leftHandOffset = leftHandPoseAvatarSpace.translation - spine2Position; + glm::vec3 rightHandSpine2Space = glm::inverse(spine2Rotation) * rightHandOffset; + glm::vec3 leftHandSpine2Space = glm::inverse(spine2Rotation) * leftHandOffset; + // we need the old azimuth reading to prevent flipping the facing direction 180 // in the case where the hands go from being slightly less than 180 apart to slightly more than 180 apart. glm::vec2 oldAzimuthReading = _hipToHandController; - if ((glm::length(glm::vec2(rightHandPoseAvatarSpace.translation.x, rightHandPoseAvatarSpace.translation.z)) > 0.0f) && (glm::length(glm::vec2(leftHandPoseAvatarSpace.translation.x, leftHandPoseAvatarSpace.translation.z)) > 0.0f)) { - latestHipToHandController = lerp(glm::normalize(glm::vec2(rightHandPoseAvatarSpace.translation.x, rightHandPoseAvatarSpace.translation.z)), glm::normalize(glm::vec2(leftHandPoseAvatarSpace.translation.x, leftHandPoseAvatarSpace.translation.z)), HALFWAY); + if ((glm::length(glm::vec2(rightHandSpine2Space.x, rightHandSpine2Space.z)) > 0.0f) && (glm::length(glm::vec2(leftHandSpine2Space.x, leftHandSpine2Space.z)) > 0.0f)) { + latestHipToHandController = lerp(glm::normalize(glm::vec2(rightHandSpine2Space.x, rightHandSpine2Space.z)), glm::normalize(glm::vec2(leftHandSpine2Space.x, leftHandSpine2Space.z)), HALFWAY); } else { - latestHipToHandController = glm::vec2(0.0f, -1.0f); + latestHipToHandController = glm::vec2(0.0f, 1.0f); } glm::vec3 headLookAtAvatarSpace = transformVectorFast(headPoseAvatarSpace.getMatrix(), glm::vec3(0.0f, 0.0f, 1.0f)); - glm::vec2 headAzimuthAvatarSpace = glm::vec2(headLookAtAvatarSpace.x, headLookAtAvatarSpace.z); - if (glm::length(headAzimuthAvatarSpace) > 0.0f) { - headAzimuthAvatarSpace = glm::normalize(headAzimuthAvatarSpace); + glm::vec3 headLookAtSpine2Space = glm::inverse(spine2Rotation) * headLookAtAvatarSpace; + + glm::vec2 headAzimuthSpine2Space = glm::vec2(headLookAtSpine2Space.x, headLookAtSpine2Space.z); + if (glm::length(headAzimuthSpine2Space) > 0.0f) { + headAzimuthSpine2Space = glm::normalize(headAzimuthSpine2Space); } else { - headAzimuthAvatarSpace = -latestHipToHandController; + headAzimuthSpine2Space = -latestHipToHandController; } // check the angular distance from forward and back float cosForwardAngle = glm::dot(latestHipToHandController, oldAzimuthReading); - float cosHeadShoulder = glm::dot(-latestHipToHandController, headAzimuthAvatarSpace); + float cosHeadShoulder = glm::dot(-latestHipToHandController, headAzimuthSpine2Space); // if we are now closer to the 180 flip of the previous chest forward // then we negate our computed latestHipToHandController to keep the chest from flipping. // also check the head to shoulder azimuth difference if we negate. @@ -1893,8 +1914,6 @@ void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { bool isWearableEntity(const EntityItemPointer& entity) { return entity->isVisible() - && (entity->getParentJointIndex() != INVALID_JOINT_INDEX - || (entity->getType() == EntityTypes::Model && (std::static_pointer_cast(entity))->getRelayParentJoints())) && (entity->getParentID() == DependencyManager::get()->getSessionUUID() || entity->getParentID() == AVATAR_SELF_ID); } @@ -3520,19 +3539,33 @@ glm::mat4 MyAvatar::deriveBodyFromHMDSensor() const { } glm::mat4 MyAvatar::getSpine2RotationRigSpace() const { + int spine2Index = _skeletonModel->getRig().indexOfJoint("Spine2"); + glm::quat spine2Rot = Quaternions::IDENTITY; + if (!(spine2Index < 0)) { + // use the spine for the azimuth origin. + spine2Rot = getAbsoluteJointRotationInObjectFrame(spine2Index); + } + glm::vec3 spine2UpAvatarSpace = spine2Rot * glm::vec3(0.0f, 1.0f, 0.0f); + glm::vec3 spine2FwdAvatarSpace = spine2Rot * glm::vec3(_hipToHandController.x, 0.0f, _hipToHandController.y); // static const glm::quat RIG_CHANGE_OF_BASIS = Quaternions::Y_180; // RIG_CHANGE_OF_BASIS * AVATAR_TO_RIG_ROTATION * inverse(RIG_CHANGE_OF_BASIS) = Quaternions::Y_180; //avatar Space; const glm::quat AVATAR_TO_RIG_ROTATION = Quaternions::Y_180; - glm::vec3 hipToHandRigSpace = AVATAR_TO_RIG_ROTATION * glm::vec3(_hipToHandController.x, 0.0f, _hipToHandController.y); + glm::vec3 spine2UpRigSpace = AVATAR_TO_RIG_ROTATION * spine2UpAvatarSpace; + glm::vec3 spine2FwdRigSpace = AVATAR_TO_RIG_ROTATION * spine2FwdAvatarSpace; glm::vec3 u, v, w; - if (glm::length(hipToHandRigSpace) > 0.0f) { - hipToHandRigSpace = glm::normalize(hipToHandRigSpace); + if (glm::length(spine2FwdRigSpace) > 0.0f) { + spine2FwdRigSpace = glm::normalize(spine2FwdRigSpace); } else { - hipToHandRigSpace = glm::vec3(0.0f, 0.0f, 1.0f); + spine2FwdRigSpace = glm::vec3(0.0f, 0.0f, 1.0f); } - generateBasisVectors(glm::vec3(0.0f,1.0f,0.0f), hipToHandRigSpace, u, v, w); + if (glm::length(spine2UpRigSpace) > 0.0f) { + spine2UpRigSpace = glm::normalize(spine2UpRigSpace); + } else { + spine2UpRigSpace = glm::vec3(0.0f, 1.0f, 0.0f); + } + generateBasisVectors(spine2UpRigSpace, spine2FwdRigSpace, u, v, w); glm::mat4 spine2RigSpace(glm::vec4(w, 0.0f), glm::vec4(u, 0.0f), glm::vec4(v, 0.0f), glm::vec4(glm::vec3(0.0f, 0.0f, 0.0f), 1.0f)); return spine2RigSpace; } diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 799427530a..85ad6fe7a4 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1731,7 +1731,7 @@ private: glm::vec2 _headControllerFacingMovingAverage { 0.0f, 0.0f }; // facing vector in xz plane (sensor space) glm::quat _averageHeadRotation { 0.0f, 0.0f, 0.0f, 1.0f }; - glm::vec2 _hipToHandController { 0.0f, -1.0f }; // spine2 facing vector in xz plane (avatar space) + glm::vec2 _hipToHandController { 0.0f, 1.0f }; // spine2 facing vector in xz plane (spine2 space) float _currentStandingHeight { 0.0f }; bool _resetMode { true }; diff --git a/interface/src/avatar/MySkeletonModel.cpp b/interface/src/avatar/MySkeletonModel.cpp index 2a21f78b21..524292b004 100644 --- a/interface/src/avatar/MySkeletonModel.cpp +++ b/interface/src/avatar/MySkeletonModel.cpp @@ -233,6 +233,7 @@ void MySkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { myAvatar->getControllerPoseInAvatarFrame(controller::Action::LEFT_HAND).isValid() && !(params.primaryControllerFlags[Rig::PrimaryControllerType_Spine2] & (uint8_t)Rig::ControllerFlags::Enabled)) { + const float SPINE2_ROTATION_FILTER = 0.5f; AnimPose currentSpine2Pose; AnimPose currentHeadPose; AnimPose currentHipsPose; @@ -252,7 +253,7 @@ void MySkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { } generateBasisVectors(up, fwd, u, v, w); AnimPose newSpinePose(glm::mat4(glm::vec4(w, 0.0f), glm::vec4(u, 0.0f), glm::vec4(v, 0.0f), glm::vec4(glm::vec3(0.0f, 0.0f, 0.0f), 1.0f))); - currentSpine2Pose.rot() = newSpinePose.rot(); + currentSpine2Pose.rot() = safeLerp(currentSpine2Pose.rot(), newSpinePose.rot(), SPINE2_ROTATION_FILTER); params.primaryControllerPoses[Rig::PrimaryControllerType_Spine2] = currentSpine2Pose; params.primaryControllerFlags[Rig::PrimaryControllerType_Spine2] = (uint8_t)Rig::ControllerFlags::Enabled | (uint8_t)Rig::ControllerFlags::Estimated; } diff --git a/interface/src/scripting/Audio.h b/interface/src/scripting/Audio.h index 4b8eb6aabc..4c4bf6dd60 100644 --- a/interface/src/scripting/Audio.h +++ b/interface/src/scripting/Audio.h @@ -50,6 +50,8 @@ class Audio : public AudioScriptingInterface, protected ReadWriteLockable { * Read-only. * @property {object} devices Read-only. Deprecated: This property is deprecated and will be * removed. + * @property {boolean} isSoloing Read-only. true if any nodes are soloed. + * @property {Uuid[]} soloList Read-only. Get the list of currently soloed node UUIDs. */ Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged) diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index c2f909dd24..550c78d35d 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -135,30 +135,6 @@ void Rig::overrideAnimation(const QString& url, float fps, bool loop, float firs _animVars.set("userAnimB", clipNodeEnum == UserAnimState::B); } -void Rig::triggerNetworkAnimation(const QString& animName) { - _networkVars.set("idleAnim", false); - _networkVars.set("preTransitAnim", false); - _networkVars.set("transitAnim", false); - _networkVars.set("postTransitAnim", false); - _sendNetworkNode = true; - - if (animName == "idleAnim") { - _networkVars.set("idleAnim", true); - _networkAnimState.clipNodeEnum = NetworkAnimState::Idle; - _sendNetworkNode = false; - } else if (animName == "preTransitAnim") { - _networkVars.set("preTransitAnim", true); - _networkAnimState.clipNodeEnum = NetworkAnimState::PreTransit; - } else if (animName == "transitAnim") { - _networkVars.set("transitAnim", true); - _networkAnimState.clipNodeEnum = NetworkAnimState::Transit; - } else if (animName == "postTransitAnim") { - _networkVars.set("postTransitAnim", true); - _networkAnimState.clipNodeEnum = NetworkAnimState::PostTransit; - } - -} - void Rig::restoreAnimation() { if (_userAnimState.clipNodeEnum != UserAnimState::None) { _userAnimState.clipNodeEnum = UserAnimState::None; @@ -170,13 +146,87 @@ void Rig::restoreAnimation() { } } -void Rig::restoreNetworkAnimation() { - if (_networkAnimState.clipNodeEnum != NetworkAnimState::Idle) { - _networkAnimState.clipNodeEnum = NetworkAnimState::Idle; +void Rig::overrideNetworkAnimation(const QString& url, float fps, bool loop, float firstFrame, float lastFrame) { + + NetworkAnimState::ClipNodeEnum clipNodeEnum = NetworkAnimState::None; + if (_networkAnimState.clipNodeEnum == NetworkAnimState::None || _networkAnimState.clipNodeEnum == NetworkAnimState::B) { + clipNodeEnum = NetworkAnimState::A; + } else if (_networkAnimState.clipNodeEnum == NetworkAnimState::A) { + clipNodeEnum = NetworkAnimState::B; + } + + if (_networkNode) { + // find an unused AnimClip clipNode + std::shared_ptr clip; + if (clipNodeEnum == NetworkAnimState::A) { + clip = std::dynamic_pointer_cast(_networkNode->findByName("userNetworkAnimA")); + } else { + clip = std::dynamic_pointer_cast(_networkNode->findByName("userNetworkAnimB")); + } + if (clip) { + // set parameters + clip->setLoopFlag(loop); + clip->setStartFrame(firstFrame); + clip->setEndFrame(lastFrame); + const float REFERENCE_FRAMES_PER_SECOND = 30.0f; + float timeScale = fps / REFERENCE_FRAMES_PER_SECOND; + clip->setTimeScale(timeScale); + clip->loadURL(url); + } + } + + // store current user anim state. + _networkAnimState = { clipNodeEnum, url, fps, loop, firstFrame, lastFrame }; + + // notify the userAnimStateMachine the desired state. + _networkVars.set("transitAnimStateMachine", false); + _networkVars.set("userNetworkAnimA", clipNodeEnum == NetworkAnimState::A); + _networkVars.set("userNetworkAnimB", clipNodeEnum == NetworkAnimState::B); + if (!_computeNetworkAnimation) { + _networkAnimState.blendTime = 0.0f; + _computeNetworkAnimation = true; + } +} + +void Rig::triggerNetworkRole(const QString& role) { + _networkVars.set("transitAnimStateMachine", false); + _networkVars.set("idleAnim", false); + _networkVars.set("userNetworkAnimA", false); + _networkVars.set("userNetworkAnimB", false); + _networkVars.set("preTransitAnim", false); + _networkVars.set("preTransitAnim", false); + _networkVars.set("transitAnim", false); + _networkVars.set("postTransitAnim", false); + _computeNetworkAnimation = true; + if (role == "idleAnim") { _networkVars.set("idleAnim", true); - _networkVars.set("preTransitAnim", false); - _networkVars.set("transitAnim", false); - _networkVars.set("postTransitAnim", false); + _networkAnimState.clipNodeEnum = NetworkAnimState::None; + _computeNetworkAnimation = false; + _networkAnimState.blendTime = 0.0f; + } else if (role == "preTransitAnim") { + _networkVars.set("preTransitAnim", true); + _networkAnimState.clipNodeEnum = NetworkAnimState::PreTransit; + _networkAnimState.blendTime = 0.0f; + } else if (role == "transitAnim") { + _networkVars.set("transitAnim", true); + _networkAnimState.clipNodeEnum = NetworkAnimState::Transit; + } else if (role == "postTransitAnim") { + _networkVars.set("postTransitAnim", true); + _networkAnimState.clipNodeEnum = NetworkAnimState::PostTransit; + } + +} + +void Rig::restoreNetworkAnimation() { + if (_networkAnimState.clipNodeEnum != NetworkAnimState::None) { + if (_computeNetworkAnimation) { + _networkAnimState.blendTime = 0.0f; + _computeNetworkAnimation = false; + } + _networkAnimState.clipNodeEnum = NetworkAnimState::None; + _networkVars.set("transitAnimStateMachine", true); + _networkVars.set("userNetworkAnimA", false); + _networkVars.set("userNetworkAnimB", false); } } @@ -1131,24 +1181,19 @@ void Rig::updateAnimations(float deltaTime, const glm::mat4& rootTransform, cons AnimVariantMap networkTriggersOut; _internalPoseSet._relativePoses = _animNode->evaluate(_animVars, context, deltaTime, triggersOut); if (_networkNode) { - _networkPoseSet._relativePoses = _networkNode->evaluate(_networkVars, context, deltaTime, networkTriggersOut); - const float NETWORK_ANIMATION_BLEND_FRAMES = 6.0f; + // Manually blending networkPoseSet with internalPoseSet. float alpha = 1.0f; - std::shared_ptr clip; - if (_networkAnimState.clipNodeEnum == NetworkAnimState::PreTransit) { - clip = std::dynamic_pointer_cast(_networkNode->findByName("preTransitAnim")); - if (clip) { - alpha = (clip->getFrame() - clip->getStartFrame()) / NETWORK_ANIMATION_BLEND_FRAMES; - } - } else if (_networkAnimState.clipNodeEnum == NetworkAnimState::PostTransit) { - clip = std::dynamic_pointer_cast(_networkNode->findByName("postTransitAnim")); - if (clip) { - alpha = (clip->getEndFrame() - clip->getFrame()) / NETWORK_ANIMATION_BLEND_FRAMES; - } - } + const float FRAMES_PER_SECOND = 30.0f; + const float TOTAL_BLEND_FRAMES = 6.0f; + const float TOTAL_BLEND_TIME = TOTAL_BLEND_FRAMES / FRAMES_PER_SECOND; + _sendNetworkNode = _computeNetworkAnimation || _networkAnimState.blendTime < TOTAL_BLEND_TIME; if (_sendNetworkNode) { + _networkPoseSet._relativePoses = _networkNode->evaluate(_networkVars, context, deltaTime, networkTriggersOut); + _networkAnimState.blendTime += deltaTime; + alpha = _computeNetworkAnimation ? (_networkAnimState.blendTime / TOTAL_BLEND_TIME) : (1.0f - (_networkAnimState.blendTime / TOTAL_BLEND_TIME)); + alpha = glm::clamp(alpha, 0.0f, 1.0f); for (size_t i = 0; i < _networkPoseSet._relativePoses.size(); i++) { - _networkPoseSet._relativePoses[i].blend(_internalPoseSet._relativePoses[i], (alpha > 1.0f ? 1.0f : alpha)); + _networkPoseSet._relativePoses[i].blend(_internalPoseSet._relativePoses[i], alpha); } } } @@ -1840,16 +1885,16 @@ void Rig::initAnimGraph(const QUrl& url) { return; } _networkNode->setSkeleton(sharedSkeletonPtr); - if (_networkAnimState.clipNodeEnum != NetworkAnimState::Idle) { + if (_networkAnimState.clipNodeEnum != NetworkAnimState::None) { // restore the user animation we had before reset. NetworkAnimState origState = _networkAnimState; - _networkAnimState = { NetworkAnimState::Idle, "", 30.0f, false, 0.0f, 0.0f }; + _networkAnimState = { NetworkAnimState::None, "", 30.0f, false, 0.0f, 0.0f }; if (_networkAnimState.clipNodeEnum == NetworkAnimState::PreTransit) { - triggerNetworkAnimation("preTransitAnim"); + triggerNetworkRole("preTransitAnim"); } else if (_networkAnimState.clipNodeEnum == NetworkAnimState::Transit) { - triggerNetworkAnimation("transitAnim"); + triggerNetworkRole("transitAnim"); } else if (_networkAnimState.clipNodeEnum == NetworkAnimState::PostTransit) { - triggerNetworkAnimation("postTransitAnim"); + triggerNetworkRole("postTransitAnim"); } } @@ -1927,6 +1972,7 @@ AnimPose Rig::getJointPose(int jointIndex) const { void Rig::copyJointsIntoJointData(QVector& jointDataVec) const { const AnimPose geometryToRigPose(_geometryToRigTransform); + const glm::vec3 geometryToRigScale(geometryToRigPose.scale()); jointDataVec.resize((int)getJointStateCount()); for (auto i = 0; i < jointDataVec.size(); i++) { @@ -1939,9 +1985,10 @@ void Rig::copyJointsIntoJointData(QVector& jointDataVec) const { // translations are in relative frame but scaled so that they are in meters, // instead of model units. - glm::vec3 defaultRelTrans = _geometryOffset.scale() * _animSkeleton->getRelativeDefaultPose(i).trans(); - data.translation = _geometryOffset.scale() * (!_sendNetworkNode ? _internalPoseSet._relativePoses[i].trans() : _networkPoseSet._relativePoses[i].trans()); - data.translationIsDefaultPose = isEqual(data.translation, defaultRelTrans); + glm::vec3 defaultRelTrans = _animSkeleton->getRelativeDefaultPose(i).trans(); + glm::vec3 currentRelTrans = _sendNetworkNode ? _networkPoseSet._relativePoses[i].trans() : _internalPoseSet._relativePoses[i].trans(); + data.translation = geometryToRigScale * currentRelTrans; + data.translationIsDefaultPose = isEqual(currentRelTrans, defaultRelTrans); } else { data.translationIsDefaultPose = true; data.rotationIsDefaultPose = true; @@ -1967,6 +2014,8 @@ void Rig::copyJointsFromJointData(const QVector& jointDataVec) { std::vector rotations; rotations.reserve(numJoints); const glm::quat rigToGeometryRot(glmExtractRotation(_rigToGeometryTransform)); + const glm::vec3 rigToGeometryScale(extractScale(_rigToGeometryTransform)); + for (int i = 0; i < numJoints; i++) { const JointData& data = jointDataVec.at(i); if (data.rotationIsDefaultPose) { @@ -1992,7 +2041,7 @@ void Rig::copyJointsFromJointData(const QVector& jointDataVec) { _internalPoseSet._relativePoses[i].trans() = relativeDefaultPoses[i].trans(); } else { // JointData translations are in scaled relative-frame so we scale back to regular relative-frame - _internalPoseSet._relativePoses[i].trans() = _invGeometryOffset.scale() * data.translation; + _internalPoseSet._relativePoses[i].trans() = rigToGeometryScale * data.translation; } } } diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 345f335f88..41c25a3c3e 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -114,8 +114,10 @@ public: void destroyAnimGraph(); void overrideAnimation(const QString& url, float fps, bool loop, float firstFrame, float lastFrame); - void triggerNetworkAnimation(const QString& animName); void restoreAnimation(); + + void overrideNetworkAnimation(const QString& url, float fps, bool loop, float firstFrame, float lastFrame); + void triggerNetworkRole(const QString& role); void restoreNetworkAnimation(); QStringList getAnimationRoles() const; @@ -327,12 +329,14 @@ protected: struct NetworkAnimState { enum ClipNodeEnum { - Idle = 0, + None = 0, PreTransit, Transit, - PostTransit + PostTransit, + A, + B }; - NetworkAnimState() : clipNodeEnum(NetworkAnimState::Idle) {} + NetworkAnimState() : clipNodeEnum(NetworkAnimState::None) {} NetworkAnimState(ClipNodeEnum clipNodeEnumIn, const QString& urlIn, float fpsIn, bool loopIn, float firstFrameIn, float lastFrameIn) : clipNodeEnum(clipNodeEnumIn), url(urlIn), fps(fpsIn), loop(loopIn), firstFrame(firstFrameIn), lastFrame(lastFrameIn) {} @@ -342,6 +346,7 @@ protected: bool loop; float firstFrame; float lastFrame; + float blendTime; }; struct UserAnimState { @@ -411,6 +416,7 @@ protected: int _rigId; bool _headEnabled { false }; + bool _computeNetworkAnimation { false }; bool _sendNetworkNode { false }; AnimContext _lastContext; diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index bdd6d0edc1..92f7a27853 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -270,7 +270,8 @@ AudioClient::AudioClient() : configureReverb(); - auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + auto nodeList = DependencyManager::get(); + auto& packetReceiver = nodeList->getPacketReceiver(); packetReceiver.registerListener(PacketType::AudioStreamStats, &_stats, "processStreamStatsPacket"); packetReceiver.registerListener(PacketType::AudioEnvironment, this, "handleAudioEnvironmentDataPacket"); packetReceiver.registerListener(PacketType::SilentAudioFrame, this, "handleAudioDataPacket"); @@ -278,6 +279,16 @@ AudioClient::AudioClient() : packetReceiver.registerListener(PacketType::NoisyMute, this, "handleNoisyMutePacket"); packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); packetReceiver.registerListener(PacketType::SelectedAudioFormat, this, "handleSelectedAudioFormat"); + + auto& domainHandler = nodeList->getDomainHandler(); + connect(&domainHandler, &DomainHandler::disconnectedFromDomain, this, [this] { + _solo.reset(); + }); + connect(nodeList.data(), &NodeList::nodeActivated, this, [this](SharedNodePointer node) { + if (node->getType() == NodeType::AudioMixer) { + _solo.resend(); + } + }); } AudioClient::~AudioClient() { @@ -472,7 +483,7 @@ QAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { #if defined (Q_OS_ANDROID) if (mode == QAudio::AudioInput) { - Setting::Handle enableAEC(SETTING_AEC_KEY, false); + Setting::Handle enableAEC(SETTING_AEC_KEY, DEFAULT_AEC_ENABLED); bool aecEnabled = enableAEC.get(); auto audioClient = DependencyManager::get(); bool headsetOn = audioClient? audioClient->isHeadsetPluggedIn() : false; @@ -1680,7 +1691,7 @@ void AudioClient::setHeadsetPluggedIn(bool pluggedIn) { QThread::msleep(200); } - Setting::Handle enableAEC(SETTING_AEC_KEY, false); + Setting::Handle enableAEC(SETTING_AEC_KEY, DEFAULT_AEC_ENABLED); bool aecEnabled = enableAEC.get(); if ((pluggedIn || !aecEnabled) && _inputDeviceInfo.deviceName() != VOICE_RECOGNITION) { diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index 5e7f1fb8a0..f3e1ad9a52 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -46,7 +46,6 @@ #include #include - #include #include @@ -69,6 +68,7 @@ #define VOICE_COMMUNICATION "voicecommunication" #define SETTING_AEC_KEY "Android/aec" +#define DEFAULT_AEC_ENABLED true #endif class QAudioInput; @@ -171,6 +171,7 @@ public: void stopRecording(); void setAudioPaused(bool pause); + AudioSolo& getAudioSolo() override { return _solo; } #ifdef Q_OS_WIN static QString getWinDeviceName(wchar_t* guid); @@ -446,6 +447,8 @@ private: #if defined(Q_OS_ANDROID) bool _shouldRestartInputSetup { true }; // Should we restart the input device because of an unintended stop? #endif + + AudioSolo _solo; Mutex _checkDevicesMutex; QTimer* _checkDevicesTimer { nullptr }; diff --git a/libraries/audio/src/AbstractAudioInterface.h b/libraries/audio/src/AbstractAudioInterface.h index bbfd79d0aa..0f075ab224 100644 --- a/libraries/audio/src/AbstractAudioInterface.h +++ b/libraries/audio/src/AbstractAudioInterface.h @@ -19,6 +19,7 @@ #include "AudioInjectorOptions.h" #include "AudioInjector.h" +#include "AudioSolo.h" class AudioInjector; class AudioInjectorLocalBuffer; @@ -38,6 +39,8 @@ public: // take care to delete it when ~AudioInjector, as parenting Qt semantics will not work virtual bool outputLocalInjector(const AudioInjectorPointer& injector) = 0; + virtual AudioSolo& getAudioSolo() = 0; + public slots: virtual bool shouldLoopbackInjectors() { return false; } diff --git a/libraries/audio/src/AudioInjectorLocalBuffer.h b/libraries/audio/src/AudioInjectorLocalBuffer.h index 673966ff09..3065de5199 100644 --- a/libraries/audio/src/AudioInjectorLocalBuffer.h +++ b/libraries/audio/src/AudioInjectorLocalBuffer.h @@ -14,7 +14,7 @@ #include -#include +#include class AudioInjectorLocalBuffer : public QIODevice { Q_OBJECT diff --git a/libraries/audio/src/AudioSolo.cpp b/libraries/audio/src/AudioSolo.cpp new file mode 100644 index 0000000000..9d63f01a8b --- /dev/null +++ b/libraries/audio/src/AudioSolo.cpp @@ -0,0 +1,88 @@ +// +// AudioSolo.cpp +// libraries/audio/src +// +// Created by Clement Brisset on 11/5/18. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "AudioSolo.h" + +#include + +bool AudioSolo::isSoloing() const { + Lock lock(_mutex); + return !_nodesSoloed.empty(); +} + +QVector AudioSolo::getUUIDs() const { + Lock lock(_mutex); + return _nodesSoloed.values().toVector(); +} + +void AudioSolo::addUUIDs(QVector uuidList) { + // create a reliable NLPacket with space for the solo UUIDs + auto soloPacket = NLPacket::create(PacketType::AudioSoloRequest, + uuidList.size() * NUM_BYTES_RFC4122_UUID + sizeof(uint8_t), true); + uint8_t addToSoloList = (uint8_t)true; + soloPacket->writePrimitive(addToSoloList); + + { + Lock lock(_mutex); + for (auto uuid : uuidList) { + if (_nodesSoloed.contains(uuid)) { + qWarning() << "Uuid already in solo list:" << uuid; + } else { + // write the node ID to the packet + soloPacket->write(uuid.toRfc4122()); + _nodesSoloed.insert(uuid); + } + } + } + + // send off this solo packet reliably to the matching node + auto nodeList = DependencyManager::get(); + nodeList->broadcastToNodes(std::move(soloPacket), { NodeType::AudioMixer }); +} + +void AudioSolo::removeUUIDs(QVector uuidList) { + // create a reliable NLPacket with space for the solo UUIDs + auto soloPacket = NLPacket::create(PacketType::AudioSoloRequest, + uuidList.size() * NUM_BYTES_RFC4122_UUID + sizeof(uint8_t), true); + uint8_t addToSoloList = (uint8_t)false; + soloPacket->writePrimitive(addToSoloList); + + { + Lock lock(_mutex); + for (auto uuid : uuidList) { + if (!_nodesSoloed.contains(uuid)) { + qWarning() << "Uuid not in solo list:" << uuid; + } else { + // write the node ID to the packet + soloPacket->write(uuid.toRfc4122()); + _nodesSoloed.remove(uuid); + } + } + } + + // send off this solo packet reliably to the matching node + auto nodeList = DependencyManager::get(); + nodeList->broadcastToNodes(std::move(soloPacket), { NodeType::AudioMixer }); +} + +void AudioSolo::reset() { + Lock lock(_mutex); + removeUUIDs(getUUIDs()); +} + + +void AudioSolo::resend() { + Lock lock(_mutex); + auto uuids = getUUIDs(); + _nodesSoloed.clear(); + addUUIDs(uuids); +} + diff --git a/libraries/audio/src/AudioSolo.h b/libraries/audio/src/AudioSolo.h new file mode 100644 index 0000000000..790280a14b --- /dev/null +++ b/libraries/audio/src/AudioSolo.h @@ -0,0 +1,40 @@ +// +// AudioSolo.h +// libraries/audio/src +// +// Created by Clement Brisset on 11/5/18. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#pragma once + +#ifndef hifi_AudioSolo_h +#define hifi_AudioSolo_h + +#include + +#include +#include + +class AudioSolo { + using Mutex = std::recursive_mutex; + using Lock = std::unique_lock; + +public: + bool isSoloing() const; + QVector getUUIDs() const; + void addUUIDs(QVector uuidList); + void removeUUIDs(QVector uuidList); + void reset(); + + void resend(); + +private: + mutable Mutex _mutex; + QSet _nodesSoloed; +}; + +#endif // hifi_AudioSolo_h diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index f694148b30..03938dd3de 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -1724,22 +1724,23 @@ void Avatar::computeShapeInfo(ShapeInfo& shapeInfo) { } void Avatar::getCapsule(glm::vec3& start, glm::vec3& end, float& radius) { - // FIXME: this doesn't take into account Avatar rotation ShapeInfo shapeInfo; computeShapeInfo(shapeInfo); - glm::vec3 halfExtents = shapeInfo.getHalfExtents(); // x = radius, y = halfHeight - start = getWorldPosition() - glm::vec3(0, halfExtents.y, 0) + shapeInfo.getOffset(); - end = getWorldPosition() + glm::vec3(0, halfExtents.y, 0) + shapeInfo.getOffset(); + glm::vec3 halfExtents = shapeInfo.getHalfExtents(); // x = radius, y = cylinderHalfHeight + radius radius = halfExtents.x; + glm::vec3 halfCylinderAxis(0.0f, halfExtents.y - radius, 0.0f); + Transform transform = getTransform(); + start = transform.getTranslation() + transform.getRotation() * (shapeInfo.getOffset() - halfCylinderAxis); + end = transform.getTranslation() + transform.getRotation() * (shapeInfo.getOffset() + halfCylinderAxis); } glm::vec3 Avatar::getWorldFeetPosition() { ShapeInfo shapeInfo; - computeShapeInfo(shapeInfo); - glm::vec3 halfExtents = shapeInfo.getHalfExtents(); // x = radius, y = halfHeight - glm::vec3 localFeet(0.0f, shapeInfo.getOffset().y - halfExtents.y - halfExtents.x, 0.0f); - return getWorldOrientation() * localFeet + getWorldPosition(); + glm::vec3 halfExtents = shapeInfo.getHalfExtents(); // x = radius, y = cylinderHalfHeight + radius + glm::vec3 localFeet(0.0f, shapeInfo.getOffset().y - halfExtents.y, 0.0f); + Transform transform = getTransform(); + return transform.getTranslation() + transform.getRotation() * localFeet; } float Avatar::computeMass() { diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 48593de212..36c6ed6c50 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -341,10 +341,10 @@ const glm::vec3 START_LOCATION(6270, 211, 6000); // Avatar Transit Constants const float AVATAR_TRANSIT_MIN_TRIGGER_DISTANCE = 1.0f; const float AVATAR_TRANSIT_MAX_TRIGGER_DISTANCE = 30.0f; -const int AVATAR_TRANSIT_FRAME_COUNT = 11; +const int AVATAR_TRANSIT_FRAME_COUNT = 5; const float AVATAR_TRANSIT_FRAMES_PER_METER = 0.5f; const float AVATAR_TRANSIT_ABORT_DISTANCE = 0.1f; -const bool AVATAR_TRANSIT_DISTANCE_BASED = true; +const bool AVATAR_TRANSIT_DISTANCE_BASED = false; const float AVATAR_TRANSIT_FRAMES_PER_SECOND = 30.0f; const float AVATAR_PRE_TRANSIT_FRAME_COUNT = 10.0f; const float AVATAR_POST_TRANSIT_FRAME_COUNT = 27.0f; diff --git a/libraries/baking/CMakeLists.txt b/libraries/baking/CMakeLists.txt index ec7caf574b..9041c3a4f1 100644 --- a/libraries/baking/CMakeLists.txt +++ b/libraries/baking/CMakeLists.txt @@ -4,7 +4,4 @@ setup_hifi_library(Concurrent) link_hifi_libraries(shared graphics networking ktx image fbx) include_hifi_library_headers(gpu) -add_dependency_external_projects(draco) -find_package(Draco REQUIRED) -target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${DRACO_INCLUDE_DIRS}) -target_link_libraries(${TARGET_NAME} ${DRACO_LIBRARY} ${DRACO_ENCODER_LIBRARY}) +target_draco() diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index f60bf20e3d..9a68f81b66 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -510,7 +510,6 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& shapeInfo) { // we backtranslate by the registration offset so we can apply that offset to the shapeInfo later localTransforms.push_back(invRegistraionOffset * jointMatrix * cluster.inverseBindMatrix); } else { - glm::mat4 identity; localTransforms.push_back(invRegistraionOffset); } totalNumVertices += mesh.vertices.size(); diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index c3baa80f33..476372160e 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -108,10 +108,6 @@ bool WebEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointe return true; } - if (_lastLocked != entity->getLocked()) { - return true; - } - return false; } @@ -203,7 +199,6 @@ void WebEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& scene } _lastDPI = entity->getDPI(); - _lastLocked = entity->getLocked(); glm::vec2 windowSize = getWindowSize(entity); _webSurface->resize(QSize(windowSize.x, windowSize.y)); @@ -362,7 +357,7 @@ glm::vec2 WebEntityRenderer::getWindowSize(const TypedEntityPointer& entity) con } void WebEntityRenderer::hoverEnterEntity(const PointerEvent& event) { - if (!_lastLocked && _webSurface) { + if (_webSurface) { PointerEvent webEvent = event; webEvent.setPos2D(event.getPos2D() * (METERS_TO_INCHES * _lastDPI)); _webSurface->hoverBeginEvent(webEvent, _touchDevice); @@ -370,7 +365,7 @@ void WebEntityRenderer::hoverEnterEntity(const PointerEvent& event) { } void WebEntityRenderer::hoverLeaveEntity(const PointerEvent& event) { - if (!_lastLocked && _webSurface) { + if (_webSurface) { PointerEvent webEvent = event; webEvent.setPos2D(event.getPos2D() * (METERS_TO_INCHES * _lastDPI)); _webSurface->hoverEndEvent(webEvent, _touchDevice); @@ -378,8 +373,7 @@ void WebEntityRenderer::hoverLeaveEntity(const PointerEvent& event) { } void WebEntityRenderer::handlePointerEvent(const PointerEvent& event) { - // Ignore mouse interaction if we're locked - if (!_lastLocked && _webSurface) { + if (_webSurface) { PointerEvent webEvent = event; webEvent.setPos2D(event.getPos2D() * (METERS_TO_INCHES * _lastDPI)); _webSurface->handlePointerEvent(webEvent, _touchDevice); diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.h b/libraries/entities-renderer/src/RenderableWebEntityItem.h index 1ba8ed0ec7..12640f697d 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.h +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.h @@ -65,7 +65,6 @@ private: gpu::TexturePointer _texture; QString _lastSourceUrl; uint16_t _lastDPI; - bool _lastLocked; QTimer _timer; uint64_t _lastRenderTime { 0 }; }; diff --git a/libraries/fbx/src/FBXReader_Mesh.cpp b/libraries/fbx/src/FBXReader_Mesh.cpp index e098aff99a..5b1c708378 100644 --- a/libraries/fbx/src/FBXReader_Mesh.cpp +++ b/libraries/fbx/src/FBXReader_Mesh.cpp @@ -397,7 +397,7 @@ ExtractedMesh FBXReader::extractMesh(const FBXNode& object, unsigned int& meshIn } // enumerate the vertices and construct the extracted mesh - for (int i = 0; i < numVertices; ++i) { + for (uint32_t i = 0; i < numVertices; ++i) { draco::PointIndex vertexIndex(i); if (positionAttribute) { @@ -453,7 +453,7 @@ ExtractedMesh FBXReader::extractMesh(const FBXNode& object, unsigned int& meshIn } } - for (int i = 0; i < dracoMesh->num_faces(); ++i) { + for (uint32_t i = 0; i < dracoMesh->num_faces(); ++i) { // grab the material ID and texture ID for this face, if we have it auto& dracoFace = dracoMesh->face(draco::FaceIndex(i)); auto& firstCorner = dracoFace[0]; diff --git a/libraries/gl/src/gl/Context.h b/libraries/gl/src/gl/Context.h index 05cb361725..1040868c78 100644 --- a/libraries/gl/src/gl/Context.h +++ b/libraries/gl/src/gl/Context.h @@ -56,6 +56,7 @@ namespace gl { void release(); virtual ~Context(); + QWindow* getWindow() const { return _window; } void clear(); void setWindow(QWindow* window); bool makeCurrent(); @@ -80,8 +81,6 @@ namespace gl { class OffscreenContext : public Context { using Parent = Context; - protected: - QWindow* _window { nullptr }; public: virtual ~OffscreenContext(); void create(QOpenGLContext* shareContext = nullptr) override; diff --git a/libraries/gpu-gl/src/gpu/gl41/GL41BackendShader.cpp b/libraries/gpu-gl/src/gpu/gl41/GL41BackendShader.cpp index f162afc497..f33dd91d03 100644 --- a/libraries/gpu-gl/src/gpu/gl41/GL41BackendShader.cpp +++ b/libraries/gpu-gl/src/gpu/gl41/GL41BackendShader.cpp @@ -49,7 +49,7 @@ void GL41Backend::postLinkProgram(ShaderObject& programObject, const Shader& pro const auto resourceBufferUniforms = ::gl::Uniform::loadByName(glprogram, names); for (const auto& resourceBuffer : resourceBufferUniforms) { const auto& targetBinding = expectedResourceBuffers.at(resourceBuffer.name); - glProgramUniform1i(glprogram, resourceBuffer.binding, targetBinding + GL41Backend::RESOURCE_BUFFER_SLOT0_TEX_UNIT); + glProgramUniform1i(glprogram, resourceBuffer.binding, targetBinding); } } diff --git a/libraries/gpu-gles/src/gpu/gles/GLESBackend.h b/libraries/gpu-gles/src/gpu/gles/GLESBackend.h index 8ecdb2494b..aaa1be5892 100644 --- a/libraries/gpu-gles/src/gpu/gles/GLESBackend.h +++ b/libraries/gpu-gles/src/gpu/gles/GLESBackend.h @@ -28,6 +28,10 @@ class GLESBackend : public GLBackend { public: static const GLint RESOURCE_TRANSFER_TEX_UNIT { 32 }; + static const GLint RESOURCE_TRANSFER_EXTRA_TEX_UNIT { 33 }; + static const GLint RESOURCE_BUFFER_TEXBUF_TEX_UNIT { 34 }; + static const GLint RESOURCE_BUFFER_SLOT0_TEX_UNIT { 35 }; + explicit GLESBackend(bool syncCache) : Parent(syncCache) {} GLESBackend() : Parent() {} virtual ~GLESBackend() { diff --git a/libraries/gpu-gles/src/gpu/gles/GLESBackendBuffer.cpp b/libraries/gpu-gles/src/gpu/gles/GLESBackendBuffer.cpp index 5e4da4d1fe..8cadb1a43f 100644 --- a/libraries/gpu-gles/src/gpu/gles/GLESBackendBuffer.cpp +++ b/libraries/gpu-gles/src/gpu/gles/GLESBackendBuffer.cpp @@ -10,7 +10,6 @@ namespace gpu { namespace gles { - class GLESBuffer : public gpu::gl::GLBuffer { using Parent = gpu::gl::GLBuffer; static GLuint allocate() { @@ -19,11 +18,20 @@ namespace gpu { return result; } + ~GLESBuffer() { + if (_texBuffer) { + auto backend = _backend.lock(); + if (backend) { + backend->releaseTexture(_texBuffer, 0); + } + } + } + public: GLESBuffer(const std::weak_ptr& backend, const Buffer& buffer, GLESBuffer* original) : Parent(backend, buffer, allocate()) { - glBindBuffer(GL_ARRAY_BUFFER, _buffer); - glBufferData(GL_ARRAY_BUFFER, _size, nullptr, GL_DYNAMIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_COPY_WRITE_BUFFER, _buffer); + glBufferData(GL_COPY_WRITE_BUFFER, _size, nullptr, GL_DYNAMIC_DRAW); + glBindBuffer(GL_COPY_WRITE_BUFFER, 0); if (original && original->_size) { glBindBuffer(GL_COPY_WRITE_BUFFER, _buffer); @@ -37,20 +45,34 @@ namespace gpu { } void transfer() override { - glBindBuffer(GL_ARRAY_BUFFER, _buffer); + glBindBuffer(GL_COPY_WRITE_BUFFER, _buffer); (void)CHECK_GL_ERROR(); Size offset; Size size; Size currentPage { 0 }; auto data = _gpuObject._renderSysmem.readData(); while (_gpuObject._renderPages.getNextTransferBlock(offset, size, currentPage)) { - glBufferSubData(GL_ARRAY_BUFFER, offset, size, data + offset); + glBufferSubData(GL_COPY_WRITE_BUFFER, offset, size, data + offset); (void)CHECK_GL_ERROR(); } - glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_COPY_WRITE_BUFFER, 0); (void)CHECK_GL_ERROR(); _gpuObject._renderPages._flags &= ~PageManager::DIRTY; } + + // REsource BUffer are implemented with TextureBuffer + GLuint _texBuffer { 0 }; + GLuint getTexBufferId() { + if (!_texBuffer) { + glGenTextures(1, &_texBuffer); + glActiveTexture(GL_TEXTURE0 + GLESBackend::RESOURCE_BUFFER_TEXBUF_TEX_UNIT); + glBindTexture(GL_TEXTURE_BUFFER, _texBuffer); + glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, _buffer); + glBindTexture(GL_TEXTURE_BUFFER, 0); + (void)CHECK_GL_ERROR(); + } + return _texBuffer; + } }; } } @@ -68,14 +90,24 @@ GLuint GLESBackend::getBufferIDUnsynced(const Buffer& buffer) { return GLESBuffer::getIdUnsynced(*this, buffer); } +GLuint GLESBackend::getResourceBufferID(const Buffer& buffer) { + auto* object = GLESBuffer::sync(*this, buffer); + if (object) { + return object->getTexBufferId(); + } else { + return 0; + } +} + GLBuffer* GLESBackend::syncGPUObject(const Buffer& buffer) { return GLESBuffer::sync(*this, buffer); } bool GLESBackend::bindResourceBuffer(uint32_t slot, const BufferPointer& buffer) { - GLBuffer* object = syncGPUObject((*buffer)); - if (object) { - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, slot, object->_id); + GLuint texBuffer = GLESBackend::getResourceBufferID((*buffer)); + if (texBuffer) { + glActiveTexture(GL_TEXTURE0 + GLESBackend::RESOURCE_BUFFER_SLOT0_TEX_UNIT + slot); + glBindTexture(GL_TEXTURE_BUFFER, texBuffer); (void)CHECK_GL_ERROR(); @@ -89,9 +121,10 @@ bool GLESBackend::bindResourceBuffer(uint32_t slot, const BufferPointer& buffer) void GLESBackend::releaseResourceBuffer(uint32_t slot) { auto& bufferReference = _resource._buffers[slot]; - if (valid(bufferReference)) { - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, slot, 0); + auto buffer = acquire(bufferReference); + if (buffer) { + glActiveTexture(GL_TEXTURE0 + GLESBackend::RESOURCE_BUFFER_SLOT0_TEX_UNIT + slot); + glBindTexture(GL_TEXTURE_BUFFER, 0); reset(bufferReference); } } - diff --git a/libraries/gpu/src/gpu/ShaderConstants.h b/libraries/gpu/src/gpu/ShaderConstants.h index e9a1821ef4..1a37c69784 100644 --- a/libraries/gpu/src/gpu/ShaderConstants.h +++ b/libraries/gpu/src/gpu/ShaderConstants.h @@ -21,6 +21,12 @@ #define GPU_TEXTURE_TRANSFORM_OBJECT 31 + +#define GPU_RESOURCE_BUFFER_SLOT0_TEXTURE 35 +#define GPU_RESOURCE_BUFFER_SLOT1_TEXTURE 36 +#define GPU_RESOURCE_BUFFER_SLOT0_STORAGE 0 +#define GPU_RESOURCE_BUFFER_SLOT1_STORAGE 1 + // Mip creation #define GPU_TEXTURE_MIP_CREATION_INPUT 30 diff --git a/libraries/graphics/src/graphics/BufferViewHelpers.h b/libraries/graphics/src/graphics/BufferViewHelpers.h index 026e7b53a3..8a48c17007 100644 --- a/libraries/graphics/src/graphics/BufferViewHelpers.h +++ b/libraries/graphics/src/graphics/BufferViewHelpers.h @@ -10,7 +10,6 @@ #include #include #include -#include #include "GpuHelpers.h" #include "GLMHelpers.h" diff --git a/libraries/image/src/image/Image.cpp b/libraries/image/src/image/Image.cpp index 1355a24bf4..f450366417 100644 --- a/libraries/image/src/image/Image.cpp +++ b/libraries/image/src/image/Image.cpp @@ -32,8 +32,8 @@ using namespace gpu; #include #undef _CRT_SECURE_NO_WARNINGS -#include -#include +#include +#include static const glm::uvec2 SPARSE_PAGE_SIZE(128); static const glm::uvec2 MAX_TEXTURE_SIZE_GLES(2048); diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 9eed463d2d..18e439aa77 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -40,7 +40,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketType::AvatarData: case PacketType::BulkAvatarData: case PacketType::KillAvatar: - return static_cast(AvatarMixerPacketVersion::FarGrabJointsRedux); + return static_cast(AvatarMixerPacketVersion::JointTransScaled); case PacketType::MessagesData: return static_cast(MessageDataVersion::TextOrBinaryData); // ICE packets diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 37a4b32940..f3bc115410 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -126,14 +126,13 @@ public: EntityScriptCallMethod, ChallengeOwnershipRequest, ChallengeOwnershipReply, - OctreeDataFileRequest, OctreeDataFileReply, OctreeDataPersist, - EntityClone, EntityQueryInitialResultsComplete, BulkAvatarTraits, + AudioSoloRequest, NUM_PACKET_TYPE }; @@ -297,7 +296,8 @@ enum class AvatarMixerPacketVersion : PacketVersion { FarGrabJoints, MigrateSkeletonURLToTraits, MigrateAvatarEntitiesToTraits, - FarGrabJointsRedux + FarGrabJointsRedux, + JointTransScaled }; enum class DomainConnectRequestVersion : PacketVersion { diff --git a/libraries/networking/src/udt/SequenceNumber.h b/libraries/networking/src/udt/SequenceNumber.h index 2c82eccfa3..13bd83d4f2 100644 --- a/libraries/networking/src/udt/SequenceNumber.h +++ b/libraries/networking/src/udt/SequenceNumber.h @@ -14,7 +14,7 @@ #include -#include +#include namespace udt { diff --git a/libraries/physics/src/ShapeFactory.cpp b/libraries/physics/src/ShapeFactory.cpp index 8057eb0e0c..d7ba2f0661 100644 --- a/libraries/physics/src/ShapeFactory.cpp +++ b/libraries/physics/src/ShapeFactory.cpp @@ -307,21 +307,21 @@ const btCollisionShape* ShapeFactory::createShapeFromInfo(const ShapeInfo& info) case SHAPE_TYPE_CAPSULE_Y: { glm::vec3 halfExtents = info.getHalfExtents(); float radius = halfExtents.x; - float height = 2.0f * halfExtents.y; + float height = 2.0f * (halfExtents.y - radius); shape = new btCapsuleShape(radius, height); } break; case SHAPE_TYPE_CAPSULE_X: { glm::vec3 halfExtents = info.getHalfExtents(); float radius = halfExtents.y; - float height = 2.0f * halfExtents.x; + float height = 2.0f * (halfExtents.x - radius); shape = new btCapsuleShapeX(radius, height); } break; case SHAPE_TYPE_CAPSULE_Z: { glm::vec3 halfExtents = info.getHalfExtents(); float radius = halfExtents.x; - float height = 2.0f * halfExtents.z; + float height = 2.0f * (halfExtents.z - radius); shape = new btCapsuleShapeZ(radius, height); } break; diff --git a/libraries/render-utils/src/AnimDebugDraw.cpp b/libraries/render-utils/src/AnimDebugDraw.cpp index 74afded28f..bf528ee5f0 100644 --- a/libraries/render-utils/src/AnimDebugDraw.cpp +++ b/libraries/render-utils/src/AnimDebugDraw.cpp @@ -149,11 +149,11 @@ void AnimDebugDraw::shutdown() { } void AnimDebugDraw::addAbsolutePoses(const std::string& key, AnimSkeleton::ConstPointer skeleton, const AnimPoseVec& poses, const AnimPose& rootPose, const glm::vec4& color) { - _absolutePoses[key] = PosesInfo(skeleton, poses, rootPose, color); + _posesInfoMap[key] = PosesInfo(skeleton, poses, rootPose, color); } void AnimDebugDraw::removeAbsolutePoses(const std::string& key) { - _absolutePoses.erase(key); + _posesInfoMap.erase(key); } static const uint32_t red = toRGBA(255, 0, 0, 255); @@ -320,7 +320,12 @@ void AnimDebugDraw::update() { return; } render::Transaction transaction; - transaction.updateItem(_itemID, [&](AnimDebugDrawData& data) { + + // Make a copy of the _posesInfoMap member variable, and pass the copy into the lambda. + // This allows the body of the lambda, which executes on the render thread, to safely iterate over the map. + std::shared_ptr posesInfoMapCopy; + posesInfoMapCopy = std::make_shared(_posesInfoMap); + transaction.updateItem(_itemID, [posesInfoMapCopy](AnimDebugDrawData& data) { const size_t VERTICES_PER_BONE = (6 + (NUM_CIRCLE_SLICES * 2) * 3); const size_t VERTICES_PER_LINK = 8 * 2; @@ -332,7 +337,7 @@ void AnimDebugDraw::update() { // figure out how many verts we will need. int numVerts = 0; - for (auto& iter : _absolutePoses) { + for (auto& iter : *posesInfoMapCopy) { AnimSkeleton::ConstPointer& skeleton = std::get<0>(iter.second); numVerts += skeleton->getNumJoints() * VERTICES_PER_BONE; for (auto i = 0; i < skeleton->getNumJoints(); i++) { @@ -362,7 +367,7 @@ void AnimDebugDraw::update() { } // draw absolute poses - for (auto& iter : _absolutePoses) { + for (auto& iter : *posesInfoMapCopy) { AnimSkeleton::ConstPointer& skeleton = std::get<0>(iter.second); AnimPoseVec& absPoses = std::get<1>(iter.second); AnimPose rootPose = std::get<2>(iter.second); @@ -421,7 +426,7 @@ void AnimDebugDraw::update() { data._indexBuffer->resize(sizeof(uint32_t) * numVerts); for (int i = 0; i < numVerts; i++) { - data._indexBuffer->setSubData(i, (uint32_t)i);; + data._indexBuffer->setSubData(i, (uint32_t)i); } }); scene->enqueueTransaction(transaction); diff --git a/libraries/render-utils/src/AnimDebugDraw.h b/libraries/render-utils/src/AnimDebugDraw.h index 03101c9f86..2333b749fe 100644 --- a/libraries/render-utils/src/AnimDebugDraw.h +++ b/libraries/render-utils/src/AnimDebugDraw.h @@ -44,7 +44,8 @@ protected: typedef std::tuple PosesInfo; - std::unordered_map _absolutePoses; + typedef std::unordered_map PosesInfoMap; + PosesInfoMap _posesInfoMap; // no copies AnimDebugDraw(const AnimDebugDraw&) = delete; diff --git a/libraries/render-utils/src/Blendshape.slh b/libraries/render-utils/src/Blendshape.slh index 73a561c73f..f2c6bfe794 100644 --- a/libraries/render-utils/src/Blendshape.slh +++ b/libraries/render-utils/src/Blendshape.slh @@ -11,12 +11,12 @@ <@func declareBlendshape(USE_NORMAL, USE_TANGENT)@> #if !defined(GPU_SSBO_TRANSFORM_OBJECT) -LAYOUT(binding=0) uniform samplerBuffer blendshapeOffsetsBuffer; +LAYOUT(binding=GPU_RESOURCE_BUFFER_SLOT0_TEXTURE) uniform samplerBuffer blendshapeOffsetsBuffer; uvec4 getPackedBlendshapeOffset(int i) { return floatBitsToUint(texelFetch(blendshapeOffsetsBuffer, i)); } #else -LAYOUT_STD140(binding=0) buffer blendshapeOffsetsBuffer { +LAYOUT_STD140(binding=GPU_RESOURCE_BUFFER_SLOT0_STORAGE) buffer blendshapeOffsetsBuffer { uvec4 _packedBlendshapeOffsets[]; }; uvec4 getPackedBlendshapeOffset(int i) { diff --git a/libraries/render-utils/src/Highlight_aabox.slv b/libraries/render-utils/src/Highlight_aabox.slv index 17ef7b6e07..65b98355ae 100644 --- a/libraries/render-utils/src/Highlight_aabox.slv +++ b/libraries/render-utils/src/Highlight_aabox.slv @@ -23,7 +23,7 @@ struct ItemBound { }; #if !defined(GPU_SSBO_TRANSFORM_OBJECT) -LAYOUT(binding=0) uniform samplerBuffer ssbo0Buffer; +LAYOUT(binding=GPU_RESOURCE_BUFFER_SLOT0_TEXTURE) uniform samplerBuffer ssbo0Buffer; ItemBound getItemBound(int i) { int offset = 2 * i; ItemBound bound; @@ -32,7 +32,7 @@ ItemBound getItemBound(int i) { return bound; } #else -LAYOUT_STD140(binding=0) buffer ssbo0Buffer { +LAYOUT_STD140(binding=GPU_RESOURCE_BUFFER_SLOT0_STORAGE) buffer ssbo0Buffer { ItemBound bounds[]; }; ItemBound getItemBound(int i) { diff --git a/libraries/render-utils/src/LightStage.cpp b/libraries/render-utils/src/LightStage.cpp index ccedb0cd7b..8fe3b0fef5 100644 --- a/libraries/render-utils/src/LightStage.cpp +++ b/libraries/render-utils/src/LightStage.cpp @@ -60,7 +60,8 @@ LightStage::LightStage() { } LightStage::Shadow::Schema::Schema() { - ShadowTransform defaultTransform; + ShadowTransform defaultTransform = {}; + defaultTransform.reprojection = mat4(); defaultTransform.fixedBias = 0.005f; std::fill(cascades, cascades + SHADOW_CASCADE_MAX_COUNT, defaultTransform); invMapSize = 1.0f / MAP_SIZE; diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index b493780aff..ca2e56862d 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -239,7 +239,7 @@ ModelMeshPartPayload::ModelMeshPartPayload(ModelPointer model, int meshIndex, in initCache(model); -#ifdef Q_OS_MAC +#if defined(Q_OS_MAC) || defined(Q_OS_ANDROID) // On mac AMD, we specifically need to have a _meshBlendshapeBuffer bound when using a deformed mesh pipeline // it cannot be null otherwise we crash in the drawcall using a deformed pipeline with a skinned only (not blendshaped) mesh if (_isBlendShaped) { diff --git a/libraries/render-utils/src/WorkloadResource.slh b/libraries/render-utils/src/WorkloadResource.slh index ed23abd5ae..14fa33a12e 100644 --- a/libraries/render-utils/src/WorkloadResource.slh +++ b/libraries/render-utils/src/WorkloadResource.slh @@ -26,7 +26,7 @@ struct WorkloadProxy { }; #if !defined(GPU_SSBO_TRANSFORM_OBJECT) -LAYOUT(binding=0) uniform samplerBuffer workloadProxiesBuffer; +LAYOUT(binding=GPU_RESOURCE_BUFFER_SLOT0_TEXTURE) uniform samplerBuffer workloadProxiesBuffer; WorkloadProxy getWorkloadProxy(int i) { int offset = 2 * i; WorkloadProxy proxy; @@ -35,7 +35,7 @@ WorkloadProxy getWorkloadProxy(int i) { return proxy; } #else -LAYOUT_STD140(binding=0) buffer workloadProxiesBuffer { +LAYOUT_STD140(binding=GPU_RESOURCE_BUFFER_SLOT0_STORAGE) buffer workloadProxiesBuffer { WorkloadProxy _proxies[]; }; WorkloadProxy getWorkloadProxy(int i) { @@ -58,7 +58,7 @@ struct WorkloadView { }; #if !defined(GPU_SSBO_TRANSFORM_OBJECT) -LAYOUT(binding=1) uniform samplerBuffer workloadViewsBuffer; +LAYOUT(binding=GPU_RESOURCE_BUFFER_SLOT1_TEXTURE) uniform samplerBuffer workloadViewsBuffer; WorkloadView getWorkloadView(int i) { int offset = 8 * i; WorkloadView view; @@ -73,7 +73,7 @@ WorkloadView getWorkloadView(int i) { return view; } #else -LAYOUT_STD140(binding=1) buffer workloadViewsBuffer { +LAYOUT_STD140(binding=GPU_RESOURCE_BUFFER_SLOT1_STORAGE) buffer workloadViewsBuffer { WorkloadView _views[]; }; WorkloadView getWorkloadView(int i) { diff --git a/libraries/render/src/render/drawItemBounds.slv b/libraries/render/src/render/drawItemBounds.slv index 0a9615c9c2..bb8e6a2886 100644 --- a/libraries/render/src/render/drawItemBounds.slv +++ b/libraries/render/src/render/drawItemBounds.slv @@ -35,7 +35,7 @@ struct ItemBound { }; #if !defined(GPU_SSBO_TRANSFORM_OBJECT) -LAYOUT(binding=0) uniform samplerBuffer ssbo0Buffer; +LAYOUT(binding=GPU_RESOURCE_BUFFER_SLOT0_TEXTURE) uniform samplerBuffer ssbo0Buffer; ItemBound getItemBound(int i) { int offset = 2 * i; ItemBound bound; @@ -44,7 +44,7 @@ ItemBound getItemBound(int i) { return bound; } #else -LAYOUT_STD140(binding=0) buffer ssbo0Buffer { +LAYOUT_STD140(binding=GPU_RESOURCE_BUFFER_SLOT0_STORAGE) buffer ssbo0Buffer { ItemBound bounds[]; }; ItemBound getItemBound(int i) { diff --git a/libraries/script-engine/src/AudioScriptingInterface.h b/libraries/script-engine/src/AudioScriptingInterface.h index 1220a9b769..2854445b4f 100644 --- a/libraries/script-engine/src/AudioScriptingInterface.h +++ b/libraries/script-engine/src/AudioScriptingInterface.h @@ -25,13 +25,49 @@ class AudioScriptingInterface : public QObject, public Dependency { // JSDoc for property is in Audio.h. Q_PROPERTY(bool isStereoInput READ isStereoInput WRITE setStereoInput NOTIFY isStereoInputChanged) + Q_PROPERTY(bool isSoloing READ isSoloing) + Q_PROPERTY(QVector soloList READ getSoloList) public: - virtual ~AudioScriptingInterface() {} + virtual ~AudioScriptingInterface() = default; void setLocalAudioInterface(AbstractAudioInterface* audioInterface); + bool isSoloing() const { + return _localAudioInterface->getAudioSolo().isSoloing(); + } + + QVector getSoloList() const { + return _localAudioInterface->getAudioSolo().getUUIDs(); + } + + /**jsdoc + * Add nodes to the audio solo list + * @function Audio.addToSoloList + * @param {Uuid[]} uuidList - List of node UUIDs to add to the solo list. + */ + Q_INVOKABLE void addToSoloList(QVector uuidList) { + _localAudioInterface->getAudioSolo().addUUIDs(uuidList); + } + + /**jsdoc + * Remove nodes from the audio solo list + * @function Audio.removeFromSoloList + * @param {Uuid[]} uuidList - List of node UUIDs to remove from the solo list. + */ + Q_INVOKABLE void removeFromSoloList(QVector uuidList) { + _localAudioInterface->getAudioSolo().removeUUIDs(uuidList); + } + + /**jsdoc + * Reset the list of soloed nodes. + * @function Audio.resetSoloList + */ + Q_INVOKABLE void resetSoloList() { + _localAudioInterface->getAudioSolo().reset(); + } + protected: - AudioScriptingInterface() {} + AudioScriptingInterface() = default; // these methods are protected to stop C++ callers from calling, but invokable from script diff --git a/libraries/shaders/src/shaders/Shaders.cpp b/libraries/shaders/src/shaders/Shaders.cpp index 549bf65f80..c7e39b2940 100644 --- a/libraries/shaders/src/shaders/Shaders.cpp +++ b/libraries/shaders/src/shaders/Shaders.cpp @@ -16,7 +16,7 @@ #include #include -#include +#include #include #include diff --git a/libraries/shared/src/GLMHelpers.cpp b/libraries/shared/src/GLMHelpers.cpp index 1a62227c31..905bf3ccfd 100644 --- a/libraries/shared/src/GLMHelpers.cpp +++ b/libraries/shared/src/GLMHelpers.cpp @@ -9,6 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include #include "GLMHelpers.h" #include #include "NumericalConstants.h" @@ -43,8 +44,8 @@ const mat4 Matrices::X_180 { createMatFromQuatAndPos(Quaternions::X_180, Vectors const mat4 Matrices::Y_180 { createMatFromQuatAndPos(Quaternions::Y_180, Vectors::ZERO) }; const mat4 Matrices::Z_180 { createMatFromQuatAndPos(Quaternions::Z_180, Vectors::ZERO) }; -// Safe version of glm::mix; based on the code in Nick Bobick's article, -// http://www.gamasutra.com/features/19980703/quaternions_01.htm (via Clyde, +// Safe version of glm::mix; based on the code in Nick Bobic's article, +// https://www.gamasutra.com/view/feature/131686/rotating_objects_using_quaternions.php?page=1 (via Clyde, // https://github.com/threerings/clyde/blob/master/src/main/java/com/threerings/math/Quaternion.java) glm::quat safeMix(const glm::quat& q1, const glm::quat& q2, float proportion) { float cosa = q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w; @@ -76,9 +77,11 @@ glm::quat safeMix(const glm::quat& q1, const glm::quat& q2, float proportion) { // Allows sending of fixed-point numbers: radix 1 makes 15.1 number, radix 8 makes 8.8 number, etc int packFloatScalarToSignedTwoByteFixed(unsigned char* buffer, float scalar, int radix) { - int16_t twoByteFixed = (int16_t)(scalar * (float)(1 << radix)); - memcpy(buffer, &twoByteFixed, sizeof(int16_t)); - return sizeof(int16_t); + using FixedType = int16_t; + FixedType twoByteFixed = (FixedType) glm::clamp(scalar * (1 << radix), (float)std::numeric_limits::min(), + (float)std::numeric_limits::max()); + memcpy(buffer, &twoByteFixed, sizeof(FixedType)); + return sizeof(FixedType); } int unpackFloatScalarFromSignedTwoByteFixed(const int16_t* byteFixedPointer, float* destinationPointer, int radix) { diff --git a/libraries/shared/src/ShapeInfo.cpp b/libraries/shared/src/ShapeInfo.cpp index 152e305bf2..df8e61114d 100644 --- a/libraries/shared/src/ShapeInfo.cpp +++ b/libraries/shared/src/ShapeInfo.cpp @@ -148,12 +148,12 @@ void ShapeInfo::setPointCollection(const ShapeInfo::PointCollection& pointCollec _hashKey.clear(); } -void ShapeInfo::setCapsuleY(float radius, float halfHeight) { +void ShapeInfo::setCapsuleY(float radius, float cylinderHalfHeight) { _url = ""; _type = SHAPE_TYPE_CAPSULE_Y; radius = glm::max(radius, MIN_HALF_EXTENT); - halfHeight = glm::max(halfHeight, 0.0f); - _halfExtents = glm::vec3(radius, halfHeight, radius); + cylinderHalfHeight = glm::max(cylinderHalfHeight, 0.0f); + _halfExtents = glm::vec3(radius, cylinderHalfHeight + radius, radius); _hashKey.clear(); } @@ -261,27 +261,27 @@ bool ShapeInfo::contains(const glm::vec3& point) const { case SHAPE_TYPE_CYLINDER_Z: return glm::length(glm::vec2(point.x, point.y)) <= _halfExtents.y; case SHAPE_TYPE_CAPSULE_X: { - if (glm::abs(point.x) <= _halfExtents.x) { - return glm::length(glm::vec2(point.y, point.z)) <= _halfExtents.z; + if (glm::abs(point.x) <= _halfExtents.x - _halfExtents.y) { + return glm::length(glm::vec2(point.y, point.z)) <= _halfExtents.y; } else { - glm::vec3 absPoint = glm::abs(point) - _halfExtents.x; - return glm::length(absPoint) <= _halfExtents.z; + glm::vec3 absPoint = glm::abs(point) - glm::vec3(_halfExtents.x, 0.0f, 0.0f); + return glm::length(absPoint) <= _halfExtents.y; } } case SHAPE_TYPE_CAPSULE_Y: { - if (glm::abs(point.y) <= _halfExtents.y) { - return glm::length(glm::vec2(point.x, point.z)) <= _halfExtents.x; + if (glm::abs(point.y) <= _halfExtents.y - _halfExtents.z) { + return glm::length(glm::vec2(point.x, point.z)) <= _halfExtents.z; } else { - glm::vec3 absPoint = glm::abs(point) - _halfExtents.y; - return glm::length(absPoint) <= _halfExtents.x; + glm::vec3 absPoint = glm::abs(point) - glm::vec3(0.0f, _halfExtents.y, 0.0f); + return glm::length(absPoint) <= _halfExtents.z; } } case SHAPE_TYPE_CAPSULE_Z: { - if (glm::abs(point.z) <= _halfExtents.z) { - return glm::length(glm::vec2(point.x, point.y)) <= _halfExtents.y; + if (glm::abs(point.z) <= _halfExtents.z - _halfExtents.x) { + return glm::length(glm::vec2(point.x, point.y)) <= _halfExtents.x; } else { - glm::vec3 absPoint = glm::abs(point) - _halfExtents.z; - return glm::length(absPoint) <= _halfExtents.y; + glm::vec3 absPoint = glm::abs(point) - glm::vec3(0.0f, 0.0f, _halfExtents.z); + return glm::length(absPoint) <= _halfExtents.x; } } case SHAPE_TYPE_BOX: diff --git a/libraries/shared/src/ShapeInfo.h b/libraries/shared/src/ShapeInfo.h index 5020e492cf..16e260d9db 100644 --- a/libraries/shared/src/ShapeInfo.h +++ b/libraries/shared/src/ShapeInfo.h @@ -67,7 +67,7 @@ public: void setBox(const glm::vec3& halfExtents); void setSphere(float radius); void setPointCollection(const PointCollection& pointCollection); - void setCapsuleY(float radius, float halfHeight); + void setCapsuleY(float radius, float cylinderHalfHeight); void setOffset(const glm::vec3& offset); ShapeType getType() const { return _type; } diff --git a/plugins/hifiSdl2/src/Joystick.h b/plugins/hifiSdl2/src/Joystick.h index 7ea17739e3..ae90470974 100644 --- a/plugins/hifiSdl2/src/Joystick.h +++ b/plugins/hifiSdl2/src/Joystick.h @@ -15,7 +15,7 @@ #include #include -#include +#include #undef main #include diff --git a/plugins/hifiSdl2/src/SDL2Manager.h b/plugins/hifiSdl2/src/SDL2Manager.h index 0daad6fd8b..ac2f446205 100644 --- a/plugins/hifiSdl2/src/SDL2Manager.h +++ b/plugins/hifiSdl2/src/SDL2Manager.h @@ -12,7 +12,7 @@ #ifndef hifi__SDL2Manager_h #define hifi__SDL2Manager_h -#include +#include #include #include diff --git a/plugins/oculus/CMakeLists.txt b/plugins/oculus/CMakeLists.txt index 664f9fe906..abce753b4d 100644 --- a/plugins/oculus/CMakeLists.txt +++ b/plugins/oculus/CMakeLists.txt @@ -8,9 +8,6 @@ if (WIN32 AND (NOT USE_GLES)) - # we're using static GLEW, so define GLEW_STATIC - add_definitions(-DGLEW_STATIC) - # if we were passed an Oculus App ID for entitlement checks, send that along if (DEFINED ENV{OCULUS_APP_ID}) add_definitions(-DOCULUS_APP_ID="$ENV{OCULUS_APP_ID}") diff --git a/plugins/openvr/CMakeLists.txt b/plugins/openvr/CMakeLists.txt index eea08e66d5..7c3671991e 100644 --- a/plugins/openvr/CMakeLists.txt +++ b/plugins/openvr/CMakeLists.txt @@ -7,20 +7,13 @@ # if (WIN32 AND (NOT USE_GLES)) - # we're using static GLEW, so define GLEW_STATIC - add_definitions(-DGLEW_STATIC) set(TARGET_NAME openvr) setup_hifi_plugin(Gui Qml Multimedia) link_hifi_libraries(shared task gl qml networking controllers ui plugins display-plugins ui-plugins input-plugins script-engine audio-client render-utils graphics shaders gpu render model-networking fbx ktx image procedural ${PLATFORM_GL_BACKEND}) - include_hifi_library_headers(octree) - add_dependency_external_projects(OpenVR) - - find_package(OpenVR REQUIRED) - target_include_directories(${TARGET_NAME} PRIVATE ${OPENVR_INCLUDE_DIRS}) - target_link_libraries(${TARGET_NAME} ${OPENVR_LIBRARIES}) + target_openvr() target_link_libraries(${TARGET_NAME} Winmm.lib) endif() diff --git a/prebuild.py b/prebuild.py new file mode 100644 index 0000000000..dacc49a86e --- /dev/null +++ b/prebuild.py @@ -0,0 +1,257 @@ +#!python + +import argparse +import concurrent +import hashlib +import importlib +import json +import os +import platform +import shutil +import ssl +import subprocess +import sys +import tarfile +import tempfile +import time +import urllib.request +import functools + +print = functools.partial(print, flush=True) + +def executeSubprocess(processArgs, folder=None, env=None): + restoreDir = None + if folder != None: + restoreDir = os.getcwd() + os.chdir(folder) + + process = subprocess.Popen( + processArgs, stdout=sys.stdout, stderr=sys.stderr, env=env) + process.wait() + + if (0 != process.returncode): + raise RuntimeError('Call to "{}" failed.\n\narguments:\n{}\n'.format( + processArgs[0], + ' '.join(processArgs[1:]), + )) + + if restoreDir != None: + os.chdir(restoreDir) + + +def hashFile(file): + hasher = hashlib.sha512() + with open(file, "rb") as f: + for chunk in iter(lambda: f.read(4096), b""): + hasher.update(chunk) + return hasher.hexdigest() + + +def hashFolder(folder): + hasher = hashlib.sha256() + for dirName, subdirList, fileList in os.walk(folder): + for fname in fileList: + with open(os.path.join(folder, dirName, fname), "rb") as f: + for chunk in iter(lambda: f.read(4096), b""): + hasher.update(chunk) + return hasher.hexdigest() + + +def downloadAndExtract(url, destPath, hash=None): + tempFileDescriptor, tempFileName = tempfile.mkstemp() + # OSX Python doesn't support SSL, so we need to bypass it. + # However, we still validate the downloaded file's sha512 hash + context = ssl._create_unverified_context() + with urllib.request.urlopen(url, context=context) as response, open(tempFileDescriptor, 'wb') as tempFile: + shutil.copyfileobj(response, tempFile) + + # Verify the hash + if hash and hash != hashFile(tempFileName): + raise RuntimeError("Downloaded file does not match hash") + + # Extract the archive + with tarfile.open(tempFileName, 'r:gz') as tgz: + tgz.extractall(destPath) + os.remove(tempFileName) + + +class VcpkgRepo: + def __init__(self): + global args + scriptPath = os.path.dirname(os.path.realpath(sys.argv[0])) + # our custom ports, relative to the script location + self.sourcePortsPath = os.path.join(scriptPath, 'cmake', 'ports') + # FIXME Revert to ports hash before release + self.id = hashFolder(self.sourcePortsPath)[:8] + + if args.vcpkg_root is not None: + print("override vcpkg path with " + args.vcpkg_root) + self.path = args.vcpkg_root + else: + defaultBasePath = os.path.join(tempfile.gettempdir(), 'hifi', 'vcpkg') + basePath = os.getenv('HIFI_VCPKG_BASE', defaultBasePath) + if (not os.path.isdir(basePath)): + os.makedirs(basePath) + self.path = os.path.join(basePath, self.id) + + self.tagFile = os.path.join(self.path, '.id') + # A format version attached to the tag file... increment when you want to force the build systems to rebuild + # without the contents of the ports changing + self.version = 1 + self.tagContents = "{}_{}".format(self.id, self.version) + + print("prebuild path: " + self.path) + # OS dependent information + system = platform.system() + if 'Windows' == system: + self.exe = os.path.join(self.path, 'vcpkg.exe') + self.vcpkgUrl = 'https://hifi-public.s3.amazonaws.com/dependencies/vcpkg/vcpkg-win32.tar.gz?versionId=YZYkDejDRk7L_hrK_WVFthWvisAhbDzZ' + self.vcpkgHash = '3e0ff829a74956491d57666109b3e6b5ce4ed0735c24093884317102387b2cb1b2cd1ff38af9ed9173501f6e32ffa05cc6fe6d470b77a71ca1ffc3e0aa46ab9e' + self.hostTriplet = 'x64-windows' + elif 'Darwin' == system: + self.exe = os.path.join(self.path, 'vcpkg') + self.vcpkgUrl = 'https://hifi-public.s3.amazonaws.com/dependencies/vcpkg/vcpkg-osx.tar.gz?versionId=_fhqSxjfrtDJBvEsQ8L_ODcdUjlpX9cc' + self.vcpkgHash = '519d666d02ef22b87c793f016ca412e70f92e1d55953c8f9bd4ee40f6d9f78c1df01a6ee293907718f3bbf24075cc35492fb216326dfc50712a95858e9cbcb4d' + self.hostTriplet = 'x64-osx' + else: + self.exe = os.path.join(self.path, 'vcpkg') + self.vcpkgUrl = 'https://hifi-public.s3.amazonaws.com/dependencies/vcpkg/vcpkg-linux.tar.gz?versionId=97Nazh24etEVKWz33XwgLY0bvxEfZgMU' + self.vcpkgHash = '6a1ce47ef6621e699a4627e8821ad32528c82fce62a6939d35b205da2d299aaa405b5f392df4a9e5343dd6a296516e341105fbb2dd8b48864781d129d7fba10d' + self.hostTriplet = 'x64-linux' + + if args.android: + self.triplet = 'arm64-android' + else: + self.triplet = self.hostTriplet + + def outOfDate(self): + global args + # Prevent doing a clean if we've explcitly set a directory for vcpkg + if args.vcpkg_root is not None: + return False + if args.force_build: + return True + print("Looking for tag file {}".format(self.tagFile)) + if not os.path.isfile(self.tagFile): + return True + with open(self.tagFile, 'r') as f: + storedTag = f.read() + print("Found stored tag {}".format(storedTag)) + if storedTag != self.tagContents: + print("Doesn't match computed tag {}".format(self.tagContents)) + return True + return False + + def clean(self): + cleanPath = self.path + print("Cleaning vcpkg installation at {}".format(cleanPath)) + if os.path.isdir(self.path): + print("Removing {}".format(cleanPath)) + shutil.rmtree(cleanPath, ignore_errors=True) + + def bootstrap(self): + global args + if self.outOfDate(): + self.clean() + + # don't download the vcpkg binaries if we're working with an explicit + # vcpkg directory (possibly a git checkout) + if args.vcpkg_root is None: + downloadVcpkg = False + if args.force_bootstrap: + print("Forcing bootstrap") + downloadVcpkg = True + + if not downloadVcpkg and not os.path.isfile(self.exe): + print("Missing executable, boostrapping") + downloadVcpkg = True + + # Make sure we have a vcpkg executable + testFile = os.path.join(self.path, '.vcpkg-root') + if not downloadVcpkg and not os.path.isfile(testFile): + print("Missing {}, bootstrapping".format(testFile)) + downloadVcpkg = True + + if downloadVcpkg: + print("Fetching vcpkg from {} to {}".format(self.vcpkgUrl, self.path)) + downloadAndExtract(self.vcpkgUrl, self.path, self.vcpkgHash) + + print("Replacing port files") + portsPath = os.path.join(self.path, 'ports') + if (os.path.islink(portsPath)): + os.unlink(portsPath) + if (os.path.isdir(portsPath)): + shutil.rmtree(portsPath, ignore_errors=True) + shutil.copytree(self.sourcePortsPath, portsPath) + + def downloadAndroidDependencies(self): + url = "https://hifi-public.s3.amazonaws.com/dependencies/vcpkg/vcpkg-arm64-android.tar.gz" + hash = "832f82a4d090046bdec25d313e20f56ead45b54dd06eee3798c5c8cbdd64cce4067692b1c3f26a89afe6ff9917c10e4b601c118bea06d23f8adbfe5c0ec12bc3" + dest = os.path.join(self.path, 'installed') + downloadAndExtract(url, dest, hash) + + def run(self, commands): + actualCommands = [self.exe, '--vcpkg-root', self.path] + actualCommands.extend(commands) + print("Running command") + print(actualCommands) + executeSubprocess(actualCommands, folder=self.path) + + def buildDependencies(self): + global args + print("Installing host tools") + self.run(['install', '--triplet', self.hostTriplet, 'hifi-host-tools']) + # Special case for android, grab a bunch of binaries + if args.android: + self.downloadAndroidDependencies() + return + + print("Installing build dependencies") + self.run(['install', '--triplet', self.triplet, 'hifi-client-deps']) + # Remove temporary build artifacts + builddir = os.path.join(self.path, 'buildtrees') + if os.path.isdir(builddir): + print("Wiping build trees") + shutil.rmtree(builddir, ignore_errors=True) + + def writeConfig(self): + global args + configFilePath = os.path.join(args.build_root, 'vcpkg.cmake') + print("Writing cmake config to {}".format(configFilePath)) + # Write out the configuration for use by CMake + cmakeScript = os.path.join(self.path, 'scripts/buildsystems/vcpkg.cmake') + installPath = os.path.join(self.path, 'installed', self.triplet) + toolsPath = os.path.join(self.path, 'installed', self.hostTriplet, 'tools') + cmakeTemplate = 'set(CMAKE_TOOLCHAIN_FILE "{}" CACHE FILEPATH "Toolchain file")\n' + cmakeTemplate += 'set(VCPKG_INSTALL_ROOT "{}" CACHE FILEPATH "vcpkg installed packages path")\n' + cmakeTemplate += 'set(VCPKG_TOOLS_DIR "{}" CACHE FILEPATH "vcpkg installed packages path")\n' + cmakeConfig = cmakeTemplate.format(cmakeScript, installPath, toolsPath).replace('\\', '/') + with open(configFilePath, 'w') as f: + f.write(cmakeConfig) + + def writeTag(self): + print("Writing tag {} to {}".format(self.tagContents, self.tagFile)) + with open(self.tagFile, 'w') as f: + f.write(self.tagContents) + +def main(): + vcpkg = VcpkgRepo() + vcpkg.bootstrap() + vcpkg.buildDependencies() + vcpkg.writeConfig() + vcpkg.writeTag() + + + +from argparse import ArgumentParser +parser = ArgumentParser(description='Prepare build dependencies.') +parser.add_argument('--android', action='store_true') +parser.add_argument('--debug', action='store_true') +parser.add_argument('--force-bootstrap', action='store_true') +parser.add_argument('--force-build', action='store_true') +parser.add_argument('--vcpkg-root', type=str, help='The location of the vcpkg distribution') +parser.add_argument('--build-root', required=True, type=str, help='The location of the cmake build') + +args = parser.parse_args() +main() + diff --git a/scripts/system/assets/data/createAppTooltips.json b/scripts/system/assets/data/createAppTooltips.json index 5572779d46..720d4537ee 100644 --- a/scripts/system/assets/data/createAppTooltips.json +++ b/scripts/system/assets/data/createAppTooltips.json @@ -294,12 +294,21 @@ "position": { "tooltip": "The global position of this entity." }, + "localPosition": { + "tooltip": "The local position of this entity." + }, "rotation": { - "tooltip": "The rotation of the entity with respect to world coordinates." + "tooltip": "The global rotation of this entity." + }, + "localRotation": { + "tooltip": "The local rotation of this entity." }, "dimensions": { "tooltip": "The global dimensions of this entity." }, + "localDimensions": { + "tooltip": "The local dimensions of this entity." + }, "scale": { "tooltip": "The global scaling of this entity.", "skipJSProperty": true @@ -398,13 +407,13 @@ "userData": { "tooltip": "Used to store extra data about the entity in JSON format." }, - "velocity": { + "localVelocity": { "tooltip": "The linear velocity vector of the entity. The velocity at which this entity moves forward in space." }, "damping": { "tooltip": "The linear damping to slow down the linear velocity of an entity over time." }, - "angularVelocity": { + "localAngularVelocity": { "tooltip": "The angular velocity of the entity in rad/s with respect to its axes, about its pivot point." }, "angularDamping": { diff --git a/scripts/system/avatarapp.js b/scripts/system/avatarapp.js index 44f10396ca..a55ed74a86 100644 --- a/scripts/system/avatarapp.js +++ b/scripts/system/avatarapp.js @@ -28,9 +28,8 @@ function executeLater(callback) { Script.setTimeout(callback, 300); } -var INVALID_JOINT_INDEX = -1 function isWearable(avatarEntity) { - return avatarEntity.properties.visible === true && (avatarEntity.properties.parentJointIndex !== INVALID_JOINT_INDEX || avatarEntity.properties.relayParentJoints === true) && + return avatarEntity.properties.visible === true && (avatarEntity.properties.parentID === MyAvatar.sessionUUID || avatarEntity.properties.parentID === MyAvatar.SELF_ID); } diff --git a/scripts/system/controllers/controllerDispatcher.js b/scripts/system/controllers/controllerDispatcher.js index a38a230c66..b657faefba 100644 --- a/scripts/system/controllers/controllerDispatcher.js +++ b/scripts/system/controllers/controllerDispatcher.js @@ -448,7 +448,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); this.leftPointer = this.pointerManager.createPointer(false, PickType.Ray, { joint: "_CAMERA_RELATIVE_CONTROLLER_LEFTHAND", - filter: Picks.PICK_OVERLAYS | Picks.PICK_ENTITIES, + filter: Picks.PICK_OVERLAYS | Picks.PICK_ENTITIES | Picks.PICK_INCLUDE_NONCOLLIDABLE, triggers: [{action: Controller.Standard.LTClick, button: "Focus"}, {action: Controller.Standard.LTClick, button: "Primary"}], posOffset: getGrabPointSphereOffset(Controller.Standard.LeftHand, true), hover: true, @@ -458,7 +458,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); }); this.rightPointer = this.pointerManager.createPointer(false, PickType.Ray, { joint: "_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND", - filter: Picks.PICK_OVERLAYS | Picks.PICK_ENTITIES, + filter: Picks.PICK_OVERLAYS | Picks.PICK_ENTITIES | Picks.PICK_INCLUDE_NONCOLLIDABLE, triggers: [{action: Controller.Standard.RTClick, button: "Focus"}, {action: Controller.Standard.RTClick, button: "Primary"}], posOffset: getGrabPointSphereOffset(Controller.Standard.RightHand, true), hover: true, @@ -490,7 +490,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); }); this.mouseRayPick = Pointers.createPointer(PickType.Ray, { joint: "Mouse", - filter: Picks.PICK_ENTITIES | Picks.PICK_OVERLAYS, + filter: Picks.PICK_OVERLAYS | Picks.PICK_ENTITIES | Picks.PICK_INCLUDE_NONCOLLIDABLE, enabled: true }); this.handleHandMessage = function(channel, data, sender) { diff --git a/scripts/system/controllers/controllerModules/equipEntity.js b/scripts/system/controllers/controllerModules/equipEntity.js index 2f343ff84b..12a69d7b27 100644 --- a/scripts/system/controllers/controllerModules/equipEntity.js +++ b/scripts/system/controllers/controllerModules/equipEntity.js @@ -485,7 +485,7 @@ EquipHotspotBuddy.prototype.update = function(deltaTime, timestamp, controllerDa } var handJointIndex; - if (grabData.grabFollowsController) { + if (HMD.mounted && HMD.isHandControllerAvailable() && grabData.grabFollowsController) { handJointIndex = this.controllerJointIndex; } else { handJointIndex = MyAvatar.getJointIndex(this.hand === RIGHT_HAND ? "RightHand" : "LeftHand"); diff --git a/scripts/system/controllers/controllerModules/farActionGrabEntity.js b/scripts/system/controllers/controllerModules/farActionGrabEntity.js index 2a360c0f31..91119a4292 100644 --- a/scripts/system/controllers/controllerModules/farActionGrabEntity.js +++ b/scripts/system/controllers/controllerModules/farActionGrabEntity.js @@ -83,7 +83,6 @@ Script.include("/~/system/libraries/controllers.js"); this.potentialEntityWithContextOverlay = false; this.entityWithContextOverlay = false; this.contextOverlayTimer = false; - this.previousCollisionStatus = false; this.locked = false; this.highlightedEntity = null; this.reticleMinX = MARGIN; diff --git a/scripts/system/controllers/controllerModules/farParentGrabEntity.js b/scripts/system/controllers/controllerModules/farParentGrabEntity.js index ac6c41d4d6..f85869aa7f 100644 --- a/scripts/system/controllers/controllerModules/farParentGrabEntity.js +++ b/scripts/system/controllers/controllerModules/farParentGrabEntity.js @@ -262,7 +262,9 @@ Script.include("/~/system/libraries/controllers.js"); if (this.thisFarGrabJointIsParent(endProps)) { Entities.editEntity(this.targetEntityID, { parentID: this.previousParentID[this.targetEntityID], - parentJointIndex: this.previousParentJointIndex[this.targetEntityID] + parentJointIndex: this.previousParentJointIndex[this.targetEntityID], + localVelocity: {x: 0, y: 0, z: 0}, + localAngularVelocity: {x: 0, y: 0, z: 0} }); } diff --git a/scripts/system/controllers/controllerModules/nearParentGrabEntity.js b/scripts/system/controllers/controllerModules/nearParentGrabEntity.js index bbdcbaaa64..f354067a77 100644 --- a/scripts/system/controllers/controllerModules/nearParentGrabEntity.js +++ b/scripts/system/controllers/controllerModules/nearParentGrabEntity.js @@ -149,20 +149,12 @@ Script.include("/~/system/libraries/controllers.js"); this.hapticTargetID = null; var props = controllerData.nearbyEntityPropertiesByID[this.targetEntityID]; if (this.thisHandIsParent(props) && !this.robbed) { - if (this.previousParentID[this.targetEntityID] === Uuid.NULL || this.previousParentID === undefined) { - Entities.editEntity(this.targetEntityID, { - parentID: this.previousParentID[this.targetEntityID], - parentJointIndex: this.previousParentJointIndex[this.targetEntityID] - }); - } else { - // we're putting this back as a child of some other parent, so zero its velocity - Entities.editEntity(this.targetEntityID, { - parentID: this.previousParentID[this.targetEntityID], - parentJointIndex: this.previousParentJointIndex[this.targetEntityID], - localVelocity: {x: 0, y: 0, z: 0}, - localAngularVelocity: {x: 0, y: 0, z: 0} - }); - } + Entities.editEntity(this.targetEntityID, { + parentID: this.previousParentID[this.targetEntityID], + parentJointIndex: this.previousParentJointIndex[this.targetEntityID], + localVelocity: {x: 0, y: 0, z: 0}, + localAngularVelocity: {x: 0, y: 0, z: 0} + }); } var args = [this.hand === RIGHT_HAND ? "right" : "left", MyAvatar.sessionUUID]; diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 1aba6b92f6..44aa04b497 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -358,9 +358,9 @@ Script.include("/~/system/libraries/controllers.js"); var sensorToWorldScale = MyAvatar.getSensorToWorldScale(); - var radius = capsuleData.radius / sensorToWorldScale; - var height = (Vec3.distance(capsuleData.start, capsuleData.end) + (capsuleData.radius * 2.0)) / sensorToWorldScale; - var capsuleRatio = 10.0 * radius / height; + var diameter = 2.0 * capsuleData.radius / sensorToWorldScale; + var height = (Vec3.distance(capsuleData.start, capsuleData.end) + diameter) / sensorToWorldScale; + var capsuleRatio = 5.0 * diameter / height; var offset = _this.pickHeightOffset * capsuleRatio; _this.teleportHandCollisionPick = Picks.createPick(PickType.Collision, { @@ -370,9 +370,9 @@ Script.include("/~/system/libraries/controllers.js"); shape: { shapeType: "capsule-y", dimensions: { - x: radius * 2.0, - y: height - (radius * 2.0), - z: radius * 2.0 + x: diameter, + y: height, + z: diameter } }, position: { x: 0, y: offset + height * 0.5, z: 0 }, @@ -386,9 +386,9 @@ Script.include("/~/system/libraries/controllers.js"); shape: { shapeType: "capsule-y", dimensions: { - x: radius * 2.0, - y: height - (radius * 2.0), - z: radius * 2.0 + x: diameter, + y: height, + z: diameter } }, position: { x: 0, y: offset + height * 0.5, z: 0 }, diff --git a/scripts/system/edit.js b/scripts/system/edit.js index c8811bd603..d3e9a475ac 100644 --- a/scripts/system/edit.js +++ b/scripts/system/edit.js @@ -494,9 +494,9 @@ var toolBar = (function () { applyProperties(properties, DEFAULT_ENTITY_PROPERTIES.All); var type = requestedProperties.type; - if (type == "Box" || type == "Sphere") { + if (type === "Box" || type === "Sphere") { applyProperties(properties, DEFAULT_ENTITY_PROPERTIES.Shape); - } else if (type == "Image") { + } else if (type === "Image") { requestedProperties.type = "Model"; applyProperties(properties, DEFAULT_ENTITY_PROPERTIES.Image); } else { @@ -1218,7 +1218,7 @@ function mouseClickEvent(event) { var result, properties, tabletClicked; if (isActive && event.isLeftButton) { result = findClickedEntity(event); - tabletOrEditHandleClicked = wasTabletOrEditHandleClicked(event); + var tabletOrEditHandleClicked = wasTabletOrEditHandleClicked(event); if (tabletOrEditHandleClicked) { return; } @@ -1541,7 +1541,7 @@ function insideBox(center, dimensions, point) { (Math.abs(point.z - center.z) <= (dimensions.z / 2.0)); } -function selectAllEtitiesInCurrentSelectionBox(keepIfTouching) { +function selectAllEntitiesInCurrentSelectionBox(keepIfTouching) { if (selectionManager.hasSelection()) { // Get all entities touching the bounding box of the current selection var boundingBoxCorner = Vec3.subtract(selectionManager.worldPosition, @@ -1820,9 +1820,9 @@ function handleMenuEvent(menuItem) { Window.promptAsync("URL of SVO to import", ""); } } else if (menuItem === "Select All Entities In Box") { - selectAllEtitiesInCurrentSelectionBox(false); + selectAllEntitiesInCurrentSelectionBox(false); } else if (menuItem === "Select All Entities Touching Box") { - selectAllEtitiesInCurrentSelectionBox(true); + selectAllEntitiesInCurrentSelectionBox(true); } else if (menuItem === MENU_SHOW_LIGHTS_AND_PARTICLES_IN_EDIT_MODE) { entityIconOverlayManager.setVisible(isActive && Menu.isOptionChecked(MENU_SHOW_LIGHTS_AND_PARTICLES_IN_EDIT_MODE)); } else if (menuItem === MENU_SHOW_ZONES_IN_EDIT_MODE) { @@ -2108,14 +2108,14 @@ var DELETED_ENTITY_MAP = {}; function applyEntityProperties(data) { var editEntities = data.editEntities; var selectedEntityIDs = []; - var selectEdits = data.createEntities.length == 0 || !data.selectCreated; - var i, entityID; + var selectEdits = data.createEntities.length === 0 || !data.selectCreated; + var i, entityID, entityProperties; for (i = 0; i < editEntities.length; i++) { - var entityID = editEntities[i].entityID; + entityID = editEntities[i].entityID; if (DELETED_ENTITY_MAP[entityID] !== undefined) { entityID = DELETED_ENTITY_MAP[entityID]; } - var entityProperties = editEntities[i].properties; + entityProperties = editEntities[i].properties; if (entityProperties !== null) { Entities.editEntity(entityID, entityProperties); } @@ -2125,7 +2125,7 @@ function applyEntityProperties(data) { } for (i = 0; i < data.createEntities.length; i++) { entityID = data.createEntities[i].entityID; - var entityProperties = data.createEntities[i].properties; + entityProperties = data.createEntities[i].properties; var newEntityID = Entities.addEntity(entityProperties); recursiveAdd(newEntityID, data.createEntities[i]); DELETED_ENTITY_MAP[entityID] = newEntityID; @@ -2261,9 +2261,17 @@ var PropertiesTool = function (opts) { }); } + that.setSpaceMode = function(spaceMode) { + emitScriptEvent({ + type: 'setSpaceMode', + spaceMode: spaceMode + }) + }; + function updateSelections(selectionUpdated) { var data = { - type: 'update' + type: 'update', + spaceMode: selectionDisplay.getSpaceMode() }; if (selectionUpdated) { @@ -2293,6 +2301,9 @@ var PropertiesTool = function (opts) { if (entity.properties.rotation !== undefined) { entity.properties.rotation = Quat.safeEulerAngles(entity.properties.rotation); } + if (entity.properties.localRotation !== undefined) { + entity.properties.localRotation = Quat.safeEulerAngles(entity.properties.localRotation); + } if (entity.properties.emitOrientation !== undefined) { entity.properties.emitOrientation = Quat.safeEulerAngles(entity.properties.emitOrientation); } @@ -2329,12 +2340,15 @@ var PropertiesTool = function (opts) { } else if (data.properties) { if (data.properties.dynamic === false) { // this object is leaving dynamic, so we zero its velocities - data.properties.velocity = Vec3.ZERO; - data.properties.angularVelocity = Vec3.ZERO; + data.properties.localVelocity = Vec3.ZERO; + data.properties.localAngularVelocity = Vec3.ZERO; } if (data.properties.rotation !== undefined) { data.properties.rotation = Quat.fromVec3Degrees(data.properties.rotation); } + if (data.properties.localRotation !== undefined) { + data.properties.localRotation = Quat.fromVec3Degrees(data.properties.localRotation); + } if (data.properties.emitOrientation !== undefined) { data.properties.emitOrientation = Quat.fromVec3Degrees(data.properties.emitOrientation); } @@ -2583,7 +2597,7 @@ var PopupMenu = function () { y: event.y }); if (!pressingOverlay) { - if (hoveringOverlay !== null && hoveringOverlay !== null && overlay !== hoveringOverlay) { + if (hoveringOverlay !== null && overlay !== hoveringOverlay) { Overlays.editOverlay(hoveringOverlay, { backgroundColor: upColor }); @@ -2725,4 +2739,10 @@ entityListTool.webView.webEventReceived.connect(function(data) { } }); + +selectionDisplay.onSpaceModeChange = function(spaceMode) { + entityListTool.setSpaceMode(spaceMode); + propertiesTool.setSpaceMode(spaceMode); +}; + }()); // END LOCAL_SCOPE diff --git a/scripts/system/html/css/edit-style.css b/scripts/system/html/css/edit-style.css index b9a54023eb..2adabc1549 100644 --- a/scripts/system/html/css/edit-style.css +++ b/scripts/system/html/css/edit-style.css @@ -103,7 +103,7 @@ thead { font-size: 12px; text-transform: uppercase; background-color: #1c1c1c; - padding: 1px 0px; + padding: 1px 0; border-bottom: 1px solid #575757; width: 100%; } @@ -228,7 +228,7 @@ input::-webkit-input-placeholder { font-style: italic; } -input:focus, textarea:focus { +input:focus, textarea:focus, button:focus { color: #fff; background-color: #000; outline: 1px solid #00b4ef; @@ -289,7 +289,7 @@ input[type=number]::-webkit-inner-spin-button { width: 10px; height: 90%; overflow: hidden; - font-family: hifi-glyphs; + font-family: HiFi-Glyphs; font-size: 32px; color: #afafaf; cursor: pointer; @@ -346,14 +346,14 @@ input.no-spin::-webkit-inner-spin-button { padding-right: 12px; } -input[type=button] { +input[type=button], button.hifi-edit-button { font-family: Raleway-Bold; font-size: 13px; text-transform: uppercase; vertical-align: top; height: 28px; min-width: 120px; - padding: 0px 18px; + padding: 0 18px; margin-right: 6px; border-radius: 5px; border: none; @@ -363,7 +363,7 @@ input[type=button] { cursor: pointer; } -input[type=button].glyph { +input[type=button].glyph, button.hifi-edit-button.glyph { font-family: HiFi-Glyphs; font-size: 20px; text-transform: none; @@ -371,58 +371,58 @@ input[type=button].glyph { padding: 0; } -input[type=button].red { +input[type=button].red, button.hifi-edit-button.red { color: #fff; background-color: #94132e; background: linear-gradient(#d42043 20%, #94132e 100%); } -input[type=button].blue { +input[type=button].blue, button.hifi-edit-button.blue { color: #fff; background-color: #1080b8; background: linear-gradient(#00b4ef 20%, #1080b8 100%); } -input[type=button].white { +input[type=button].white, button.hifi-edit-button.white { color: #121212; background-color: #afafaf; background: linear-gradient(#fff 20%, #afafaf 100%); } -input[type=button]:enabled:hover { +input[type=button]:enabled:hover, button.hifi-edit-button:enabled:hover { background: linear-gradient(#000, #000); border: none; } -input[type=button].red:enabled:hover { +input[type=button].red:enabled:hover, button.hifi-edit-button.red:enabled:hover { background: linear-gradient(#d42043, #d42043); border: none; } -input[type=button].blue:enabled:hover { +input[type=button].blue:enabled:hover, button.hifi-edit-button.blue:enabled:hover { background: linear-gradient(#00b4ef, #00b4ef); border: none; } -input[type=button].white:enabled:hover { +input[type=button].white:enabled:hover, button.hifi-edit-button.white:enabled:hover { background: linear-gradient(#fff, #fff); border: none; } -input[type=button]:active { +input[type=button]:active, button.hifi-edit-button:active { background: linear-gradient(#343434, #343434); } -input[type=button].red:active { +input[type=button].red:active, button.hifi-edit-button.red:active { background: linear-gradient(#94132e, #94132e); } -input[type=button].blue:active { +input[type=button].blue:active, button.hifi-edit-button.blue:active { background: linear-gradient(#1080b8, #1080b8); } -input[type=button].white:active { +input[type=button].white:active, button.hifi-edit-button.white:active { background: linear-gradient(#afafaf, #afafaf); } -input[type=button]:disabled { +input[type=button]:disabled, button.hifi-edit-button:disabled { color: #252525; background: linear-gradient(#575757 20%, #252525 100%); } -input[type=button][pressed=pressed] { +input[type=button][pressed=pressed], button.hifi-edit-button[pressed=pressed] { color: #00b4ef; } @@ -453,7 +453,7 @@ input[type=checkbox]:checked + label:hover { position: absolute; left: 6px; top: -2px; - font-family: hifi-glyphs; + font-family: HiFi-Glyphs; font-size: 30px; color: #afafaf; } @@ -1136,7 +1136,6 @@ body#entity-list-body { float: right; margin-right: 0; background-color: #ff0000; - min-width: 90px; } #entity-list { @@ -1164,6 +1163,9 @@ body#entity-list-body { #filter-type-options span { position: relative; top: 3px; + font-family: HiFi-Glyphs; + font-size: 13px; + color: #000000; padding-left: 6px; padding-right: 4px; } @@ -1184,7 +1186,7 @@ body#entity-list-body { #filter-in-view { position: absolute; - top: 0px; + top: 0; right: 126px; } @@ -1376,7 +1378,7 @@ input[type=button]#export { } #properties-base #property-type-icon { - font-family: hifi-glyphs; + font-family: HiFi-Glyphs; font-size: 31px; color: #00b4ef; margin: -4px 12px -4px -2px; @@ -1543,3 +1545,21 @@ input.rename-entity { bottom: 0; margin-top: 5px; } + +#toggle-space-mode::before { + font-family: HiFi-Glyphs; + font-size: 20px; + text-transform: none; + min-width: 32px; + padding-right: 4px; + vertical-align: middle; +} + +#toggle-space-mode.space-mode-local::before { + content: "m"; +} + +#toggle-space-mode.space-mode-world::before { + content: "\e02c"; +} + diff --git a/scripts/system/html/css/hifi-style.css b/scripts/system/html/css/hifi-style.css index e1e4f67723..90a5b366c2 100644 --- a/scripts/system/html/css/hifi-style.css +++ b/scripts/system/html/css/hifi-style.css @@ -139,9 +139,9 @@ input[type=radio]:active + label > span > span{ font-family: Raleway-Bold; font-size: 13px; color: black; - padding: 0px 10px; + padding: 0 10px; border-radius: 3px; - border-width: 0px; + border-width: 0; background-image: linear-gradient(#FFFFFF, #AFAFAF); min-height: 30px; } @@ -158,9 +158,9 @@ input[type=radio]:active + label > span > span{ font-family: Raleway-Bold; font-size: 13px; color: white; - padding: 0px 10px; + padding: 0 10px; border-radius: 3px; - border-width: 0px; + border-width: 0; background-image: linear-gradient(#00B4EF, #1080B8); min-height: 30px; } diff --git a/scripts/system/html/entityList.html b/scripts/system/html/entityList.html index 300b6f0b12..6915a45f19 100644 --- a/scripts/system/html/entityList.html +++ b/scripts/system/html/entityList.html @@ -9,6 +9,7 @@ --> + Entity List @@ -27,7 +28,8 @@ - + +
diff --git a/scripts/system/html/js/entityList.js b/scripts/system/html/js/entityList.js index 091994dc1f..0cc4e5a269 100644 --- a/scripts/system/html/js/entityList.js +++ b/scripts/system/html/js/entityList.js @@ -152,36 +152,59 @@ const ICON_FOR_TYPE = { }; // List of all entities -var entities = []; +let entities = []; // List of all entities, indexed by Entity ID -var entitiesByID = {}; +let entitiesByID = {}; // The filtered and sorted list of entities passed to ListView -var visibleEntities = []; +let visibleEntities = []; // List of all entities that are currently selected -var selectedEntities = []; +let selectedEntities = []; -var entityList = null; // The ListView +let entityList = null; // The ListView /** * @type EntityListContextMenu */ -var entityListContextMenu = null; +let entityListContextMenu = null; -var currentSortColumn = null; -var currentSortOrder = ASCENDING_SORT; -var elSortOrders = {}; -var typeFilters = []; -var isFilterInView = false; +let currentSortColumn = null; +let currentSortOrder = ASCENDING_SORT; +let elSortOrders = {}; +let typeFilters = []; +let isFilterInView = false; -var columns = []; -var columnsByID = {}; -var currentResizeEl = null; -var startResizeEvent = null; -var resizeColumnIndex = 0; -var startThClick = null; +let columns = []; +let columnsByID = {}; +let currentResizeEl = null; +let startResizeEvent = null; +let resizeColumnIndex = 0; +let startThClick = null; + +let elEntityTable, + elEntityTableBody, + elEntityTableScroll, + elEntityTableHeaderRow, + elRefresh, + elToggleLocked, + elToggleVisible, + elDelete, + elFilterTypeSelectBox, + elFilterTypeText, + elFilterTypeCheckboxes, + elFilterSearch, + elFilterInView, + elFilterRadius, + elExport, + elPal, + elInfoToggle, + elInfoToggleGlyph, + elSelectedEntitiesCount, + elVisibleEntitiesCount, + elNoEntitiesMessage, + elToggleSpaceMode; const ENABLE_PROFILING = false; -var profileIndent = ''; +let profileIndent = ''; const PROFILE_NOOP = function(_name, fn, args) { fn.apply(this, args); } ; @@ -214,7 +237,7 @@ function loaded() { elFilterTypeText = document.getElementById("filter-type-text"); elFilterTypeOptions = document.getElementById("filter-type-options"); elFilterSearch = document.getElementById("filter-search"); - elFilterInView = document.getElementById("filter-in-view") + elFilterInView = document.getElementById("filter-in-view"); elFilterRadius = document.getElementById("filter-radius"); elExport = document.getElementById("export"); elPal = document.getElementById("pal"); @@ -223,6 +246,7 @@ function loaded() { elNoEntitiesMessage = document.getElementById("no-entities"); elColumnsMultiselectBox = document.getElementById("entity-table-columns-multiselect-box"); elColumnsOptions = document.getElementById("entity-table-columns-options"); + elToggleSpaceMode = document.getElementById('toggle-space-mode'); document.body.onclick = onBodyClick; elToggleLocked.onclick = function() { @@ -240,8 +264,12 @@ function loaded() { elDelete.onclick = function() { EventBridge.emitWebEvent(JSON.stringify({ type: 'delete' })); }; + elToggleSpaceMode.onclick = function() { + EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleSpaceMode' })); + }; elRefresh.onclick = refreshEntities; elFilterTypeMultiselectBox.onclick = onToggleTypeDropdown; + elFilterTypeSelectBox.onclick = onToggleTypeDropdown; elFilterSearch.onkeyup = refreshEntityList; elFilterSearch.onsearch = refreshEntityList; elFilterInView.onclick = onToggleFilterInView; @@ -756,6 +784,8 @@ function loaded() { } } + elToggleSpaceMode.disabled = selectedIDs.length > 1; + refreshFooter(); return notFound; @@ -1078,6 +1108,16 @@ function loaded() { ev.stopPropagation(); } + function setSpaceMode(spaceMode) { + if (spaceMode === "local") { + elToggleSpaceMode.className = "space-mode-local hifi-edit-button"; + elToggleSpaceMode.innerText = "Local"; + } else { + elToggleSpaceMode.className = "space-mode-world hifi-edit-button"; + elToggleSpaceMode.innerText = "World"; + } + } + document.addEventListener("keydown", function (keyDownEvent) { if (keyDownEvent.target.nodeName === "INPUT") { return; @@ -1116,12 +1156,15 @@ function loaded() { updateSelectedEntities(data.selectedIDs, true); } } + setSpaceMode(data.spaceMode); }); } else if (data.type === "removeEntities" && data.deletedIDs !== undefined && data.selectedIDs !== undefined) { removeEntities(data.deletedIDs); updateSelectedEntities(data.selectedIDs, true); } else if (data.type === "deleted" && data.ids) { removeEntities(data.ids); + } else if (data.type === "setSpaceMode") { + setSpaceMode(data.spaceMode); } }); } diff --git a/scripts/system/html/js/entityProperties.js b/scripts/system/html/js/entityProperties.js index b66d7e19c6..f2c84d2f36 100644 --- a/scripts/system/html/js/entityProperties.js +++ b/scripts/system/html/js/entityProperties.js @@ -31,6 +31,12 @@ const DEGREES_TO_RADIANS = Math.PI / 180.0; const NO_SELECTION = "No selection"; +const PROPERTY_SPACE_MODE = { + ALL: 0, + LOCAL: 1, + WORLD: 2 +}; + const GROUPS = [ { id: "base", @@ -662,7 +668,7 @@ const GROUPS = [ propertyID: "speedSpread", }, { - label: "Emit Dimension", + label: "Emit Dimensions", type: "vec3", vec3Type: "xyz", min: 0, @@ -957,6 +963,17 @@ const GROUPS = [ subLabels: [ "x", "y", "z" ], unit: "m", propertyID: "position", + spaceMode: PROPERTY_SPACE_MODE.WORLD, + }, + { + label: "Local Position", + type: "vec3", + vec3Type: "xyz", + decimals: 4, + subLabels: [ "x", "y", "z" ], + unit: "m", + propertyID: "localPosition", + spaceMode: PROPERTY_SPACE_MODE.LOCAL, }, { label: "Rotation", @@ -967,9 +984,21 @@ const GROUPS = [ subLabels: [ "pitch", "yaw", "roll" ], unit: "deg", propertyID: "rotation", + spaceMode: PROPERTY_SPACE_MODE.WORLD, }, { - label: "Dimension", + label: "Local Rotation", + type: "vec3", + vec3Type: "pyr", + step: 0.1, + decimals: 4, + subLabels: [ "pitch", "yaw", "roll" ], + unit: "deg", + propertyID: "localRotation", + spaceMode: PROPERTY_SPACE_MODE.LOCAL, + }, + { + label: "Dimensions", type: "vec3", vec3Type: "xyz", min: 0, @@ -978,6 +1007,19 @@ const GROUPS = [ subLabels: [ "x", "y", "z" ], unit: "m", propertyID: "dimensions", + spaceMode: PROPERTY_SPACE_MODE.WORLD, + }, + { + label: "Local Dimensions", + type: "vec3", + vec3Type: "xyz", + min: 0, + step: 0.1, + decimals: 4, + subLabels: [ "x", "y", "z" ], + unit: "m", + propertyID: "localDimensions", + spaceMode: PROPERTY_SPACE_MODE.LOCAL, }, { label: "Scale", @@ -1174,7 +1216,7 @@ const GROUPS = [ decimals: 4, subLabels: [ "x", "y", "z" ], unit: "m/s", - propertyID: "velocity", + propertyID: "localVelocity", }, { label: "Linear Damping", @@ -1190,7 +1232,7 @@ const GROUPS = [ decimals: 4, subLabels: [ "pitch", "yaw", "roll" ], unit: "deg/s", - propertyID: "angularVelocity", + propertyID: "localAngularVelocity", }, { label: "Angular Damping", @@ -1317,6 +1359,7 @@ var particlePropertyUpdates = {}; var selectedEntityProperties; var lastEntityID = null; var createAppTooltip = new CreateAppTooltip(); +let currentSpaceMode = PROPERTY_SPACE_MODE.LOCAL; function debugPrint(message) { EventBridge.emitWebEvent( @@ -2666,7 +2709,17 @@ function showParentMaterialNameBox(number, elNumber, elString) { } } - +function updateVisibleSpaceModeProperties() { + for (let propertyID in properties) { + if (properties.hasOwnProperty(propertyID)) { + let property = properties[propertyID]; + let propertySpaceMode = property.spaceMode; + if (propertySpaceMode !== PROPERTY_SPACE_MODE.ALL) { + showPropertyElement(propertyID, propertySpaceMode === currentSpaceMode); + } + } + } +} function loaded() { openEventBridge(function() { @@ -2700,6 +2753,7 @@ function loaded() { let propertyType = propertyData.type; let propertyID = propertyData.propertyID; let propertyName = propertyData.propertyName !== undefined ? propertyData.propertyName : propertyID; + let propertySpaceMode = propertyData.spaceMode !== undefined ? propertyData.spaceMode : PROPERTY_SPACE_MODE.ALL; let propertyElementID = "property-" + propertyID; propertyElementID = propertyElementID.replace('.', '-'); @@ -2746,7 +2800,8 @@ function loaded() { elementID: propertyElementID, name: propertyName, isParticleProperty: group.id.includes("particles"), - elProperty: elProperty + elProperty, + spaceMode: propertySpaceMode, }; properties[propertyID] = property; @@ -2840,6 +2895,8 @@ function loaded() { elGroups[group.id] = elGroup; }); + + updateVisibleSpaceModeProperties(); if (window.EventBridge !== undefined) { EventBridge.scriptEventReceived.connect(function(data) { @@ -2860,6 +2917,9 @@ function loaded() { elServerScriptStatus.innerText = NOT_RUNNING_SCRIPT_STATUS; } } else if (data.type === "update" && data.selections) { + if (data.spaceMode !== undefined) { + currentSpaceMode = data.spaceMode === "local" ? PROPERTY_SPACE_MODE.LOCAL : PROPERTY_SPACE_MODE.WORLD; + } if (data.selections.length === 0) { if (lastEntityID !== null) { if (editor !== null) { @@ -3082,7 +3142,9 @@ function loaded() { } } } - + + updateVisibleSpaceModeProperties(); + if (selectedEntityProperties.type === "Image") { let imageLink = JSON.parse(selectedEntityProperties.textures)["tex.picture"]; getPropertyInputElement("image").value = imageLink; @@ -3167,6 +3229,9 @@ function loaded() { createAppTooltip.setTooltipData(data.tooltips); } else if (data.type === 'hmdActiveChanged') { createAppTooltip.setIsEnabled(!data.hmdActive); + } else if (data.type === 'setSpaceMode') { + currentSpaceMode = data.spaceMode === "local" ? PROPERTY_SPACE_MODE.LOCAL : PROPERTY_SPACE_MODE.WORLD; + updateVisibleSpaceModeProperties(); } }); diff --git a/scripts/system/libraries/entityList.js b/scripts/system/libraries/entityList.js index 585820d32f..c47e8045d6 100644 --- a/scripts/system/libraries/entityList.js +++ b/scripts/system/libraries/entityList.js @@ -115,6 +115,13 @@ EntityListTool = function(shouldUseEditTabletApp) { }); }); + that.setSpaceMode = function(spaceMode) { + emitJSONScriptEvent({ + type: 'setSpaceMode', + spaceMode: spaceMode + }); + }; + that.clearEntityList = function() { emitJSONScriptEvent({ type: 'clearEntityList' @@ -200,6 +207,7 @@ EntityListTool = function(shouldUseEditTabletApp) { type: "update", entities: entities, selectedIDs: selectedIDs, + spaceMode: SelectionDisplay.getSpaceMode(), }); }); }; @@ -288,6 +296,8 @@ EntityListTool = function(shouldUseEditTabletApp) { Entities.editEntity(data.entityID, {name: data.name}); // make sure that the name also gets updated in the properties window SelectionManager._update(); + } else if (data.type === "toggleSpaceMode") { + SelectionDisplay.toggleSpaceMode(); } }; diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 3bb36d632e..168c81db1f 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -281,7 +281,7 @@ SelectionManager = (function() { var actionArguments = Entities.getActionArguments(properties.id, actionID); if (actionArguments) { var type = actionArguments.type; - if (type == 'hold' || type == 'far-grab') { + if (type === 'hold' || type === 'far-grab') { continue; } delete actionArguments.ttl; @@ -500,7 +500,7 @@ SelectionManager = (function() { that.entityType = properties.type; if (selectionUpdated) { - SelectionDisplay.setSpaceMode(SPACE_LOCAL); + SelectionDisplay.useDesiredSpaceMode(); } } else { properties = Entities.getEntityProperties(that.selections[0], ['type', 'boundingBox']); @@ -537,7 +537,7 @@ SelectionManager = (function() { }; // For 1+ selections we can only modify selections in world space - SelectionDisplay.setSpaceMode(SPACE_WORLD); + SelectionDisplay.setSpaceMode(SPACE_WORLD, false); } for (var j = 0; j < listeners.length; j++) { @@ -633,24 +633,26 @@ SelectionDisplay = (function() { ALL: 3 }; - const SCALE_DIRECTION = { - LBN: 0, - RBN: 1, - LBF: 2, - RBF: 3, - LTN: 4, - RTN: 5, - LTF: 6, - RTF: 7 - }; - const ROTATE_DIRECTION = { PITCH: 0, YAW: 1, ROLL: 2 }; + /** + * The current space mode, this could have been a forced space mode since we do not support multi selection while in + * local space mode. + * @type {string} - should only be set to SPACE_LOCAL or SPACE_WORLD + */ var spaceMode = SPACE_LOCAL; + + /** + * The desired space mode, this is the user set space mode, which should be respected whenever it is possible. In the case + * of multi entity selection this space mode may differ from the actual spaceMode. + * @type {string} - should only be set to SPACE_LOCAL or SPACE_WORLD + */ + var desiredSpaceMode = SPACE_LOCAL; + var overlayNames = []; var lastControllerPoses = [ getControllerWorldLocation(Controller.Standard.LeftHand, true), @@ -1340,7 +1342,7 @@ SelectionDisplay = (function() { } }; - function controllerComputePickRay(hand) { + function controllerComputePickRay() { var hand = that.triggered() ? that.triggeredHand : that.pressedHand; var controllerPose = getControllerWorldLocation(hand, true); if (controllerPose.valid) { @@ -1400,8 +1402,21 @@ SelectionDisplay = (function() { that.updateHandles(); }; + + /** + * This callback is used for spaceMode changes. + * @callback spaceModeChangedCallback + * @param {string} spaceMode + */ + + /** + * set this property with a callback to keep track of spaceMode changes. + * @type {spaceModeChangedCallback} + */ + that.onSpaceModeChange = null; + // FUNCTION: SET SPACE MODE - that.setSpaceMode = function(newSpaceMode) { + that.setSpaceMode = function(newSpaceMode, isDesiredChange) { var wantDebug = false; if (wantDebug) { print("======> SetSpaceMode called. ========"); @@ -1411,7 +1426,15 @@ SelectionDisplay = (function() { if (wantDebug) { print(" Updating SpaceMode From: " + spaceMode + " To: " + newSpaceMode); } + if (isDesiredChange) { + desiredSpaceMode = newSpaceMode; + } spaceMode = newSpaceMode; + + if (that.onSpaceModeChange !== null) { + that.onSpaceModeChange(newSpaceMode); + } + that.updateHandles(); } else if (wantDebug) { print("WARNING: entitySelectionTool.setSpaceMode - Can't update SpaceMode. CurrentMode: " + @@ -1437,14 +1460,36 @@ SelectionDisplay = (function() { if (wantDebug) { print("PreToggle: " + spaceMode); } - spaceMode = (spaceMode === SPACE_LOCAL) ? SPACE_WORLD : SPACE_LOCAL; - that.updateHandles(); + that.setSpaceMode((spaceMode === SPACE_LOCAL) ? SPACE_WORLD : SPACE_LOCAL, true); if (wantDebug) { print("PostToggle: " + spaceMode); print("======== ToggleSpaceMode called. <========="); } }; + /** + * Switches the display mode back to the set desired display mode + */ + that.useDesiredSpaceMode = function() { + var wantDebug = false; + if (wantDebug) { + print("========> UseDesiredSpaceMode called. ========="); + } + that.setSpaceMode(desiredSpaceMode, false); + if (wantDebug) { + print("PostToggle: " + spaceMode); + print("======== UseDesiredSpaceMode called. <========="); + } + }; + + /** + * Get the currently set SpaceMode + * @returns {string} spaceMode + */ + that.getSpaceMode = function() { + return spaceMode; + }; + function addHandleTool(overlay, tool) { handleTools[overlay] = tool; return tool; @@ -1787,7 +1832,7 @@ SelectionDisplay = (function() { !isActiveTool(handleRotateYawRing) && !isActiveTool(handleRotateRollRing))); - // keep duplicator always hidden for now since you can hold Alt to duplciate while + // keep duplicator always hidden for now since you can hold Alt to duplicate while // translating an entity - we may bring duplicator back for HMD only later // that.setHandleDuplicatorVisible(!activeTool || isActiveTool(handleDuplicator)); diff --git a/server-console/src/main.js b/server-console/src/main.js index dc3fbd4333..5adb4be4cb 100644 --- a/server-console/src/main.js +++ b/server-console/src/main.js @@ -337,7 +337,17 @@ var notificationState = NotificationState.UNNOTIFIED; function setNotificationState (notificationType, pending = undefined) { if (pending !== undefined) { - pendingNotifications[notificationType] = pending; + if ((notificationType === HifiNotificationType.TRANSACTIONS || + notificationType === HifiNotificationType.ITEMS)) { + // special case, because we want to clear the indicator light + // on INVENTORY when either Transactions or Items are + // clicked on in the notification popup, we detect that case + // here and force both to be unnotified. + pendingNotifications[HifiNotificationType.TRANSACTIONS] = pending; + pendingNotifications[HifiNotificationType.ITEMS] = pending; + } else { + pendingNotifications[notificationType] = pending; + } notificationState = NotificationState.UNNOTIFIED; for (var key in pendingNotifications) { if (pendingNotifications[key]) { @@ -428,18 +438,12 @@ var labels = { setNotificationState(HifiNotificationType.PEOPLE, false); } }, - wallet: { - label: 'Wallet', + inventory: { + label: 'Inventory', click: function () { - StartInterface("hifiapp:WALLET"); - setNotificationState(HifiNotificationType.WALLET, false); - } - }, - marketplace: { - label: 'Market', - click: function () { - StartInterface("hifiapp:MARKET"); - setNotificationState(HifiNotificationType.MARKETPLACE, false); + StartInterface("hifiapp:INVENTORY"); + setNotificationState(HifiNotificationType.ITEMS, false); + setNotificationState(HifiNotificationType.TRANSACTIONS, false); } }, restart: { @@ -528,8 +532,7 @@ function buildMenuArray(serverState) { if (trayNotifications.enabled()) { menuArray.push(labels.goto); menuArray.push(labels.people); - menuArray.push(labels.wallet); - menuArray.push(labels.marketplace); + menuArray.push(labels.inventory); menuArray.push(separator); } menuArray.push(labels.showNotifications); @@ -565,8 +568,7 @@ function updateLabels(serverState) { labels.showNotifications.checked = trayNotifications.enabled(); labels.goto.icon = pendingNotifications[HifiNotificationType.GOTO] ? menuNotificationIcon : null; labels.people.icon = pendingNotifications[HifiNotificationType.PEOPLE] ? menuNotificationIcon : null; - labels.wallet.icon = pendingNotifications[HifiNotificationType.WALLET] ? menuNotificationIcon : null; - labels.marketplace.icon = pendingNotifications[HifiNotificationType.MARKETPLACE] ? menuNotificationIcon : null; + labels.inventory.icon = pendingNotifications[HifiNotificationType.ITEMS] || pendingNotifications[HifiNotificationType.TRANSACTIONS]? menuNotificationIcon : null; var onlineUsers = trayNotifications.getOnlineUsers(); delete labels.people.submenu; if (onlineUsers) { diff --git a/server-console/src/modules/hf-notifications.js b/server-console/src/modules/hf-notifications.js index 8a812625b4..1ddbd1d307 100644 --- a/server-console/src/modules/hf-notifications.js +++ b/server-console/src/modules/hf-notifications.js @@ -32,10 +32,10 @@ const StartInterface=hfApp.startInterface; const IsInterfaceRunning=hfApp.isInterfaceRunning; const NotificationType = { - GOTO: 'goto', - PEOPLE: 'people', - WALLET: 'wallet', - MARKETPLACE: 'marketplace' + GOTO: 'goto', + PEOPLE: 'people', + ITEMS: 'items', + TRANSACTIONS: 'transactions' }; @@ -89,34 +89,34 @@ HifiNotification.prototype = { } break; - case NotificationType.WALLET: + case NotificationType.TRANSACTIONS: if (typeof(this.data) === "number") { if (this.data === 1) { - text = "You have " + this.data + " unread Wallet transaction."; + text = "You have " + this.data + " unread transaction."; } else { - text = "You have " + this.data + " unread Wallet transactions."; + text = "You have " + this.data + " unread transactions."; } - message = "Click to open WALLET." - url = "hifiapp:hifi/commerce/wallet/Wallet.qml"; + message = "Click to open INVENTORY." + url = "hifiapp:INVENTORY"; break; } text = this.data.message.replace(/<\/?[^>]+(>|$)/g, ""); - message = "Click to open WALLET."; - url = "hifiapp:WALLET"; + message = "Click to open INVENTORY."; + url = "hifiapp:INVENTORY"; break; - case NotificationType.MARKETPLACE: + case NotificationType.ITEMS: if (typeof(this.data) === "number") { if (this.data === 1) { - text = this.data + " of your purchased items has an update available."; + text = this.data + " of your items has an update available."; } else { - text = this.data + " of your purchased items have updates available."; + text = this.data + " of your items have updates available."; } } else { text = "Update available for " + this.data.base_item_title + "."; } - message = "Click to open MARKET."; - url = "hifiapp:MARKET"; + message = "Click to open INVENTORY."; + url = "hifiapp:INVENTORY"; break; } notifier.notify({ @@ -235,7 +235,6 @@ HifiNotifications.prototype = { }, _showNotification: function () { var _this = this; - if (osType === 'Darwin') { this.pendingNotifications[0].show(function () { // For OSX @@ -325,10 +324,10 @@ HifiNotifications.prototype = { case NotificationType.PEOPLE: notifyData = content.data.users; break; - case NotificationType.WALLET: + case NotificationType.TRANSACTIONS: notifyData = content.data.history; break; - case NotificationType.MARKETPLACE: + case NotificationType.ITEMS: notifyData = content.data.updates; break; } @@ -376,19 +375,16 @@ HifiNotifications.prototype = { } }, function (error, data) { if (error || !data.body) { - console.log("Error: unable to get " + url); - finished(false); + console.log("Error: " + error + ": unable to get " + url); return; } var content = JSON.parse(data.body); if (!content || content.status != 'success') { console.log("Error: unable to get " + url); - finished(false); return; } if (!content.total_entries) { - finished(true, token); return; } if (!content.total_entries) { @@ -487,7 +483,7 @@ HifiNotifications.prototype = { console.log("Polling for economic activity"); var url = METAVERSE_SERVER_URL + ECONOMIC_ACTIVITY_URL + '?' + options.join('&'); console.log(url); - _this._pollCommon(NotificationType.WALLET, url, since, function () {}); + _this._pollCommon(NotificationType.TRANSACTIONS, url, since, function () {}); }, pollForMarketplaceUpdates: function (since) { var _this = this; @@ -499,7 +495,7 @@ HifiNotifications.prototype = { console.log("Polling for marketplace update"); var url = METAVERSE_SERVER_URL + UPDATES_URL + '?' + options.join('&'); console.log(url); - _this._pollCommon(NotificationType.MARKETPLACE, url, since, function (success, token) { + _this._pollCommon(NotificationType.ITEMS, url, since, function (success, token) { if (success) { var options = [ 'page=1', @@ -512,7 +508,7 @@ HifiNotifications.prototype = { 'bearer': token } }, function (error, data) { - _this._pollToDisableHighlight(NotificationType.MARKETPLACE, error, data); + _this._pollToDisableHighlight(NotificationType.ITEMS, error, data); }); } }); diff --git a/tests-manual/controllers/CMakeLists.txt b/tests-manual/controllers/CMakeLists.txt index ce1c150ed4..03043c79f2 100644 --- a/tests-manual/controllers/CMakeLists.txt +++ b/tests-manual/controllers/CMakeLists.txt @@ -11,14 +11,8 @@ setup_memory_debugger() # link in the shared libraries link_hifi_libraries(shared gl script-engine plugins render-utils ui-plugins input-plugins display-plugins controllers) - -if (WIN32) - add_dependency_external_projects(OpenVR) - find_package(OpenVR REQUIRED) - target_include_directories(${TARGET_NAME} PRIVATE ${OPENVR_INCLUDE_DIRS}) - target_link_libraries(${TARGET_NAME} ${OPENVR_LIBRARIES}) -endif() if (WIN32) + target_openvr() target_link_libraries(${TARGET_NAME} Winmm.lib) add_dependency_external_projects(wasapi) endif() diff --git a/tests-manual/render-texture-load/src/GLIHelpers.cpp b/tests-manual/render-texture-load/src/GLIHelpers.cpp index be39e7f1c8..abdd648485 100644 --- a/tests-manual/render-texture-load/src/GLIHelpers.cpp +++ b/tests-manual/render-texture-load/src/GLIHelpers.cpp @@ -10,6 +10,7 @@ #include #include +#if 0 #include #include #include @@ -68,3 +69,4 @@ gpu::TexturePointer processTexture(const QString& sourceFile) { // FIXME load the actual KTX texture return gpu::TexturePointer(); } +#endif \ No newline at end of file diff --git a/tests-manual/render-texture-load/src/GLIHelpers.h b/tests-manual/render-texture-load/src/GLIHelpers.h index a5d4f71bb3..b9332d7ba2 100644 --- a/tests-manual/render-texture-load/src/GLIHelpers.h +++ b/tests-manual/render-texture-load/src/GLIHelpers.h @@ -12,9 +12,8 @@ #include #include +#if 0 // Work around for a bug in the MSVC compiler that chokes when you use GLI and Qt headers together. -#define gli glm - #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-variable" @@ -46,3 +45,5 @@ gpu::TexturePointer processTexture(const QString& file); #endif + +#endif diff --git a/tests/shaders/CMakeLists.txt b/tests/shaders/CMakeLists.txt index e238405d62..a2bba2a425 100644 --- a/tests/shaders/CMakeLists.txt +++ b/tests/shaders/CMakeLists.txt @@ -4,6 +4,14 @@ macro (setup_testcase_dependencies) # link in the shared libraries link_hifi_libraries(shared test-utils gpu shaders gl ${PLATFORM_GL_BACKEND}) #target_spirv() + + find_package(spirv_cross_core REQUIRED) + find_package(spirv_cross_reflect REQUIRED) + find_package(spirv_cross_glsl REQUIRED) + target_include_directories(${TARGET_NAME} PRIVATE $) + target_include_directories(${TARGET_NAME} PRIVATE $ENV{VULKAN_SDK}/Include) + + package_libraries_for_deployment() endmacro () diff --git a/tests/shaders/src/ShaderTests.cpp b/tests/shaders/src/ShaderTests.cpp index 692771f0fc..56b92ed047 100644 --- a/tests/shaders/src/ShaderTests.cpp +++ b/tests/shaders/src/ShaderTests.cpp @@ -31,13 +31,27 @@ #include #include -#define RUNTIME_SHADER_COMPILE_TEST 0 +#define RUNTIME_SHADER_COMPILE_TEST 1 #if RUNTIME_SHADER_COMPILE_TEST +#include #include #include #include #include +#include + +#ifdef DEBUG +#define VCPKG_LIB_DIR "D:/hifi/vcpkg/hifi/installed/x64-windows/debug/lib/" +#else +#define VCPKG_LIB_DIR "D:/hifi/vcpkg/hifi/installed/x64-windows/lib/" +#endif + +#pragma comment(lib, VCPKG_LIB_DIR "shaderc_combined.lib") +#pragma comment(lib, VCPKG_LIB_DIR "spirv-cross-core.lib") +#pragma comment(lib, VCPKG_LIB_DIR "spirv-cross-glsl.lib") +#pragma comment(lib, VCPKG_LIB_DIR "spirv-cross-reflect.lib") + #endif QTEST_MAIN(ShaderTests) @@ -49,6 +63,7 @@ void ShaderTests::initTestCase() { if (!_context->makeCurrent()) { qFatal("Unable to make test GL context current"); } + QOpenGLContextWrapper(_context->qglContext()).makeCurrent(_context->getWindow()); gl::initModuleGl(); if (!_context->makeCurrent()) { qFatal("Unable to make test GL context current"); @@ -94,6 +109,7 @@ bool isSubset(const C& parent, const C& child) { return true; } +#if 0 gpu::Shader::ReflectionMap mergeReflection(const std::initializer_list& list) { gpu::Shader::ReflectionMap result; std::unordered_map> usedLocationsByType; @@ -124,6 +140,22 @@ gpu::Shader::ReflectionMap mergeReflection(const std::initializer_list +bool compareBindings(const C& actual, const gpu::Shader::LocationMap& expected) { + if (actual.size() != expected.size()) { + auto actualNames = toStringSet(actual, [](const auto& v) { return v.name; }); + auto expectedNames = toStringSet(expected, [](const auto& v) { return v.first; }); + if (!isSubset(expectedNames, actualNames)) { + qDebug() << "Found" << toQStringList(actualNames); + qDebug() << "Expected" << toQStringList(expectedNames); + return false; + } + } + return true; +} + +#endif + #endif template @@ -177,19 +209,6 @@ static void verifyInterface(const gpu::Shader::Source& vertexSource, const gpu:: } #if RUNTIME_SHADER_COMPILE_TEST -template -bool compareBindings(const C& actual, const gpu::Shader::LocationMap& expected) { - if (actual.size() != expected.size()) { - auto actualNames = toStringSet(actual, [](const auto& v) { return v.name; }); - auto expectedNames = toStringSet(expected, [](const auto& v) { return v.first; }); - if (!isSubset(expectedNames, actualNames)) { - qDebug() << "Found" << toQStringList(actualNames); - qDebug() << "Expected" << toQStringList(expectedNames); - return false; - } - } - return true; -} void configureGLSLCompilerResources(TBuiltInResource* glslCompilerResources) { glslCompilerResources->maxLights = 32; @@ -324,77 +343,40 @@ EShLanguage getShaderStage(const std::string& shaderName) { throw std::runtime_error("Invalid shader name"); } -const gpu::Shader::Source& loadShader(uint32_t shaderId); +void rebuildSource(shader::Dialect dialect, shader::Variant variant, const shader::Source& source) { + try { + using namespace glslang; + static const EShMessages messages = (EShMessages)(EShMsgDefault | EShMsgSpvRules | EShMsgVulkanRules); + auto shaderName = source.name; + const std::string baseOutName = "d:/shaders/" + shaderName; + auto stage = getShaderStage(shaderName); -bool compileSpirv(uint32_t shaderId, bool stereo) { - const gpu::Shader::Source& source = loadShader(shaderId); - using namespace glslang; + TShader shader(stage); + std::vector strings; + const auto& dialectVariantSource = source.dialectSources.at(dialect).variantSources.at(variant); + strings.push_back(dialectVariantSource.scribe.c_str()); + shader.setStrings(strings.data(), (int)strings.size()); + shader.setEnvInput(EShSourceGlsl, stage, EShClientOpenGL, 450); + shader.setEnvClient(EShClientVulkan, EShTargetVulkan_1_1); + shader.setEnvTarget(EShTargetSpv, EShTargetSpv_1_3); - static const std::string CORE_HEADER( - R"SHADER(#version 450 core -#define GPU_GL450 -#define BITFIELD int -#define GPU_SSBO_TRANSFORM_OBJECT -#define gl_VertexID gl_VertexIndex -#define gl_InstanceID gl_InstanceIndex -)SHADER"); + bool success = shader.parse(&glslCompilerResources, 450, false, messages); + if (!success) { + qWarning() << "Failed to parse shader " << shaderName.c_str(); + qWarning() << shader.getInfoLog(); + qWarning() << shader.getInfoDebugLog(); + throw std::runtime_error("Wrong"); + } - static const std::string DOMAIN_HEADER[] = { - "#define GPU_VERTEX_SHADER\r\n", - "#define GPU_PIXEL_SHADER\r\n", - "#define GPU_GEOMETRY_SHADER\r\n", - }; - - static const std::string STEREO_HEADER( - R"SHADER( -#define GPU_TRANSFORM_IS_STEREO -#define GPU_TRANSFORM_STEREO_CAMERA -#define GPU_TRANSFORM_STEREO_CAMERA_INSTANCED -#define GPU_TRANSFORM_STEREO_SPLIT_SCREEN -)SHADER"); - - static std::once_flag once; - static TBuiltInResource glslCompilerResources; - std::call_once(once, [&] { configureGLSLCompilerResources(&glslCompilerResources); }); - - static const EShMessages messages = (EShMessages)(EShMsgDefault | EShMsgSpvRules | EShMsgVulkanRules); - auto shaderName = shader::loadShaderName(shaderId); - auto stage = getShaderStage(shaderName); - - TShader shader(stage); - std::vector strings; - strings.push_back(CORE_HEADER.c_str()); - strings.push_back(DOMAIN_HEADER[stage == EShLangVertex ? 0 : 1].c_str()); - if (stereo) { - strings.push_back(STEREO_HEADER.c_str()); - } - strings.push_back(source.getCode().c_str()); - shader.setStrings(strings.data(), (int)strings.size()); - shader.setEnvInput(EShSourceGlsl, stage, EShClientOpenGL, 450); - shader.setEnvClient(EShClientVulkan, EShTargetVulkan_1_1); - shader.setEnvTarget(EShTargetSpv, EShTargetSpv_1_3); - bool success = shader.parse(&glslCompilerResources, 450, false, messages); - if (!success) { - qWarning() << "Failed to parse shader " << shaderName.c_str(); - qWarning() << shader.getInfoLog(); - qWarning() << shader.getInfoDebugLog(); - return false; - } - - // Create and link a shader program containing the single shader - glslang::TProgram program; - program.addShader(&shader); - if (!program.link(messages)) { - qWarning() << "Failed to compile shader " << shaderName.c_str(); - qWarning() << program.getInfoLog(); - qWarning() << program.getInfoDebugLog(); - return false; - } - - std::string baseOutName = "d:/shaders/" + shaderName; - if (stereo) { - baseOutName += ".stereo"; - } + // Create and link a shader program containing the single shader + glslang::TProgram program; + program.addShader(&shader); + if (!program.link(messages)) { + qWarning() << "Failed to compile shader " << shaderName.c_str(); + qWarning() << program.getInfoLog(); + qWarning() << program.getInfoDebugLog(); + throw std::runtime_error("Wrong"); + } // Output the SPIR-V code from the shader program std::vector spirv; @@ -429,9 +411,10 @@ bool compileSpirv(uint32_t shaderId, bool stereo) { throw std::runtime_error("bad disassembly"); } - write(baseOutName + ".spv.txt", disassembly); - - return true; + write(baseOutName + ".spv.txt", disassembly); + } catch (const std::runtime_error& error) { + qWarning() << error.what(); + } } #endif @@ -524,88 +507,10 @@ void ShaderTests::testShaderLoad() { << fragmentSource.name.c_str(); QFAIL("Program link error"); } -#if RUNTIME_SHADER_COMPILE_TEST - auto expectedBindings = mergeReflection({ vertexSource, fragmentSource }); - QVERIFY(glshader != nullptr); - for (const auto& shaderObject : glshader->_shaderObjects) { - const auto& program = shaderObject.glprogram; - - // Uniforms - { - auto uniforms = gl::Uniform::load(program); - const auto& uniformRemap = shaderObject.uniformRemap; - auto expectedUniforms = expectedBindings[gpu::Shader::BindingType::UNIFORM]; - if (!compareBindings(uniforms, expectedUniforms)) { - qDebug() << "Uniforms mismatch"; - } - for (const auto& uniform : uniforms) { - if (0 != expectedUniforms.count(uniform.name)) { - auto expectedLocation = expectedUniforms[uniform.name]; - if (0 != uniformRemap.count(expectedLocation)) { - expectedLocation = uniformRemap.at(expectedLocation); - } - QVERIFY(expectedLocation == uniform.binding); - } - } - } - - // Textures - { - auto textures = gl::Uniform::loadTextures(program); - auto expiredBegin = - std::remove_if(textures.begin(), textures.end(), [&](const gl::Uniform& uniform) -> bool { - return uniform.name == "transformObjectBuffer"; - }); - textures.erase(expiredBegin, textures.end()); - - const auto expectedTextures = expectedBindings[gpu::Shader::BindingType::TEXTURE]; - if (!compareBindings(textures, expectedTextures)) { - qDebug() << "Textures mismatch"; - } - for (const auto& texture : textures) { - if (0 != expectedTextures.count(texture.name)) { - const auto& location = texture.binding; - const auto& expectedUnit = expectedTextures.at(texture.name); - GLint actualUnit = -1; - glGetUniformiv(program, location, &actualUnit); - QVERIFY(expectedUnit == actualUnit); - } - } - } - - // UBOs - { - auto ubos = gl::UniformBlock::load(program); - auto expectedUbos = expectedBindings[gpu::Shader::BindingType::UNIFORM_BUFFER]; - if (!compareBindings(ubos, expectedUbos)) { - qDebug() << "UBOs mismatch"; - } - for (const auto& ubo : ubos) { - if (0 != expectedUbos.count(ubo.name)) { - QVERIFY(expectedUbos[ubo.name] == ubo.binding); - } - } - } - - // FIXME add storage buffer validation - } -#endif } } catch (const std::runtime_error& error) { QFAIL(error.what()); } -#if RUNTIME_SHADER_COMPILE_TEST - for (uint32_t i = 1; i <= maxShader; ++i) { - auto used = usedShaders.count(i); - if (0 != usedShaders.count(i)) { - continue; - } - auto reflectionJson = shader::loadShaderReflection(i); - auto name = QJsonDocument::fromJson(reflectionJson.c_str()).object()["name"].toString(); - qDebug() << "Unused shader" << name; - } -#endif - qDebug() << "Completed all shaders"; } diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 1c36306410..6ec9125ce8 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -1,8 +1,6 @@ # add the tool directories -add_subdirectory(scribe) -set_target_properties(scribe PROPERTIES FOLDER "Tools") - find_npm() + if (NPM_EXECUTABLE) add_subdirectory(jsdoc) set_target_properties(jsdoc PROPERTIES FOLDER "Tools") diff --git a/tools/scribe/CMakeLists.txt b/tools/scribe/CMakeLists.txt deleted file mode 100755 index 9c71aeec9c..0000000000 --- a/tools/scribe/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -set(TARGET_NAME scribe) - -# don't use the setup_hifi_project macro as we don't want Qt or GLM dependencies -file(GLOB TARGET_SRCS src/*) -add_executable(${TARGET_NAME} ${TARGET_SRCS}) -if (WIN32) - set_property(TARGET ${TARGET_NAME} APPEND_STRING PROPERTY LINK_FLAGS_DEBUG "/OPT:NOREF /OPT:NOICF") -endif() diff --git a/tools/scribe/src/TextTemplate.cpp b/tools/scribe/src/TextTemplate.cpp deleted file mode 100755 index aad508487c..0000000000 --- a/tools/scribe/src/TextTemplate.cpp +++ /dev/null @@ -1,1012 +0,0 @@ -// -// TextTemplate.cpp -// tools/shaderScribe/src -// -// Created by Sam Gateau on 12/15/2014. -// Copyright 2013 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -#include "TextTemplate.h" - -#include -#include -#include -#include - -typedef TextTemplate::Block::Pointer BlockPointer; -typedef TextTemplate::Config::Pointer ConfigPointer; -typedef TextTemplate::Pointer TextTemplatePointer; - -const std::string TextTemplate::Tag::NULL_VAR = "_SCRIBE_NULL"; - -//----------------------------------------------------------------------------- -TextTemplate::Config::Config() : - _includes(), - _funcs(), - _logStream(&std::cout), - _numErrors(0), - _includerCallback(TextTemplate::loadFile) { - _paths.push_back(""); -} - -const TextTemplatePointer TextTemplate::Config::addInclude(const ConfigPointer& config, const char* include) { - if (!config) { - return TextTemplatePointer(); - } - - TextTemplatePointer included = config->findInclude(include); - if (included) { - return included; - } - - // INcluded doest exist yet so let's try to create it - String includeStream; - if (config->_includerCallback(config, include, includeStream)) { - // ok, then create a new Template on the include file with this as lib - included = std::make_shared(include, config); - - std::stringstream src(includeStream); - - int nbErrors = included->parse(src); - if (nbErrors > 0) { - included->logError(included->_root, "File failed to parse, not included"); - return TextTemplatePointer(); - } - config->_includes.insert(Includes::value_type(include, included)); - return included; - } - - return TextTemplatePointer(); -} - -const TextTemplatePointer TextTemplate::Config::findInclude(const char* include) { - Includes::iterator includeIt = _includes.find(String(include)); - if (includeIt != _includes.end()) { - return (*includeIt).second; - } else { - return TextTemplatePointer(); - } -} - -void TextTemplate::Config::addIncludePath(const char* path) { - _paths.push_back(String(path)); -} - -bool TextTemplate::loadFile(const ConfigPointer& config, const char* filename, String& source) { - String sourceFile(filename); - String fullfilename; - for (unsigned int i = 0; i < config->_paths.size(); i++) { - fullfilename = config->_paths[i] + sourceFile; - std::ifstream ifs; - ifs.open(fullfilename.c_str()); - if (ifs.is_open()) { - config->_includeFullPaths.insert(fullfilename); - std::string str((std::istreambuf_iterator(ifs)), std::istreambuf_iterator()); - source = str; - ifs.close(); - return (source.length() > 0); - } - } - - return false; -} - -TextTemplate::Funcs::Funcs() : - _funcs() { -} - -TextTemplate::Funcs::~Funcs() { -} - - -const BlockPointer TextTemplate::Funcs::findFunc(const char* func) { - map::iterator it = _funcs.find(String(func)); - if (it != _funcs.end()) { - return (*it).second; - } else { - return BlockPointer(); - } -} - -const BlockPointer TextTemplate::Funcs::addFunc(const char* func, const BlockPointer& funcBlock) { - BlockPointer included = findFunc(func); - if (! included) { - _funcs.insert(map::value_type(func, funcBlock)); - } - return included; -} - -void TextTemplate::Block::addNewBlock(const Pointer& parent, const Pointer& block) { - if (parent) { - parent->blocks.push_back(block); - block->parent = parent; - } -} - -const BlockPointer& TextTemplate::Block::getCurrentBlock(const Pointer& block) { - if (block && block->command.isBlockEnd()) { - return block->parent; - } else { - return block; - } -} - -void TextTemplate::logError(const Block::Pointer& block, const char* fmt, ...) { - va_list argp; - va_start(argp, fmt); - - char buff[256]; - sprintf(buff, fmt, argp); - - _numErrors++; - log() << block->sourceName << " Error >>" << buff << std::endl; - - int level = 1; - displayTree(std::cerr, level); - -} - -bool TextTemplate::grabUntilBeginTag(std::istream* str, std::string& grabbed, Tag::Type& tagType) { - std::stringstream dst; - while (!str->eof()) { - - std::string datatoken; - getline((*str), datatoken, Tag::BEGIN); - dst << datatoken; - - char next = str->peek(); - if (next == Tag::VAR) { - tagType = Tag::VARIABLE; - grabbed = dst.str(); - str->get(); // skip tag char - return true; - } else if (next == Tag::COM) { - tagType = Tag::COMMAND; - grabbed = dst.str(); - str->get(); // skip tag char - return true; - } else if (next == Tag::REM) { - tagType = Tag::REMARK; - grabbed = dst.str(); - str->get(); // skip tag char - return true; - } else { - if (!str->eof()) { - // false positive, just found the Tag::BEGIN without consequence - dst << Tag::BEGIN; - // keep searching - } else { - // end of the file finishing with no tag - tagType = Tag::INVALID; - grabbed = dst.str(); - return true; - } - } - } - - return false; -} - -bool TextTemplate::grabUntilEndTag(std::istream* str, std::string& grabbed, Tag::Type& tagType) { - std::stringstream dst; - - // preEnd char depends on tag type - char preEnd = Tag::COM; - if (tagType == Tag::VARIABLE) { - preEnd = Tag::VAR; - } else if (tagType == Tag::REMARK) { - preEnd = Tag::REM; - } - - while (!str->eof() && !str->fail()) { - // looking for the end of the tag means find the next preEnd - std::string dataToken; - getline((*str), dataToken, preEnd); - char end = str->peek(); - - dst << dataToken; - - // and if the next char is Tag::END then that's it - if (end == Tag::END) { - grabbed = dst.str(); - str->get(); // eat the Tag::END - return true; - } else { - // false positive, keep on searching - dst << preEnd; - } - } - grabbed = dst.str(); - return false; -} - -bool TextTemplate::stepForward(std::istream* str, std::string& grabbed, std::string& tag, Tag::Type& tagType, - Tag::Type& nextTagType) { - if (str->eof()) { - return false; - } - - if (!_steppingStarted) { - _steppingStarted = true; - return grabUntilBeginTag(str, grabbed, nextTagType); - } - - // Read from the last opening Tag::BEGIN captured to the next Tag::END - if (grabUntilEndTag(str, tag, tagType)) { - // skip trailing space and new lines only after Command or Remark tag block - if ((tagType == Tag::COMMAND) || (tagType == Tag::REMARK)) { - while (!str->eof() && !str->fail()) { - char c = str->peek(); - if ((c == ' ') || (c == '\t') || (c == '\n')) { - str->get(); - } else { - break; - } - } - } - - grabUntilBeginTag(str, grabbed, nextTagType); - } - - return true; //hasElement; -} - -const BlockPointer TextTemplate::processStep(const BlockPointer& block, std::string& grabbed, std::string& tag, - Tag::Type& tagType) { - switch (tagType) { - case Tag::INVALID: - block->ostr << grabbed; - return block; - break; - case Tag::VARIABLE: - return processStepVar(block, grabbed, tag); - break; - case Tag::COMMAND: - return processStepCommand(block, grabbed, tag); - break; - case Tag::REMARK: - return processStepRemark(block, grabbed, tag); - break; - } - - logError(block, "Invalid tag"); - return block; -} - -bool TextTemplate::grabFirstToken(String& src, String& token, String& reminder) { - bool goOn = true; - std::string::size_type i = 0; - while (goOn && (i < src.length())) { - char c = src[i]; - if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || (c == '_') || (c == '.') || (c == '[') || (c == ']')) { - token += c; - } else { - if (!token.empty()) { - reminder = src.substr(i); - return true; - } - } - i++; - } - - return (!token.empty()); -} - -bool TextTemplate::convertExpressionToArguments(String& src, std::vector< String >& arguments) { - std::stringstream str(src); - String token; - - while (!str.eof()) { - str >> token; - if (!str.fail()) { - arguments.push_back(token); - } - } - - return true; -} - -bool TextTemplate::convertExpressionToDefArguments(String& src, std::vector< String >& arguments) { - if (src.empty()) { - return false; - } - - std::stringstream argstr(src); - std::stringstream dest; - bool inVar = false; - while (!argstr.eof()) { - // parse the value of a var, try to find a VAR, so look for the pattern BEGIN,VAR ... VAR,END - String token; - char tag; - if (!inVar) { - getline(argstr, token, Tag::BEGIN); - dest << token; - tag = argstr.peek(); - } else { - getline(argstr, token, Tag::END); - dest << token; - tag = token.back(); - } - - if (tag == Tag::VAR) { - if (!inVar) { - // real var coming: - arguments.push_back(dest.str()); - inVar = true; - } else { - // real var over - arguments.push_back(dest.str()); - inVar = false; - } - } else { - if (argstr.eof()) { - arguments.push_back(dest.str()); - } else { - // put back the tag char stolen - dest << (!inVar ? Tag::BEGIN : Tag::END); - } - } - } - - return true; -} - -bool TextTemplate::convertExpressionToFuncArguments(String& src, std::vector< String >& arguments) { - if (src.empty()) { - return false; - } - std::stringstream streamSrc(src); - String params; - getline(streamSrc, params, '('); - getline(streamSrc, params, ')'); - if (params.empty()) { - return false; - } - - std::stringstream str(params); - String token; - int nbTokens = 0; - while (!str.eof()) { - char c = str.peek(); - if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || (c == '_') || (c == '.') || (c == Tag::VAR) || (c == '[') || (c == ']')) { - token += c; - } else if (c == ',') { - if (!token.empty()) { - if (token == Tag::NULL_VAR) { - arguments.push_back(Tag::NULL_VAR); - } else { - arguments.push_back(token); - } - nbTokens++; - } - token.clear(); - } - - str.get(); - } - - if (token.size()) { - arguments.push_back(token); - nbTokens++; - } - - return (nbTokens > 0); -} - -const BlockPointer TextTemplate::processStepVar(const BlockPointer& block, String& grabbed, String& tag) { - // then look at the define - String var = tag; - String varName; - String val; - - if (grabFirstToken(var, varName, val)) { - if (!varName.empty()) { - BlockPointer parent = Block::getCurrentBlock(block); - - // Add a new BLock - BlockPointer newBlock = std::make_shared(_root->sourceName); - (newBlock->ostr) << grabbed; - - newBlock->command.type = Command::VAR; - - newBlock->command.arguments.push_back(varName); - - if (!val.empty()) { - convertExpressionToFuncArguments(val, newBlock->command.arguments); - } - - Block::addNewBlock(parent, newBlock); - - // dive in the new block - return newBlock; - } - } - - return block; -} - -const BlockPointer TextTemplate::processStepCommand(const BlockPointer& block, String& grabbed, String& tag) { - // Grab the command name - String command = tag; - String commandName; - - if (grabFirstToken(command, commandName, command)) { - if (commandName.compare("def") == 0) { - return processStepDef(block, grabbed, command); - } else if (commandName.compare("if") == 0) { - return processStepCommandIf(block, grabbed, command); - } else if (commandName.compare("endif") == 0) { - return processStepCommandEndIf(block, grabbed, command); - } else if (commandName.compare("else") == 0) { - return processStepCommandElse(block, grabbed, command); - } else if (commandName.compare("elif") == 0) { - return processStepCommandElif(block, grabbed, command); - } else if (commandName.compare("include") == 0) { - return processStepInclude(block, grabbed, command); - } else if (commandName.compare("func") == 0) { - return processStepFunc(block, grabbed, command); - } else if (commandName.compare("endfunc") == 0) { - return processStepEndFunc(block, grabbed, command); - } - } - - return block; -} - -const BlockPointer TextTemplate::processStepDef(const BlockPointer& block, String& grabbed, String& def) { - // then look at the define - String varName; - String val; - - if (!grabFirstToken(def, varName, val)) { - logError(block, "Invalid Var name in a tag"); - return block; - } - - BlockPointer parent = Block::getCurrentBlock(block); - - // Add a new BLock - BlockPointer newBlock = std::make_shared(_root->sourceName); - (newBlock->ostr) << grabbed; - - newBlock->command.type = Command::DEF; - newBlock->command.arguments.push_back(varName); - if (!val.empty()) { - // loose first character which should be a white space - val = val.substr(val.find_first_not_of(' ')); - convertExpressionToDefArguments(val, newBlock->command.arguments); - } - - Block::addNewBlock(parent, newBlock); - - // dive in the new block - return newBlock; -} - - -const BlockPointer TextTemplate::processStepCommandIf(const BlockPointer& block, String& grabbed, String& expression) { - BlockPointer parent = Block::getCurrentBlock(block); - - // Add a new BLock depth - BlockPointer newIfBlock = std::make_shared(_root->sourceName); - newIfBlock->command.type = Command::IFBLOCK; - - Block::addNewBlock(parent, newIfBlock); - - BlockPointer newBlock = std::make_shared(_root->sourceName); - (newBlock->ostr) << grabbed; - - newBlock->command.type = Command::IF; - convertExpressionToArguments(expression, newBlock->command.arguments); - - Block::addNewBlock(newIfBlock, newBlock); - - // dive in the new If branch - return newBlock; -} - -const BlockPointer TextTemplate::processStepCommandEndIf(const BlockPointer& block, String& grabbed, String& expression) { - BlockPointer parent = Block::getCurrentBlock(block); - - // are we in a if block ? - if ((parent->command.type == Command::IF) - || (parent->command.type == Command::ELIF) - || (parent->command.type == Command::ELSE)) { - BlockPointer newBlock = std::make_shared(_root->sourceName); - (newBlock->ostr) << grabbed; - - newBlock->command.type = Command::ENDIF; - newBlock->command.arguments.push_back(expression); - - Block::addNewBlock(parent->parent->parent, newBlock); - - return newBlock; - } else { - logError(block, "Invalid block, not in a block"); - return block; - } - - return block; -} - -const BlockPointer TextTemplate::processStepCommandElse(const BlockPointer& block, String& grabbed, String& expression) { - BlockPointer parent = Block::getCurrentBlock(block); - - // are we in a if block ? - if ((parent->command.type == Command::IF) - || (parent->command.type == Command::ELIF)) { - // All good go back to the IfBlock - parent = parent->parent; - - // Add a new BLock depth - BlockPointer newBlock = std::make_shared(_root->sourceName); - newBlock->ostr << grabbed; - newBlock->command.type = Command::ELSE; - newBlock->command.arguments.push_back(expression); - - Block::addNewBlock(parent, newBlock); - - // dive in the new block - return newBlock; - - } else if ((block)->command.type == Command::ELSE) { - logError(block, "Invalid block, in a block but after a block"); - return block; - } else { - logError(block, "Invalid block, not in a block"); - return block; - } -} - -const BlockPointer TextTemplate::processStepCommandElif(const BlockPointer& block, String& grabbed, String& expression) { - BlockPointer parent = Block::getCurrentBlock(block); - - // are we in a if block ? - if ((parent->command.type == Command::IF) - || (parent->command.type == Command::ELIF)) { - // All good go back to the IfBlock - parent = parent->parent; - - // Add a new BLock depth - BlockPointer newBlock = std::make_shared(_root->sourceName); - (newBlock->ostr) << grabbed; - - newBlock->command.type = Command::ELIF; - convertExpressionToArguments(expression, newBlock->command.arguments); - - Block::addNewBlock(parent, newBlock); - - // dive in the new block - return newBlock; - - } else if (parent->command.type == Command::ELSE) { - logError(block, "Invalid block, in a block but after a block"); - return block; - } else { - logError(block, "Invalid block, not in a block"); - return block; - } -} - -const BlockPointer TextTemplate::processStepRemark(const BlockPointer& block, String& grabbed, String& tag) { - // nothing to do :) - - // no need to think, let's just add the grabbed text - (block->ostr) << grabbed; - - return block; -} - -const BlockPointer TextTemplate::processStepInclude(const BlockPointer& block, String& grabbed, String& include) { - BlockPointer parent = Block::getCurrentBlock(block); - - // Add a new BLock - BlockPointer newBlock = std::make_shared(_root->sourceName); - (newBlock->ostr) << grabbed; - - newBlock->command.type = Command::INCLUDE; - convertExpressionToArguments(include, newBlock->command.arguments); - - Block::addNewBlock(parent, newBlock); - - TextTemplatePointer inc = Config::addInclude(_config, newBlock->command.arguments.front().c_str()); - if (!inc) { - logError(newBlock, "Failed to include %s", newBlock->command.arguments.front().c_str()); - } - - // dive in the new block - return newBlock; -} - -const BlockPointer TextTemplate::processStepFunc(const BlockPointer& block, String& grabbed, String& func) { - // then look at the define - String varName; - String var; - - if (!grabFirstToken(func, varName, var)) { - logError(block, "Invalid func name <%s> in a block", func.c_str()); - return block; - } - - // DOes the func already exists ? - if (_config->_funcs.findFunc(varName.c_str())) { - logError(block, "Declaring a new func named <%s> already exists", func.c_str()); - return block; - } - - BlockPointer parent = Block::getCurrentBlock(block); - - // Add a new BLock - BlockPointer newBlock = std::make_shared(_root->sourceName); - (newBlock->ostr) << grabbed; - - newBlock->command.type = Command::FUNC; - newBlock->command.arguments.push_back(varName); - convertExpressionToFuncArguments(var, newBlock->command.arguments); - - _config->_funcs.addFunc(varName.c_str(), newBlock); - - Block::addNewBlock(parent, newBlock); - - // dive in the new block - return newBlock; -} - -const BlockPointer TextTemplate::processStepEndFunc(const BlockPointer& block, String& grabbed, String& tag) { - BlockPointer parent = Block::getCurrentBlock(block); - - // are we in a func block ? - if (parent->command.type == Command::FUNC) { - // Make sure the FUnc has been declared properly - BlockPointer funcBlock = _config->_funcs.findFunc(parent->command.arguments.front().c_str()); - if (funcBlock != parent) { - logError(block, "Mismatching blocks"); - return BlockPointer(); - } - - // Everything is cool , so let's unplugg the FUnc block from this tree and just put the EndFunc block - - BlockPointer newBlock = std::make_shared(_root->sourceName); - (newBlock->ostr) << grabbed; - - newBlock->command.type = Command::ENDFUNC; - convertExpressionToArguments(tag, newBlock->command.arguments); - - newBlock->parent = parent->parent; - - parent->parent->blocks.back() = newBlock; - - parent->parent = 0; - - // dive in the new block - return newBlock; - } else { - logError(block, "Invalid block, not in a block"); - return BlockPointer(); - } - - return block; -} - -TextTemplate::TextTemplate(const String& name, const ConfigPointer& externalConfig) : - _config(externalConfig), - _root(new Block(name)), - _numErrors(0), - _steppingStarted(false) { -} - -TextTemplate::~TextTemplate() { -} - -int TextTemplate::scribe(std::ostream& dst, std::istream& src, Vars& vars) { - int nbErrors = parse(src); - - if (nbErrors == 0) { - return generate(dst, vars); - } - return nbErrors; -} - -int TextTemplate::generateTree(std::ostream& dst, const BlockPointer& block, Vars& vars) { - BlockPointer newCurrentBlock; - int numPasses = evalBlockGeneration(dst, block, vars, newCurrentBlock); - for (int passNum= 0; passNum < numPasses; passNum++) { - dst << newCurrentBlock->ostr.str(); - - for (auto child : newCurrentBlock->blocks) { - generateTree(dst, child, vars); - } - } - - return _numErrors; -} - -int TextTemplate::evalBlockGeneration(std::ostream& dst, const BlockPointer& block, Vars& vars, BlockPointer& branch) { - switch (block->command.type) { - case Command::BLOCK: { - branch = block; - return 1; - } - break; - case Command::VAR: { - Vars::iterator it = vars.find(block->command.arguments.front()); - if (it != vars.end()) { - dst << (*it).second; - } else { - BlockPointer funcBlock = _config->_funcs.findFunc(block->command.arguments.front().c_str()); - if (funcBlock) { - // before diving in the func tree, let's modify the vars with the local defs: - int nbParams = (int)std::min(block->command.arguments.size(), - funcBlock->command.arguments.size()); - std::vector< String > paramCache; - paramCache.push_back(""); - String val; - for (int i = 1; i < nbParams; i++) { - val = block->command.arguments[i]; - if ((val[0] == Tag::VAR) && (val[val.length()-1] == Tag::VAR)) { - val = val.substr(1, val.length()-2); - Vars::iterator it = vars.find(val); - if (it != vars.end()) { - val = (*it).second; - } else { - val = Tag::NULL_VAR; - } - } - - Vars::iterator it = vars.find(funcBlock->command.arguments[i]); - if (it != vars.end()) { - paramCache.push_back((*it).second); - (*it).second = val; - } else { - if (val != Tag::NULL_VAR) { - vars.insert(Vars::value_type(funcBlock->command.arguments[i], val)); - } - - paramCache.push_back(Tag::NULL_VAR); - } - } - - generateTree(dst, funcBlock, vars); - - for (int i = 1; i < nbParams; i++) { - if (paramCache[i] == Tag::NULL_VAR) { - vars.erase(funcBlock->command.arguments[i]); - } else { - vars[funcBlock->command.arguments[i]] = paramCache[i]; - } - } - } - } - branch = block; - return 1; - } - break; - case Command::IFBLOCK: { - // ok, go through the branches and pick the first one that goes - for (auto child: block->blocks) { - int numPasses = evalBlockGeneration(dst, child, vars, branch); - if (numPasses > 0) { - return numPasses; - } - } - } - break; - case Command::IF: - case Command::ELIF: { - if (!block->command.arguments.empty()) { - // Just one argument means check for the var beeing defined - if (block->command.arguments.size() == 1) { - Vars::iterator it = vars.find(block->command.arguments.front()); - if (it != vars.end()) { - branch = block; - return 1; - } - } else if (block->command.arguments.size() == 2) { - if (block->command.arguments[0].compare("not") == 0) { - Vars::iterator it = vars.find(block->command.arguments[1]); - if (it == vars.end()) { - branch = block; - return 1; - } - } - } else if (block->command.arguments.size() == 3) { - if (block->command.arguments[1].compare("and") == 0) { - Vars::iterator itL = vars.find(block->command.arguments[0]); - Vars::iterator itR = vars.find(block->command.arguments[2]); - if ((itL != vars.end()) && (itR != vars.end())) { - branch = block; - return 1; - } - } else if (block->command.arguments[1].compare("or") == 0) { - Vars::iterator itL = vars.find(block->command.arguments[0]); - Vars::iterator itR = vars.find(block->command.arguments[2]); - if ((itL != vars.end()) || (itR != vars.end())) { - branch = block; - return 1; - } - } else if (block->command.arguments[1].compare("==") == 0) { - Vars::iterator itL = vars.find(block->command.arguments[0]); - if (itL != vars.end()) { - if ((*itL).second.compare(block->command.arguments[2]) == 0) { - branch = block; - return 1; - } - } - } - } - - } - return 0; - } - break; - case Command::ELSE: { - branch = block; - return 1; - } - break; - case Command::ENDIF: { - branch = block; - return 1; - } - break; - case Command::DEF: { - if (block->command.arguments.size()) { - // THe actual value of the var defined sneeds to be evaluated: - String val; - for (unsigned int t = 1; t < block->command.arguments.size(); t++) { - // detect if a param is a var - auto len = block->command.arguments[t].length(); - if ((block->command.arguments[t][0] == Tag::VAR) - && (block->command.arguments[t][len - 1] == Tag::VAR)) { - String var = block->command.arguments[t].substr(1, len - 2); - Vars::iterator it = vars.find(var); - if (it != vars.end()) { - val += (*it).second; - } - } else { - val += block->command.arguments[t]; - } - } - - Vars::iterator it = vars.find(block->command.arguments.front()); - if (it == vars.end()) { - vars.insert(Vars::value_type(block->command.arguments.front(), val)); - } else { - (*it).second = val; - } - - branch = block; - return 1; - } else { - branch = block; - return 0; - } - } - break; - - case Command::INCLUDE: { - TextTemplatePointer include = _config->findInclude(block->command.arguments.front().c_str()); - if (include && !include->_root->blocks.empty()) { - if (include->_root) { - generateTree(dst, include->_root, vars); - } - } - - branch = block; - return 1; - } - break; - - case Command::FUNC: { - branch = block; - return 1; - } - break; - - case Command::ENDFUNC: { - branch = block; - return 1; - } - break; - - default: { - } - } - - return 0; -} - - -int TextTemplate::parse(std::istream& src) { - _root->command.type = Command::BLOCK; - BlockPointer currentBlock = _root; - _numErrors = 0; - - // First Parse the input file - int nbLoops = 0; - bool goOn = true; - Tag::Type tagType = Tag::INVALID; - Tag::Type nextTagType = Tag::INVALID; - while (goOn) { - std::string data; - std::string tag; - if (stepForward(&src, data, tag, tagType, nextTagType)) { - currentBlock = processStep(currentBlock, data, tag, tagType); - } else { - goOn = false; - } - - tagType = nextTagType; - nbLoops++; - } - - return _numErrors; -} - -int TextTemplate::generate(std::ostream& dst, Vars& vars) { - return generateTree(dst, _root, vars); -} - -void TextTemplate::displayTree(std::ostream& dst, int& level) const { - Block::displayTree(_root, dst, level); -} - -void TextTemplate::Block::displayTree(const BlockPointer& block, std::ostream& dst, int& level) { - String tab(level * 2, ' '); - - const String BLOCK_TYPE_NAMES[] = { - "VAR", - "BLOCK", - "FUNC", - "ENDFUNC", - "IFBLOCK", - "IF", - "ELIF", - "ELSE", - "ENDIF", - "FOR", - "ENDFOR", - "INCLUDE", - "DEF" - }; - - dst << tab << "{ " << BLOCK_TYPE_NAMES[block->command.type] << ":"; - if (!block->command.arguments.empty()) { - for (auto arg: block->command.arguments) { - dst << " " << arg; - } - } - dst << std::endl; - - level++; - for (auto sub: block->blocks) { - displayTree(sub, dst, level); - } - level--; - - dst << tab << "}" << std::endl; -} - -void TextTemplate::Config::displayTree(std::ostream& dst, int& level) const { - String tab(level * 2, ' '); - - level++; - dst << tab << "Includes:" << std::endl; - for (auto inc: _includes) { - dst << tab << tab << inc.first << std::endl; - inc.second->displayTree(dst, level); - } - dst << tab << "Funcs:" << std::endl; - for (auto func: _funcs._funcs) { - dst << tab << tab << func.first << std::endl; - TextTemplate::Block::displayTree( func.second, dst, level); - } - level--; -} - -void TextTemplate::Config::displayMakefileDeps(std::ostream& dst) const { - for (const auto& include : _includeFullPaths) { - std::cout << include << std::endl; - } -} diff --git a/tools/scribe/src/TextTemplate.h b/tools/scribe/src/TextTemplate.h deleted file mode 100755 index b3b767176c..0000000000 --- a/tools/scribe/src/TextTemplate.h +++ /dev/null @@ -1,213 +0,0 @@ - -// -// TextTemplate.cpp -// tools/shaderScribe/src -// -// Created by Sam Gateau on 12/15/2014. -// Copyright 2013 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -#ifndef hifi_TEXT_TEMPLATE_H -#define hifi_TEXT_TEMPLATE_H - -#include -#include -#include -#include -#include -#include -#include -#include - -class TextTemplate { -public: - typedef std::shared_ptr< TextTemplate > Pointer; - typedef std::string String; - typedef std::vector< String > StringVector; - typedef std::map< String, String > Vars; - typedef std::map< String, TextTemplate::Pointer > Includes; - using PathSet = std::unordered_set; - - class Tag { - public: - enum Type { - VARIABLE = 0, - COMMAND, - REMARK, - INVALID = -1, - }; - - static const char BEGIN = '<'; - static const char END = '>'; - - static const char VAR = '$'; - static const char COM = '@'; - static const char REM = '!'; - - static const std::string NULL_VAR; - }; - - class Command { - public: - typedef std::vector< Command > vector; - - enum Type { - VAR = 0, - BLOCK, - FUNC, - ENDFUNC, - IFBLOCK, - IF, - ELIF, - ELSE, - ENDIF, - FOR, - ENDFOR, - INCLUDE, - DEF, - }; - - Type type; - std::vector< String > arguments; - - bool isBlockEnd() { - switch (type) { - case ENDFUNC: - case ENDIF: - case ENDFOR: - case INCLUDE: - case DEF: - case VAR: - return true; - default: - return false; - } - } - }; - - class Block { - public: - typedef std::shared_ptr Pointer; - typedef std::vector< Block::Pointer > Vector; - - Block::Pointer parent; - Command command; - Vector blocks; - std::stringstream ostr; - - String sourceName; - - Block(const String& sourceFilename) : - sourceName(sourceFilename) {} - - static void addNewBlock(const Block::Pointer& parent, const Block::Pointer& block); - static const Block::Pointer& getCurrentBlock(const Block::Pointer& block); - - static void displayTree(const Block::Pointer& block, std::ostream& dst, int& level); - }; - - class Funcs { - public: - typedef std::map< String, Block::Pointer > map; - - Funcs(); - ~Funcs(); - - const Block::Pointer findFunc(const char* func); - const Block::Pointer addFunc(const char* func, const Block::Pointer& root); - - map _funcs; - protected: - }; - - class Config { - public: - typedef std::shared_ptr< Config > Pointer; - typedef bool (*IncluderCallback) (const Config::Pointer& config, const char* filename, String& source); - PathSet _includeFullPaths; - Includes _includes; - Funcs _funcs; - std::ostream* _logStream; - int _numErrors; - IncluderCallback _includerCallback; - StringVector _paths; - - Config(); - - static const TextTemplate::Pointer addInclude(const Config::Pointer& config, const char* include); - const TextTemplate::Pointer findInclude(const char* include); - - void addIncludePath(const char* path); - - void displayTree(std::ostream& dst, int& level) const; - - void displayMakefileDeps(std::ostream& dst) const; - }; - - static bool loadFile(const Config::Pointer& config, const char* filename, String& source); - - TextTemplate(const String& name, const Config::Pointer& config = std::make_shared()); - ~TextTemplate(); - - // Scibe does all the job of parsing an inout template stream and then gneerating theresulting stream using the vars - int scribe(std::ostream& dst, std::istream& src, Vars& vars); - - int parse(std::istream& src); - int generate(std::ostream& dst, Vars& vars); - - const Config::Pointer config() { return _config; } - - void displayTree(std::ostream& dst, int& level) const; - - void displayMakefileDeps(std::ostream& dst) const { _config->displayMakefileDeps(dst); } - -protected: - Config::Pointer _config; - Block::Pointer _root; - PathSet _includeFullPaths; - int _numErrors; - bool _steppingStarted; - - bool grabUntilBeginTag(std::istream* str, String& grabbed, Tag::Type& tagType); - bool grabUntilEndTag(std::istream* str, String& grabbed, Tag::Type& tagType); - - bool stepForward(std::istream* str, String& grabbed, String& tag, Tag::Type& tagType, Tag::Type& nextTagType); - - bool grabFirstToken(String& src, String& token, String& reminder); - bool convertExpressionToArguments(String& src, std::vector< String >& arguments); - bool convertExpressionToDefArguments(String& src, std::vector< String >& arguments); - bool convertExpressionToFuncArguments(String& src, std::vector< String >& arguments); - - // Filter between var, command or comments - const Block::Pointer processStep(const Block::Pointer& block, String& grabbed, String& tag, Tag::Type& tagType); - const Block::Pointer processStepVar(const Block::Pointer& block, String& grabbed, String& tag); - const Block::Pointer processStepCommand(const Block::Pointer& block, String& grabbed, String& tag); - const Block::Pointer processStepRemark(const Block::Pointer& block, String& grabbed, String& tag); - - // Define command - const Block::Pointer processStepDef(const Block::Pointer& block, String& grabbed, String& tag); - - // If commands - const Block::Pointer processStepCommandIf(const Block::Pointer& block, String& grabbed, String& expression); - const Block::Pointer processStepCommandEndIf(const Block::Pointer& block, String& grabbed, String& expression); - const Block::Pointer processStepCommandElif(const Block::Pointer& block, String& grabbed, String& expression); - const Block::Pointer processStepCommandElse(const Block::Pointer& block, String& grabbed, String& expression); - - // Include command - const Block::Pointer processStepInclude(const Block::Pointer& block, String& grabbed, String& tag); - - // Function command - const Block::Pointer processStepFunc(const Block::Pointer& block, String& grabbed, String& tag); - const Block::Pointer processStepEndFunc(const Block::Pointer& block, String& grabbed, String& tag); - - // Generation - int generateTree(std::ostream& dst, const Block::Pointer& block, Vars& vars); - int evalBlockGeneration(std::ostream& dst, const Block::Pointer& block, Vars& vars, Block::Pointer& branch); - - // Errors - std::ostream& log() { return (* _config->_logStream); } - void logError(const Block::Pointer& block, const char* error, ...); -}; - -#endif diff --git a/tools/scribe/src/main.cpp b/tools/scribe/src/main.cpp deleted file mode 100755 index c1ade05bb1..0000000000 --- a/tools/scribe/src/main.cpp +++ /dev/null @@ -1,400 +0,0 @@ -// -// main.cpp -// tools/shaderScribe/src -// -// Created by Sam Gateau on 12/15/2014. -// Copyright 2013 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html - - -#include "TextTemplate.h" - -#include -#include -#include -#include - -using namespace std; - -int main (int argc, char** argv) { - // process the command line arguments - std::vector< std::string > inputs; - - std::string srcFilename; - std::string destFilename; - std::string targetName; - std::list headerFiles; - TextTemplate::Vars vars; - - std::string lastVarName; - bool listVars = false; - bool makefileDeps = false; - bool showParseTree = false; - bool makeCPlusPlus = false; - - auto config = std::make_shared(); - - enum Mode { - READY = 0, - GRAB_OUTPUT, - GRAB_VAR_NAME, - GRAB_VAR_VALUE, - GRAB_INCLUDE_PATH, - GRAB_TARGET_NAME, - GRAB_SHADER_TYPE, - GRAB_HEADER, - EXIT, - } mode = READY; - - enum Type { - VERTEX = 0, - FRAGMENT, - GEOMETRY, - } type = VERTEX; - static const char* shaderTypeString[] = { - "VERTEX", "PIXEL", "GEOMETRY" - }; - static const char* shaderCreateString[] = { - "Vertex", "Pixel", "Geometry" - }; - std::string shaderStage{ "vert" }; - - for (int ii = 1; (mode != EXIT) && (ii < argc); ii++) { - inputs.push_back(argv[ii]); - - switch (mode) { - case READY: { - if (inputs.back() == "-o") { - mode = GRAB_OUTPUT; - } else if (inputs.back() == "-H") { - mode = GRAB_HEADER; - } else if (inputs.back() == "-t") { - mode = GRAB_TARGET_NAME; - } else if (inputs.back() == "-D") { - mode = GRAB_VAR_NAME; - } else if (inputs.back() == "-I") { - mode = GRAB_INCLUDE_PATH; - } else if (inputs.back() == "-listVars") { - listVars = true; - mode = READY; - } else if (inputs.back() == "-M") { - makefileDeps = true; - mode = READY; - } else if (inputs.back() == "-showParseTree") { - showParseTree = true; - mode = READY; - } else if (inputs.back() == "-c++") { - makeCPlusPlus = true; - mode = READY; - } else if (inputs.back() == "-T") { - mode = GRAB_SHADER_TYPE; - } else { - // just grabbed the source filename, stop parameter parsing - srcFilename = inputs.back(); - mode = READY; - } - } - break; - - case GRAB_OUTPUT: { - destFilename = inputs.back(); - mode = READY; - } - break; - - case GRAB_TARGET_NAME: { - targetName = inputs.back(); - mode = READY; - } - break; - - case GRAB_HEADER: { - headerFiles.push_back(inputs.back()); - mode = READY; - } - break; - - case GRAB_VAR_NAME: { - // grab first the name of the var - lastVarName = inputs.back(); - mode = GRAB_VAR_VALUE; - } - break; - case GRAB_VAR_VALUE: { - // and then the value - vars.insert(TextTemplate::Vars::value_type(lastVarName, inputs.back())); - - mode = READY; - } - break; - - case GRAB_INCLUDE_PATH: { - config->addIncludePath(inputs.back().c_str()); - mode = READY; - } - break; - - case GRAB_SHADER_TYPE: - { - if (inputs.back() == "frag") { - shaderStage = inputs.back(); - type = FRAGMENT; - } else if (inputs.back() == "geom") { - shaderStage = inputs.back(); - type = GEOMETRY; - } else if (inputs.back() == "vert") { - shaderStage = inputs.back(); - type = VERTEX; - } else { - cerr << "Unrecognized shader type. Supported is vert, frag or geom" << endl; - } - mode = READY; - } - break; - - case EXIT: { - // THis shouldn't happen - } - break; - } - } - - if (srcFilename.empty()) { - cerr << "Usage: shaderScribe [OPTION]... inputFilename" << endl; - cerr << "Where options include:" << endl; - cerr << " -o filename: Send output to filename rather than standard output." << endl; - cerr << " -t targetName: Set the targetName used, if not defined use the output filename 'name' and if not defined use the inputFilename 'name'" << endl; - cerr << " -I include_directory: Declare a directory to be added to the includes search pool." << endl; - cerr << " -D varname varvalue: Declare a var used to generate the output file." << endl; - cerr << " varname and varvalue must be made of alpha numerical characters with no spaces." << endl; - cerr << " -H : Prepend the contents of header file to the scribe output " << endl; - cerr << " This can be specified multiple times and the headers will be applied in the specified order" << endl; - cerr << " -M : Emit a list of files that the scribe output depends on, for make and similar build tools " << endl; - cerr << " -listVars : Will list the vars name and value in the standard output." << endl; - cerr << " -showParseTree : Draw the tree obtained while parsing the source" << endl; - cerr << " -c++ : Generate a c++ source file containing the output file stream stored as a char[] variable" << endl; - cerr << " -T vert/frag/geom : define the type of the shader. Defaults to VERTEX if not specified." << endl; - cerr << " This is necessary if the -c++ option is used." << endl; - return 0; - } - - // Define targetName: if none, get destFilename, if none get srcFilename - if (targetName.empty()) { - if (destFilename.empty()) { - targetName = srcFilename; - } else { - targetName = destFilename; - } - } - // no clean it to have just a descent c var name - if (!targetName.empty()) { - // trim anything before '/' or '\' - targetName = targetName.substr(targetName.find_last_of('/') + 1); - targetName = targetName.substr(targetName.find_last_of('\\') + 1); - - // trim anything after '.' - targetName = targetName.substr(0, targetName.find_first_of('.')); - } - - // Add built in vars - time_t endTime = chrono::system_clock::to_time_t(chrono::system_clock::now()); - std::string endTimStr(ctime(&endTime)); - vars["_SCRIBE_DATE"] = endTimStr.substr(0, endTimStr.length() - 1); - - // List vars? - if (listVars) { - cerr << "Vars:" << endl; - for (auto v : vars) { - cerr << " " << v.first << " = " << v.second << endl; - } - } - - // Open up source - std::fstream srcStream; - srcStream.open(srcFilename, std::fstream::in); - if (!srcStream.is_open()) { - cerr << "Failed to open source file <" << srcFilename << ">" << endl; - return 1; - } - - auto scribe = std::make_shared(srcFilename, config); - - std::string header; - if (!headerFiles.empty()) { - for (const auto& headerFile : headerFiles) { - std::fstream headerStream; - headerStream.open(headerFile, std::fstream::in); - if (!headerStream.is_open()) { - cerr << "Failed to open source file <" << headerFile << ">" << endl; - return 1; - } - header += std::string((std::istreambuf_iterator(headerStream)), std::istreambuf_iterator()); - } - } - - // Add the type define to the shader - switch (type) { - case VERTEX: - header += "#define GPU_VERTEX_SHADER\n"; - break; - - case FRAGMENT: - header += "#define GPU_PIXEL_SHADER\n"; - break; - - case GEOMETRY: - header += "#define GPU_GEOMETRY_SHADER\n"; - break; - } - - // ready to parse and generate - std::stringstream destStringStream; - destStringStream << header; - int numErrors = scribe->scribe(destStringStream, srcStream, vars); - if (numErrors) { - cerr << "Scribe " << srcFilename << "> failed: " << numErrors << " errors." << endl; - return 1; - }; - - - if (showParseTree) { - int level = 1; - cerr << "Config trees:" << std::endl; - config->displayTree(cerr, level); - - cerr << srcFilename << " tree:" << std::endl; - scribe->displayTree(cerr, level); - } - - if (makefileDeps) { - scribe->displayMakefileDeps(cout); - } else if (makeCPlusPlus) { - // Because there is a maximum size for literal strings declared in source we need to partition the - // full source string stream into pages that seems to be around that value... - const int MAX_STRING_LITERAL = 10000; - std::string lineToken; - auto pageSize = lineToken.length(); - std::vector> pages(1, std::make_shared()); - while (!destStringStream.eof()) { - std::getline(destStringStream, lineToken); - auto lineSize = lineToken.length() + 1; - - if (pageSize + lineSize > MAX_STRING_LITERAL) { - pages.push_back(std::make_shared()); - // reset pageStringStream - pageSize = 0; - } - - (*pages.back()) << lineToken << std::endl; - pageSize += lineSize; - } - - std::stringstream headerStringStream; - std::stringstream sourceStringStream; - std::string headerFileName = destFilename + ".h"; - std::string sourceFileName = destFilename + ".cpp"; - - sourceStringStream << "// File generated by Scribe " << vars["_SCRIBE_DATE"] << std::endl; - - // Write header file - headerStringStream << "#ifndef " << targetName << "_h" << std::endl; - headerStringStream << "#define " << targetName << "_h\n" << std::endl; - headerStringStream << "#include \n" << std::endl; - headerStringStream << "class " << targetName << " {" << std::endl; - headerStringStream << "public:" << std::endl; - headerStringStream << "\tstatic gpu::Shader::Type getType() { return gpu::Shader::" << shaderTypeString[type] << "; }" << std::endl; - headerStringStream << "\tstatic const std::string& getSource() { return _source; }" << std::endl; - headerStringStream << "\tstatic gpu::ShaderPointer getShader();" << std::endl; - headerStringStream << "private:" << std::endl; - headerStringStream << "\tstatic const std::string _source;" << std::endl; - headerStringStream << "\tstatic gpu::ShaderPointer _shader;" << std::endl; - headerStringStream << "};\n" << std::endl; - headerStringStream << "#endif // " << targetName << "_h" << std::endl; - - bool mustOutputHeader = destFilename.empty(); - // Compare with existing file - { - std::fstream headerFile; - headerFile.open(headerFileName, std::fstream::in); - if (headerFile.is_open()) { - // Skip first line - std::string line; - std::stringstream previousHeaderStringStream; - std::getline(headerFile, line); - - previousHeaderStringStream << headerFile.rdbuf(); - mustOutputHeader = mustOutputHeader || previousHeaderStringStream.str() != headerStringStream.str(); - } else { - mustOutputHeader = true; - } - } - - if (mustOutputHeader) { - if (!destFilename.empty()) { - // File content has changed so write it - std::fstream headerFile; - headerFile.open(headerFileName, std::fstream::out); - if (headerFile.is_open()) { - // First line contains the date of modification - headerFile << sourceStringStream.str(); - headerFile << headerStringStream.str(); - } else { - cerr << "Scribe output file <" << headerFileName << "> failed to open." << endl; - return 1; - } - } else { - cerr << sourceStringStream.str(); - cerr << headerStringStream.str(); - } - } - - // Write source file - sourceStringStream << "#include \"" << targetName << ".h\"\n" << std::endl; - sourceStringStream << "gpu::ShaderPointer " << targetName << "::_shader;" << std::endl; - sourceStringStream << "const std::string " << targetName << "::_source = std::string()"; - // Write the pages content - for (auto page : pages) { - sourceStringStream << "+ std::string(R\"SCRIBE(\n" << page->str() << "\n)SCRIBE\")\n"; - } - sourceStringStream << ";\n" << std::endl << std::endl; - - sourceStringStream << "gpu::ShaderPointer " << targetName << "::getShader() {" << std::endl; - sourceStringStream << "\tif (_shader==nullptr) {" << std::endl; - sourceStringStream << "\t\t_shader = gpu::Shader::create" << shaderCreateString[type] << "(std::string(_source));" << std::endl; - sourceStringStream << "\t}" << std::endl; - sourceStringStream << "\treturn _shader;" << std::endl; - sourceStringStream << "}\n" << std::endl; - - // Destination stream - if (!destFilename.empty()) { - std::fstream sourceFile; - sourceFile.open(sourceFileName, std::fstream::out); - if (!sourceFile.is_open()) { - cerr << "Scribe output file <" << sourceFileName << "> failed to open." << endl; - return 1; - } - sourceFile << sourceStringStream.str(); - } else { - cerr << sourceStringStream.str(); - } - } else { - // Destination stream - if (!destFilename.empty()) { - std::fstream destFileStream; - destFileStream.open(destFilename, std::fstream::out); - if (!destFileStream.is_open()) { - cerr << "Scribe output file <" << destFilename << "> failed to open." << endl; - return 1; - } - - destFileStream << destStringStream.str(); - } else { - cerr << destStringStream.str(); - } - } - - return 0; - -} diff --git a/tools/shadergen.py b/tools/shadergen.py index 7450aebcb3..ffbe1662ec 100644 --- a/tools/shadergen.py +++ b/tools/shadergen.py @@ -39,7 +39,7 @@ def getTypeForScribeFile(scribefilename): return switcher.get(extension) def getCommonScribeArgs(scribefile, includeLibs): - scribeArgs = [args.scribe] + scribeArgs = [os.path.join(args.tools_dir, 'scribe')] # FIXME use the sys.platform to set the correct value scribeArgs.extend(['-D', 'GLPROFILE', 'PC_GL']) scribeArgs.extend(['-T', getTypeForScribeFile(scribefile)]) @@ -133,9 +133,9 @@ folderMutex = Lock() def processCommand(line): global args global scribeDepCache - glslangExec = args.spirv_binaries + '/glslangValidator' - spirvCrossExec = args.spirv_binaries + '/spirv-cross' - spirvOptExec = args.spirv_binaries + '/spirv-opt' + glslangExec = args.tools_dir + '/glslangValidator' + spirvCrossExec = args.tools_dir + '/spirv-cross' + spirvOptExec = args.tools_dir + '/spirv-opt' params = line.split(';') dialect = params.pop(0) variant = params.pop(0) @@ -170,11 +170,8 @@ def processCommand(line): scribeDepCache.gen(scribeFile, libs, dialect, variant) scribeArgs = getCommonScribeArgs(scribeFile, libs) - headerFlag = '-H' - # using the old flag on Android builds for now - if (dialect == '310es'): headerFlag = '-h' for header in getDialectAndVariantHeaders(dialect, variant): - scribeArgs.extend([headerFlag, header]) + scribeArgs.extend(['-H', header]) scribeArgs.extend(['-o', unoptGlslFile]) executeSubprocess(scribeArgs) @@ -222,10 +219,9 @@ def main(): parser = ArgumentParser(description='Generate shader artifacts.') parser.add_argument('--commands', type=argparse.FileType('r'), help='list of commands to execute') -parser.add_argument('--spirv-binaries', type=str, help='location of the SPIRV binaries') +parser.add_argument('--tools-dir', type=str, help='location of the host compatible binaries') parser.add_argument('--build-dir', type=str, help='The build directory base path') parser.add_argument('--source-dir', type=str, help='The root directory of the git repository') -parser.add_argument('--scribe', type=str, help='The scribe executable path') parser.add_argument('--debug', action='store_true') parser.add_argument('--force', action='store_true', help='Ignore timestamps and force regeneration of all files') parser.add_argument('--dry-run', action='store_true', help='Report the files that would be process, but do not output') @@ -233,18 +229,16 @@ parser.add_argument('--dry-run', action='store_true', help='Report the files tha args = None if len(sys.argv) == 1: # for debugging - spirvPath = os.environ['VULKAN_SDK'] + '/bin' - #spirvPath = expanduser('~//VulkanSDK/1.1.82.1/x86_64/bin') sourceDir = expanduser('~/git/hifi') - buildPath = sourceDir + '/build_noui' - scribePath = buildPath + '/tools/scribe/Release/scribe' + toolsDir = os.path.join(expanduser('~/git/vcpkg'), 'installed', 'x64-windows', 'tools') + buildPath = sourceDir + '/build' commandsPath = buildPath + '/libraries/shaders/shadergen.txt' shaderDir = buildPath + '/libraries/shaders' - testArgs = '--commands {} --spirv-binaries {} --scribe {} --build-dir {} --source-dir {}'.format( - commandsPath, spirvPath, scribePath, shaderDir, sourceDir + testArgs = '--commands {} --tools-dir {} --build-dir {} --source-dir {}'.format( + commandsPath, toolsDir, shaderDir, sourceDir ).split() - #testArgs.append('--debug') - #testArgs.append('--force') + testArgs.append('--debug') + testArgs.append('--force') #testArgs.append('--dry-run') args = parser.parse_args(testArgs) else: