mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-25 21:35:04 +02:00
Merge branch 'master' of https://github.com/highfidelity/hifi into black
This commit is contained in:
commit
dbeb4e9b27
28 changed files with 569 additions and 429 deletions
309
CMakeLists.txt
309
CMakeLists.txt
|
@ -4,254 +4,81 @@ else()
|
||||||
cmake_minimum_required(VERSION 3.2)
|
cmake_minimum_required(VERSION 3.2)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (USE_ANDROID_TOOLCHAIN)
|
include("cmake/init.cmake")
|
||||||
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/android/android.toolchain.cmake")
|
|
||||||
set(ANDROID_NATIVE_API_LEVEL 19)
|
|
||||||
set(ANDROID_TOOLCHAIN_NAME arm-linux-androideabi-clang3.5)
|
|
||||||
set(ANDROID_STL c++_shared)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
cmake_policy(SET CMP0020 NEW)
|
|
||||||
endif (WIN32)
|
|
||||||
|
|
||||||
if (POLICY CMP0043)
|
|
||||||
cmake_policy(SET CMP0043 OLD)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (POLICY CMP0042)
|
|
||||||
cmake_policy(SET CMP0042 OLD)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
|
||||||
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMakeTargets")
|
|
||||||
|
|
||||||
project(hifi)
|
project(hifi)
|
||||||
add_definitions(-DGLM_FORCE_RADIANS)
|
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")
|
|
||||||
|
|
||||||
find_package( Threads )
|
include("cmake/compiler.cmake")
|
||||||
|
|
||||||
if (WIN32)
|
if (NOT DEFINED SERVER_ONLY)
|
||||||
if (NOT "${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
|
set(SERVER_ONLY 0)
|
||||||
message( FATAL_ERROR "Only 64 bit builds supported." )
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_definitions(-DNOMINMAX -D_CRT_SECURE_NO_WARNINGS)
|
|
||||||
|
|
||||||
if (NOT WINDOW_SDK_PATH)
|
|
||||||
set(DEBUG_DISCOVERED_SDK_PATH TRUE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# sets path for Microsoft SDKs
|
|
||||||
# if you get build error about missing 'glu32' this path is likely wrong
|
|
||||||
if (MSVC_VERSION GREATER_EQUAL 1910) # VS 2017
|
|
||||||
set(WINDOW_SDK_PATH "C:/Program Files (x86)/Windows Kits/10/Lib/${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}/x64" CACHE PATH "Windows SDK PATH")
|
|
||||||
elseif (MSVC_VERSION GREATER_EQUAL 1800) # VS 2013
|
|
||||||
set(WINDOW_SDK_PATH "C:\\Program Files (x86)\\Windows Kits\\8.1\\Lib\\winv6.3\\um\\${WINDOW_SDK_FOLDER}" CACHE PATH "Windows SDK PATH")
|
|
||||||
else()
|
|
||||||
message( FATAL_ERROR "Visual Studio 2013 or higher required." )
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (DEBUG_DISCOVERED_SDK_PATH)
|
|
||||||
message(STATUS "The discovered Windows SDK path is ${WINDOW_SDK_PATH}")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${WINDOW_SDK_PATH})
|
|
||||||
# /wd4351 disables warning C4351: new behavior: elements of array will be default initialized
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /wd4351")
|
|
||||||
# /LARGEADDRESSAWARE enables 32-bit apps to use more than 2GB of memory.
|
|
||||||
# Caveats: http://stackoverflow.com/questions/2288728/drawbacks-of-using-largeaddressaware-for-32-bit-windows-executables
|
|
||||||
# TODO: Remove when building 64-bit.
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE")
|
|
||||||
# always produce symbols as PDB files
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG /OPT:REF /OPT:ICF")
|
|
||||||
else ()
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -fno-strict-aliasing -Wno-unused-parameter")
|
|
||||||
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb -Woverloaded-virtual -Wdouble-promotion")
|
|
||||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "5.1") # gcc 5.1 and on have suggest-override
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsuggest-override")
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
endif(WIN32)
|
|
||||||
|
|
||||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
|
||||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.3")
|
|
||||||
# GLM 0.9.8 on Ubuntu 14 (gcc 4.4) has issues with the simd declarations
|
|
||||||
add_definitions(-DGLM_FORCE_PURE)
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT ANDROID)
|
if (ANDROID OR UWP)
|
||||||
if ((NOT MSVC12) AND (NOT MSVC14))
|
set(MOBILE 1)
|
||||||
include(CheckCXXCompilerFlag)
|
else()
|
||||||
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
|
set(MOBILE 0)
|
||||||
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
|
|
||||||
|
|
||||||
if (COMPILER_SUPPORTS_CXX11)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
|
||||||
elseif(COMPILER_SUPPORTS_CXX0X)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
|
|
||||||
else()
|
|
||||||
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
|
|
||||||
endif()
|
|
||||||
endif ()
|
|
||||||
else ()
|
|
||||||
# assume that the toolchain selected for android has C++11 support
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (APPLE)
|
|
||||||
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++11")
|
|
||||||
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --stdlib=libc++")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (NOT ANDROID_LIB_DIR)
|
|
||||||
set(ANDROID_LIB_DIR $ENV{ANDROID_LIB_DIR})
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (ANDROID)
|
|
||||||
if (NOT ANDROID_QT_CMAKE_PREFIX_PATH)
|
|
||||||
set(QT_CMAKE_PREFIX_PATH ${ANDROID_LIB_DIR}/Qt/5.5/android_armv7/lib/cmake)
|
|
||||||
else ()
|
|
||||||
set(QT_CMAKE_PREFIX_PATH ${ANDROID_QT_CMAKE_PREFIX_PATH})
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
||||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib)
|
|
||||||
|
|
||||||
if (ANDROID_LIB_DIR)
|
|
||||||
list(APPEND CMAKE_FIND_ROOT_PATH ${ANDROID_LIB_DIR})
|
|
||||||
endif ()
|
|
||||||
else ()
|
|
||||||
if (NOT QT_CMAKE_PREFIX_PATH)
|
|
||||||
set(QT_CMAKE_PREFIX_PATH $ENV{QT_CMAKE_PREFIX_PATH})
|
|
||||||
endif ()
|
|
||||||
if (NOT QT_CMAKE_PREFIX_PATH)
|
|
||||||
get_filename_component(QT_CMAKE_PREFIX_PATH "${Qt5_DIR}/.." REALPATH)
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set(QT_DIR $ENV{QT_DIR})
|
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
if (NOT EXISTS ${QT_CMAKE_PREFIX_PATH})
|
|
||||||
message(FATAL_ERROR "Could not determine QT_CMAKE_PREFIX_PATH.")
|
|
||||||
endif ()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# figure out where the qt dir is
|
if (ANDROID OR UWP)
|
||||||
get_filename_component(QT_DIR "${QT_CMAKE_PREFIX_PATH}/../../" ABSOLUTE)
|
option(BUILD_SERVER "Build server components" OFF)
|
||||||
|
option(BUILD_TOOLS "Build tools" OFF)
|
||||||
|
else()
|
||||||
|
option(BUILD_SERVER "Build server components" ON)
|
||||||
|
option(BUILD_TOOLS "Build tools" ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${QT_CMAKE_PREFIX_PATH})
|
if (SERVER_ONLY)
|
||||||
|
option(BUILD_CLIENT "Build client components" OFF)
|
||||||
|
option(BUILD_TESTS "Build tests" OFF)
|
||||||
|
else()
|
||||||
|
option(BUILD_CLIENT "Build client components" ON)
|
||||||
|
option(BUILD_TESTS "Build tests" ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (APPLE)
|
option(BUILD_INSTALLER "Build installer" ON)
|
||||||
|
|
||||||
exec_program(sw_vers ARGS -productVersion OUTPUT_VARIABLE OSX_VERSION)
|
MESSAGE(STATUS "Build server: " ${BUILD_SERVER})
|
||||||
string(REGEX MATCH "^[0-9]+\\.[0-9]+" OSX_VERSION ${OSX_VERSION})
|
MESSAGE(STATUS "Build client: " ${BUILD_CLIENT})
|
||||||
message(STATUS "Detected OS X version = ${OSX_VERSION}")
|
MESSAGE(STATUS "Build tests: " ${BUILD_TESTS})
|
||||||
|
MESSAGE(STATUS "Build tools: " ${BUILD_TOOLS})
|
||||||
|
MESSAGE(STATUS "Build installer: " ${BUILD_INSTALLER})
|
||||||
|
|
||||||
set(OSX_SDK "${OSX_VERSION}" CACHE String "OS X SDK version to look for inside Xcode bundle or at OSX_SDK_PATH")
|
if (UNIX AND DEFINED ENV{HIFI_MEMORY_DEBUGGING})
|
||||||
|
MESSAGE(STATUS "Memory debugging is enabled")
|
||||||
|
endif()
|
||||||
|
|
||||||
# set our OS X deployment target
|
#
|
||||||
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.8)
|
# Helper projects
|
||||||
|
#
|
||||||
# find the SDK path for the desired SDK
|
file(GLOB_RECURSE CMAKE_SRC cmake/*.cmake cmake/CMakeLists.txt)
|
||||||
find_path(
|
add_custom_target(cmake SOURCES ${CMAKE_SRC})
|
||||||
_OSX_DESIRED_SDK_PATH
|
GroupSources("cmake")
|
||||||
NAME MacOSX${OSX_SDK}.sdk
|
|
||||||
HINTS ${OSX_SDK_PATH}
|
|
||||||
PATHS /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
|
|
||||||
/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
|
|
||||||
)
|
|
||||||
|
|
||||||
if (NOT _OSX_DESIRED_SDK_PATH)
|
|
||||||
message(STATUS "Could not find OS X ${OSX_SDK} SDK. Will fall back to default. If you want a specific SDK, please pass OSX_SDK and optionally OSX_SDK_PATH to CMake.")
|
|
||||||
else ()
|
|
||||||
message(STATUS "Found OS X ${OSX_SDK} SDK at ${_OSX_DESIRED_SDK_PATH}/MacOSX${OSX_SDK}.sdk")
|
|
||||||
|
|
||||||
# set that as the SDK to use
|
|
||||||
set(CMAKE_OSX_SYSROOT ${_OSX_DESIRED_SDK_PATH}/MacOSX${OSX_SDK}.sdk)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
# Hide automoc folders (for IDEs)
|
|
||||||
set(AUTOGEN_TARGETS_FOLDER "hidden/generated")
|
|
||||||
|
|
||||||
# Find includes in corresponding build directories
|
|
||||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
|
||||||
# Instruct CMake to run moc automatically when needed.
|
|
||||||
set(CMAKE_AUTOMOC ON)
|
|
||||||
# Instruct CMake to run rcc automatically when needed
|
|
||||||
set(CMAKE_AUTORCC ON)
|
|
||||||
|
|
||||||
set(HIFI_LIBRARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libraries")
|
|
||||||
|
|
||||||
# setup for find modules
|
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/")
|
|
||||||
|
|
||||||
if (CMAKE_BUILD_TYPE)
|
|
||||||
string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_CMAKE_BUILD_TYPE)
|
|
||||||
else ()
|
|
||||||
set(UPPER_CMAKE_BUILD_TYPE DEBUG)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set(HF_CMAKE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
|
||||||
set(MACRO_DIR "${HF_CMAKE_DIR}/macros")
|
|
||||||
set(EXTERNAL_PROJECT_DIR "${HF_CMAKE_DIR}/externals")
|
|
||||||
|
|
||||||
file(GLOB HIFI_CUSTOM_MACROS "cmake/macros/*.cmake")
|
|
||||||
foreach(CUSTOM_MACRO ${HIFI_CUSTOM_MACROS})
|
|
||||||
include(${CUSTOM_MACRO})
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
file(GLOB_RECURSE JS_SRC scripts/*.js unpublishedScripts/*.js)
|
file(GLOB_RECURSE JS_SRC scripts/*.js unpublishedScripts/*.js)
|
||||||
add_custom_target(js SOURCES ${JS_SRC})
|
add_custom_target(js SOURCES ${JS_SRC})
|
||||||
GroupSources("scripts")
|
GroupSources("scripts")
|
||||||
GroupSources("unpublishedScripts")
|
GroupSources("unpublishedScripts")
|
||||||
|
|
||||||
if (UNIX)
|
# Locate the required Qt build on the filesystem
|
||||||
install(
|
setup_qt()
|
||||||
DIRECTORY "${CMAKE_SOURCE_DIR}/scripts"
|
list(APPEND CMAKE_PREFIX_PATH "${QT_CMAKE_PREFIX_PATH}")
|
||||||
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/interface
|
|
||||||
COMPONENT ${CLIENT_COMPONENT}
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (ANDROID)
|
find_package( Threads )
|
||||||
file(GLOB ANDROID_CUSTOM_MACROS "cmake/android/*.cmake")
|
|
||||||
foreach(CUSTOM_MACRO ${ANDROID_CUSTOM_MACROS})
|
add_definitions(-DGLM_FORCE_RADIANS)
|
||||||
include(${CUSTOM_MACRO})
|
set(HIFI_LIBRARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libraries")
|
||||||
endforeach()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set(EXTERNAL_PROJECT_PREFIX "project")
|
set(EXTERNAL_PROJECT_PREFIX "project")
|
||||||
set_property(DIRECTORY PROPERTY EP_PREFIX ${EXTERNAL_PROJECT_PREFIX})
|
set_property(DIRECTORY PROPERTY EP_PREFIX ${EXTERNAL_PROJECT_PREFIX})
|
||||||
setup_externals_binary_dir()
|
setup_externals_binary_dir()
|
||||||
|
|
||||||
option(USE_NSIGHT "Attempt to find the nSight libraries" 1)
|
option(USE_NSIGHT "Attempt to find the nSight libraries" 1)
|
||||||
option(GET_QUAZIP "Get QuaZip library automatically as external project" 1)
|
|
||||||
|
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
add_paths_to_fixup_libs("${QT_DIR}/bin")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (NOT DEFINED SERVER_ONLY)
|
|
||||||
set(SERVER_ONLY 0)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set_packaging_parameters()
|
set_packaging_parameters()
|
||||||
|
|
||||||
option(BUILD_TESTS "Build tests" ON)
|
|
||||||
MESSAGE(STATUS "Build tests: " ${BUILD_TESTS})
|
|
||||||
|
|
||||||
# add subdirectories for all targets
|
# add subdirectories for all targets
|
||||||
if (NOT ANDROID)
|
if (BUILD_SERVER)
|
||||||
add_subdirectory(assignment-client)
|
add_subdirectory(assignment-client)
|
||||||
set_target_properties(assignment-client PROPERTIES FOLDER "Apps")
|
set_target_properties(assignment-client PROPERTIES FOLDER "Apps")
|
||||||
add_subdirectory(domain-server)
|
add_subdirectory(domain-server)
|
||||||
|
@ -259,30 +86,36 @@ if (NOT ANDROID)
|
||||||
add_subdirectory(ice-server)
|
add_subdirectory(ice-server)
|
||||||
set_target_properties(ice-server PROPERTIES FOLDER "Apps")
|
set_target_properties(ice-server PROPERTIES FOLDER "Apps")
|
||||||
add_subdirectory(server-console)
|
add_subdirectory(server-console)
|
||||||
if (NOT SERVER_ONLY)
|
endif()
|
||||||
|
|
||||||
|
if (BUILD_CLIENT)
|
||||||
add_subdirectory(interface)
|
add_subdirectory(interface)
|
||||||
set_target_properties(interface PROPERTIES FOLDER "Apps")
|
set_target_properties(interface PROPERTIES FOLDER "Apps")
|
||||||
if (BUILD_TESTS)
|
if (ANDROID)
|
||||||
add_subdirectory(tests)
|
add_subdirectory(gvr-interface)
|
||||||
|
set_target_properties(gvr-interface PROPERTIES FOLDER "Apps")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
add_subdirectory(plugins)
|
|
||||||
|
if (BUILD_CLIENT OR BUILD_SERVER)
|
||||||
|
add_subdirectory(plugins)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (BUILD_TOOLS)
|
||||||
add_subdirectory(tools)
|
add_subdirectory(tools)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ANDROID OR DESKTOP_GVR)
|
if (BUILD_TESTS)
|
||||||
add_subdirectory(interface)
|
add_subdirectory(tests)
|
||||||
add_subdirectory(gvr-interface)
|
endif()
|
||||||
add_subdirectory(plugins)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (DEFINED ENV{HIFI_MEMORY_DEBUGGING})
|
if (BUILD_INSTALLER)
|
||||||
SET( HIFI_MEMORY_DEBUGGING true )
|
if (UNIX)
|
||||||
endif ()
|
install(
|
||||||
if (HIFI_MEMORY_DEBUGGING)
|
DIRECTORY "${CMAKE_SOURCE_DIR}/scripts"
|
||||||
if (UNIX)
|
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/interface
|
||||||
MESSAGE("-- Memory debugging is enabled")
|
COMPONENT ${CLIENT_COMPONENT}
|
||||||
endif (UNIX)
|
)
|
||||||
endif ()
|
endif()
|
||||||
|
generate_installers()
|
||||||
generate_installers()
|
endif()
|
||||||
|
|
106
cmake/compiler.cmake
Normal file
106
cmake/compiler.cmake
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
if (NOT "${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
|
||||||
|
message( FATAL_ERROR "Only 64 bit builds supported." )
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_definitions(-DNOMINMAX -D_CRT_SECURE_NO_WARNINGS)
|
||||||
|
|
||||||
|
if (NOT WINDOW_SDK_PATH)
|
||||||
|
set(DEBUG_DISCOVERED_SDK_PATH TRUE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# sets path for Microsoft SDKs
|
||||||
|
# if you get build error about missing 'glu32' this path is likely wrong
|
||||||
|
if (MSVC_VERSION GREATER_EQUAL 1910) # VS 2017
|
||||||
|
set(WINDOW_SDK_PATH "C:/Program Files (x86)/Windows Kits/10/Lib/${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}/x64" CACHE PATH "Windows SDK PATH")
|
||||||
|
elseif (MSVC_VERSION GREATER_EQUAL 1800) # VS 2013
|
||||||
|
set(WINDOW_SDK_PATH "C:\\Program Files (x86)\\Windows Kits\\8.1\\Lib\\winv6.3\\um\\${WINDOW_SDK_FOLDER}" CACHE PATH "Windows SDK PATH")
|
||||||
|
else()
|
||||||
|
message( FATAL_ERROR "Visual Studio 2013 or higher required." )
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (DEBUG_DISCOVERED_SDK_PATH)
|
||||||
|
message(STATUS "The discovered Windows SDK path is ${WINDOW_SDK_PATH}")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
list(APPEND CMAKE_PREFIX_PATH "${WINDOW_SDK_PATH}")
|
||||||
|
|
||||||
|
# /wd4351 disables warning C4351: new behavior: elements of array will be default initialized
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /wd4351")
|
||||||
|
# /LARGEADDRESSAWARE enables 32-bit apps to use more than 2GB of memory.
|
||||||
|
# Caveats: http://stackoverflow.com/questions/2288728/drawbacks-of-using-largeaddressaware-for-32-bit-windows-executables
|
||||||
|
# TODO: Remove when building 64-bit.
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE")
|
||||||
|
# always produce symbols as PDB files
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG /OPT:REF /OPT:ICF")
|
||||||
|
else ()
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -fno-strict-aliasing -Wno-unused-parameter")
|
||||||
|
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb -Woverloaded-virtual -Wdouble-promotion")
|
||||||
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "5.1") # gcc 5.1 and on have suggest-override
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsuggest-override")
|
||||||
|
endif ()
|
||||||
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.3")
|
||||||
|
# GLM 0.9.8 on Ubuntu 14 (gcc 4.4) has issues with the simd declarations
|
||||||
|
add_definitions(-DGLM_FORCE_PURE)
|
||||||
|
endif()
|
||||||
|
endif ()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (ANDROID)
|
||||||
|
# assume that the toolchain selected for android has C++11 support
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||||
|
elseif ((NOT MSVC12) AND (NOT MSVC14))
|
||||||
|
include(CheckCXXCompilerFlag)
|
||||||
|
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
|
||||||
|
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
|
||||||
|
if (COMPILER_SUPPORTS_CXX11)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||||
|
elseif(COMPILER_SUPPORTS_CXX0X)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
|
||||||
|
endif()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (APPLE)
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++11")
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --stdlib=libc++")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (NOT ANDROID_LIB_DIR)
|
||||||
|
set(ANDROID_LIB_DIR $ENV{ANDROID_LIB_DIR})
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (APPLE)
|
||||||
|
exec_program(sw_vers ARGS -productVersion OUTPUT_VARIABLE OSX_VERSION)
|
||||||
|
string(REGEX MATCH "^[0-9]+\\.[0-9]+" OSX_VERSION ${OSX_VERSION})
|
||||||
|
message(STATUS "Detected OS X version = ${OSX_VERSION}")
|
||||||
|
|
||||||
|
set(OSX_SDK "${OSX_VERSION}" CACHE String "OS X SDK version to look for inside Xcode bundle or at OSX_SDK_PATH")
|
||||||
|
|
||||||
|
# set our OS X deployment target
|
||||||
|
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.8)
|
||||||
|
|
||||||
|
# find the SDK path for the desired SDK
|
||||||
|
find_path(
|
||||||
|
_OSX_DESIRED_SDK_PATH
|
||||||
|
NAME MacOSX${OSX_SDK}.sdk
|
||||||
|
HINTS ${OSX_SDK_PATH}
|
||||||
|
PATHS /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
|
||||||
|
/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
|
||||||
|
)
|
||||||
|
|
||||||
|
if (NOT _OSX_DESIRED_SDK_PATH)
|
||||||
|
message(STATUS "Could not find OS X ${OSX_SDK} SDK. Will fall back to default. If you want a specific SDK, please pass OSX_SDK and optionally OSX_SDK_PATH to CMake.")
|
||||||
|
else ()
|
||||||
|
message(STATUS "Found OS X ${OSX_SDK} SDK at ${_OSX_DESIRED_SDK_PATH}/MacOSX${OSX_SDK}.sdk")
|
||||||
|
|
||||||
|
# set that as the SDK to use
|
||||||
|
set(CMAKE_OSX_SYSROOT ${_OSX_DESIRED_SDK_PATH}/MacOSX${OSX_SDK}.sdk)
|
||||||
|
endif ()
|
||||||
|
endif ()
|
1
cmake/externals/LibOVR/CMakeLists.txt
vendored
1
cmake/externals/LibOVR/CMakeLists.txt
vendored
|
@ -33,7 +33,6 @@ if (WIN32)
|
||||||
include(SelectLibraryConfigurations)
|
include(SelectLibraryConfigurations)
|
||||||
select_library_configurations(LIBOVR)
|
select_library_configurations(LIBOVR)
|
||||||
set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${${EXTERNAL_NAME_UPPER}_LIBRARIES} CACHE TYPE INTERNAL)
|
set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${${EXTERNAL_NAME_UPPER}_LIBRARIES} CACHE TYPE INTERNAL)
|
||||||
message("Libs ${EXTERNAL_NAME_UPPER}_LIBRARIES ${${EXTERNAL_NAME_UPPER}_LIBRARIES}")
|
|
||||||
|
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
|
|
||||||
|
|
14
cmake/externals/quazip/CMakeLists.txt
vendored
14
cmake/externals/quazip/CMakeLists.txt
vendored
|
@ -4,14 +4,6 @@ cmake_policy(SET CMP0046 OLD)
|
||||||
|
|
||||||
include(ExternalProject)
|
include(ExternalProject)
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
# windows shell does not like backslashes expanded on the command line,
|
|
||||||
# so convert all backslashes in the QT path to forward slashes
|
|
||||||
string(REPLACE \\ / QT_CMAKE_PREFIX_PATH $ENV{QT_CMAKE_PREFIX_PATH})
|
|
||||||
elseif ($ENV{QT_CMAKE_PREFIX_PATH})
|
|
||||||
set(QT_CMAKE_PREFIX_PATH $ENV{QT_CMAKE_PREFIX_PATH})
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set(QUAZIP_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DCMAKE_PREFIX_PATH=${QT_CMAKE_PREFIX_PATH} -DCMAKE_INSTALL_NAME_DIR:PATH=<INSTALL_DIR>/lib -DZLIB_ROOT=${ZLIB_ROOT} -DCMAKE_POSITION_INDEPENDENT_CODE=ON)
|
set(QUAZIP_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DCMAKE_PREFIX_PATH=${QT_CMAKE_PREFIX_PATH} -DCMAKE_INSTALL_NAME_DIR:PATH=<INSTALL_DIR>/lib -DZLIB_ROOT=${ZLIB_ROOT} -DCMAKE_POSITION_INDEPENDENT_CODE=ON)
|
||||||
|
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
|
@ -34,9 +26,9 @@ add_dependencies(quazip zlib)
|
||||||
|
|
||||||
# Hide this external target (for ide users)
|
# Hide this external target (for ide users)
|
||||||
set_target_properties(${EXTERNAL_NAME} PROPERTIES
|
set_target_properties(${EXTERNAL_NAME} PROPERTIES
|
||||||
FOLDER "hidden/externals"
|
FOLDER "hidden/externals"
|
||||||
INSTALL_NAME_DIR ${INSTALL_DIR}/lib
|
INSTALL_NAME_DIR ${INSTALL_DIR}/lib
|
||||||
BUILD_WITH_INSTALL_RPATH True)
|
BUILD_WITH_INSTALL_RPATH True)
|
||||||
|
|
||||||
ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR)
|
ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR)
|
||||||
set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INSTALL_DIR}/include CACHE PATH "List of QuaZip include directories")
|
set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INSTALL_DIR}/include CACHE PATH "List of QuaZip include directories")
|
||||||
|
|
43
cmake/init.cmake
Normal file
43
cmake/init.cmake
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
if (WIN32)
|
||||||
|
cmake_policy(SET CMP0020 NEW)
|
||||||
|
endif (WIN32)
|
||||||
|
|
||||||
|
if (POLICY CMP0043)
|
||||||
|
cmake_policy(SET CMP0043 OLD)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (POLICY CMP0042)
|
||||||
|
cmake_policy(SET CMP0042 OLD)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||||
|
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMakeTargets")
|
||||||
|
# Hide automoc folders (for IDEs)
|
||||||
|
set(AUTOGEN_TARGETS_FOLDER "hidden/generated")
|
||||||
|
# Find includes in corresponding build directories
|
||||||
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||||
|
|
||||||
|
if (CMAKE_BUILD_TYPE)
|
||||||
|
string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_CMAKE_BUILD_TYPE)
|
||||||
|
else ()
|
||||||
|
set(UPPER_CMAKE_BUILD_TYPE DEBUG)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# CMAKE_CURRENT_SOURCE_DIR is the parent folder here
|
||||||
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/")
|
||||||
|
|
||||||
|
set(HF_CMAKE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
||||||
|
set(MACRO_DIR "${HF_CMAKE_DIR}/macros")
|
||||||
|
set(EXTERNAL_PROJECT_DIR "${HF_CMAKE_DIR}/externals")
|
||||||
|
|
||||||
|
file(GLOB HIFI_CUSTOM_MACROS "cmake/macros/*.cmake")
|
||||||
|
foreach(CUSTOM_MACRO ${HIFI_CUSTOM_MACROS})
|
||||||
|
include(${CUSTOM_MACRO})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
if (ANDROID)
|
||||||
|
file(GLOB ANDROID_CUSTOM_MACROS "cmake/android/*.cmake")
|
||||||
|
foreach(CUSTOM_MACRO ${ANDROID_CUSTOM_MACROS})
|
||||||
|
include(${CUSTOM_MACRO})
|
||||||
|
endforeach()
|
||||||
|
endif ()
|
|
@ -9,11 +9,13 @@ macro(SETUP_HIFI_CLIENT_SERVER_PLUGIN)
|
||||||
set(${TARGET_NAME}_SHARED 1)
|
set(${TARGET_NAME}_SHARED 1)
|
||||||
setup_hifi_library(${ARGV})
|
setup_hifi_library(${ARGV})
|
||||||
|
|
||||||
if (NOT DEFINED SERVER_ONLY)
|
if (BUILD_CLIENT)
|
||||||
add_dependencies(interface ${TARGET_NAME})
|
add_dependencies(interface ${TARGET_NAME})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_dependencies(assignment-client ${TARGET_NAME})
|
if (BUILD_SERVER)
|
||||||
|
add_dependencies(assignment-client ${TARGET_NAME})
|
||||||
|
endif()
|
||||||
|
|
||||||
set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Plugins")
|
set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Plugins")
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,9 @@
|
||||||
macro(SETUP_HIFI_PLUGIN)
|
macro(SETUP_HIFI_PLUGIN)
|
||||||
set(${TARGET_NAME}_SHARED 1)
|
set(${TARGET_NAME}_SHARED 1)
|
||||||
setup_hifi_library(${ARGV})
|
setup_hifi_library(${ARGV})
|
||||||
add_dependencies(interface ${TARGET_NAME})
|
if (BUILD_CLIENT)
|
||||||
|
add_dependencies(interface ${TARGET_NAME})
|
||||||
|
endif()
|
||||||
target_link_libraries(${TARGET_NAME} ${CMAKE_THREAD_LIBS_INIT})
|
target_link_libraries(${TARGET_NAME} ${CMAKE_THREAD_LIBS_INIT})
|
||||||
set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Plugins")
|
set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Plugins")
|
||||||
|
|
||||||
|
|
84
cmake/macros/SetupQt.cmake
Normal file
84
cmake/macros/SetupQt.cmake
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
#
|
||||||
|
# Copyright 2015 High Fidelity, Inc.
|
||||||
|
# Created by Bradley Austin Davis on 2015/10/10
|
||||||
|
#
|
||||||
|
# Distributed under the Apache License, Version 2.0.
|
||||||
|
# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
#
|
||||||
|
|
||||||
|
function(set_from_env _RESULT_NAME _ENV_VAR_NAME _DEFAULT_VALUE)
|
||||||
|
if ("$ENV{${_ENV_VAR_NAME}}" STREQUAL "")
|
||||||
|
set (${_RESULT_NAME} ${_DEFAULT_VALUE} PARENT_SCOPE)
|
||||||
|
else()
|
||||||
|
set (${_RESULT_NAME} $ENV{${_ENV_VAR_NAME}} PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Construct a default QT location from a root path, a version and an architecture
|
||||||
|
function(calculate_default_qt_dir _RESULT_NAME)
|
||||||
|
if (ANDROID)
|
||||||
|
set(QT_DEFAULT_ARCH "android_armv7")
|
||||||
|
elseif(UWP)
|
||||||
|
set(QT_DEFAULT_ARCH "winrt_x64_msvc2017")
|
||||||
|
elseif(APPLE)
|
||||||
|
set(QT_DEFAULT_ARCH "clang_64")
|
||||||
|
elseif(WIN32)
|
||||||
|
set(QT_DEFAULT_ARCH "msvc2017_64")
|
||||||
|
else()
|
||||||
|
set(QT_DEFAULT_ARCH "gcc_64")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
set(QT_DEFAULT_ROOT "c:/Qt")
|
||||||
|
else()
|
||||||
|
set(QT_DEFAULT_ROOT "$ENV{HOME}/Qt")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set_from_env(QT_ROOT QT_ROOT ${QT_DEFAULT_ROOT})
|
||||||
|
set_from_env(QT_VERSION QT_VERSION "5.9.1")
|
||||||
|
set_from_env(QT_ARCH QT_ARCH ${QT_DEFAULT_ARCH})
|
||||||
|
|
||||||
|
set(${_RESULT_NAME} "${QT_ROOT}/${QT_VERSION}/${QT_ARCH}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Sets the QT_CMAKE_PREFIX_PATH and QT_DIR variables
|
||||||
|
# Also enables CMAKE_AUTOMOC and CMAKE_AUTORCC
|
||||||
|
macro(setup_qt)
|
||||||
|
set(QT_CMAKE_PREFIX_PATH "$ENV{QT_CMAKE_PREFIX_PATH}")
|
||||||
|
if (("QT_CMAKE_PREFIX_PATH" STREQUAL "") OR (NOT EXISTS "${QT_CMAKE_PREFIX_PATH}"))
|
||||||
|
calculate_default_qt_dir(QT_DIR)
|
||||||
|
set(QT_CMAKE_PREFIX_PATH "${QT_DIR}/lib/cmake")
|
||||||
|
else()
|
||||||
|
# figure out where the qt dir is
|
||||||
|
get_filename_component(QT_DIR "${QT_CMAKE_PREFIX_PATH}/../../" ABSOLUTE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
# windows shell does not like backslashes expanded on the command line,
|
||||||
|
# so convert all backslashes in the QT path to forward slashes
|
||||||
|
string(REPLACE \\ / QT_CMAKE_PREFIX_PATH ${QT_CMAKE_PREFIX_PATH})
|
||||||
|
string(REPLACE \\ / QT_DIR ${QT_DIR})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# This check doesn't work on Mac
|
||||||
|
#if (NOT EXISTS "${QT_DIR}/include/QtCore/QtGlobal")
|
||||||
|
# message(FATAL_ERROR "Unable to locate Qt includes in ${QT_DIR}")
|
||||||
|
#endif()
|
||||||
|
|
||||||
|
if (NOT EXISTS "${QT_CMAKE_PREFIX_PATH}/Qt5Core/Qt5CoreConfig.cmake")
|
||||||
|
message(FATAL_ERROR "Unable to locate Qt cmake config in ${QT_CMAKE_PREFIX_PATH}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "The Qt build in use is: \"${QT_DIR}\"")
|
||||||
|
|
||||||
|
# Instruct CMake to run moc automatically when needed.
|
||||||
|
set(CMAKE_AUTOMOC ON)
|
||||||
|
|
||||||
|
# Instruct CMake to run rcc automatically when needed
|
||||||
|
set(CMAKE_AUTORCC ON)
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
add_paths_to_fixup_libs("${QT_DIR}/bin")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
endmacro()
|
|
@ -19,6 +19,7 @@ Flickable {
|
||||||
|
|
||||||
signal newViewRequestedCallback(var request)
|
signal newViewRequestedCallback(var request)
|
||||||
signal loadingChangedCallback(var loadRequest)
|
signal loadingChangedCallback(var loadRequest)
|
||||||
|
pressDelay: 300
|
||||||
|
|
||||||
boundsBehavior: Flickable.StopAtBounds
|
boundsBehavior: Flickable.StopAtBounds
|
||||||
|
|
||||||
|
@ -167,4 +168,11 @@ Flickable {
|
||||||
playing: visible
|
playing: visible
|
||||||
z: 10000
|
z: 10000
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
onWheel: {
|
||||||
|
flick.flick(0, wheel.angleDelta.y*10)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,12 +40,20 @@ Rectangle {
|
||||||
Hifi.QmlCommerce {
|
Hifi.QmlCommerce {
|
||||||
id: commerce;
|
id: commerce;
|
||||||
|
|
||||||
|
onAccountResult: {
|
||||||
|
if (result.status === "success") {
|
||||||
|
commerce.getKeyFilePathIfExists();
|
||||||
|
} else {
|
||||||
|
// unsure how to handle a failure here. We definitely cannot proceed.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
onLoginStatusResult: {
|
onLoginStatusResult: {
|
||||||
if (!isLoggedIn && root.activeView !== "needsLogIn") {
|
if (!isLoggedIn && root.activeView !== "needsLogIn") {
|
||||||
root.activeView = "needsLogIn";
|
root.activeView = "needsLogIn";
|
||||||
} else if (isLoggedIn) {
|
} else if (isLoggedIn) {
|
||||||
root.activeView = "initialize";
|
root.activeView = "initialize";
|
||||||
commerce.getKeyFilePathIfExists();
|
commerce.account();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,7 +211,7 @@ Rectangle {
|
||||||
commerce.getLoginStatus();
|
commerce.getLoginStatus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HifiWallet.NeedsLogIn {
|
HifiWallet.NeedsLogIn {
|
||||||
id: needsLogIn;
|
id: needsLogIn;
|
||||||
visible: root.activeView === "needsLogIn";
|
visible: root.activeView === "needsLogIn";
|
||||||
|
@ -239,7 +247,7 @@ Rectangle {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// "WALLET NOT SET UP" START
|
// "WALLET NOT SET UP" START
|
||||||
//
|
//
|
||||||
|
@ -250,7 +258,7 @@ Rectangle {
|
||||||
anchors.bottom: parent.bottom;
|
anchors.bottom: parent.bottom;
|
||||||
anchors.left: parent.left;
|
anchors.left: parent.left;
|
||||||
anchors.right: parent.right;
|
anchors.right: parent.right;
|
||||||
|
|
||||||
RalewayRegular {
|
RalewayRegular {
|
||||||
id: notSetUpText;
|
id: notSetUpText;
|
||||||
text: "<b>Your wallet isn't set up.</b><br><br>Set up your Wallet (no credit card necessary) to claim your <b>free HFC</b> " +
|
text: "<b>Your wallet isn't set up.</b><br><br>Set up your Wallet (no credit card necessary) to claim your <b>free HFC</b> " +
|
||||||
|
@ -281,7 +289,7 @@ Rectangle {
|
||||||
anchors.left: parent.left;
|
anchors.left: parent.left;
|
||||||
anchors.bottom: parent.bottom;
|
anchors.bottom: parent.bottom;
|
||||||
anchors.bottomMargin: 24;
|
anchors.bottomMargin: 24;
|
||||||
|
|
||||||
// "Cancel" button
|
// "Cancel" button
|
||||||
HifiControlsUit.Button {
|
HifiControlsUit.Button {
|
||||||
id: cancelButton;
|
id: cancelButton;
|
||||||
|
|
|
@ -35,12 +35,20 @@ Rectangle {
|
||||||
Hifi.QmlCommerce {
|
Hifi.QmlCommerce {
|
||||||
id: commerce;
|
id: commerce;
|
||||||
|
|
||||||
|
onAccountResult: {
|
||||||
|
if (result.status === "success") {
|
||||||
|
commerce.getKeyFilePathIfExists();
|
||||||
|
} else {
|
||||||
|
// unsure how to handle a failure here. We definitely cannot proceed.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
onLoginStatusResult: {
|
onLoginStatusResult: {
|
||||||
if (!isLoggedIn && root.activeView !== "needsLogIn") {
|
if (!isLoggedIn && root.activeView !== "needsLogIn") {
|
||||||
root.activeView = "needsLogIn";
|
root.activeView = "needsLogIn";
|
||||||
} else if (isLoggedIn) {
|
} else if (isLoggedIn) {
|
||||||
root.activeView = "initialize";
|
root.activeView = "initialize";
|
||||||
commerce.getKeyFilePathIfExists();
|
commerce.account();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,7 +182,7 @@ Rectangle {
|
||||||
commerce.getLoginStatus();
|
commerce.getLoginStatus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HifiWallet.NeedsLogIn {
|
HifiWallet.NeedsLogIn {
|
||||||
id: needsLogIn;
|
id: needsLogIn;
|
||||||
visible: root.activeView === "needsLogIn";
|
visible: root.activeView === "needsLogIn";
|
||||||
|
@ -210,7 +218,7 @@ Rectangle {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// "WALLET NOT SET UP" START
|
// "WALLET NOT SET UP" START
|
||||||
//
|
//
|
||||||
|
@ -221,7 +229,7 @@ Rectangle {
|
||||||
anchors.bottom: parent.bottom;
|
anchors.bottom: parent.bottom;
|
||||||
anchors.left: parent.left;
|
anchors.left: parent.left;
|
||||||
anchors.right: parent.right;
|
anchors.right: parent.right;
|
||||||
|
|
||||||
RalewayRegular {
|
RalewayRegular {
|
||||||
id: notSetUpText;
|
id: notSetUpText;
|
||||||
text: "<b>Your wallet isn't set up.</b><br><br>Set up your Wallet (no credit card necessary) to claim your <b>free HFC</b> " +
|
text: "<b>Your wallet isn't set up.</b><br><br>Set up your Wallet (no credit card necessary) to claim your <b>free HFC</b> " +
|
||||||
|
@ -252,7 +260,7 @@ Rectangle {
|
||||||
anchors.left: parent.left;
|
anchors.left: parent.left;
|
||||||
anchors.bottom: parent.bottom;
|
anchors.bottom: parent.bottom;
|
||||||
anchors.bottomMargin: 24;
|
anchors.bottomMargin: 24;
|
||||||
|
|
||||||
// "Cancel" button
|
// "Cancel" button
|
||||||
HifiControlsUit.Button {
|
HifiControlsUit.Button {
|
||||||
id: cancelButton;
|
id: cancelButton;
|
||||||
|
@ -309,7 +317,7 @@ Rectangle {
|
||||||
anchors.topMargin: 8;
|
anchors.topMargin: 8;
|
||||||
anchors.bottom: actionButtonsContainer.top;
|
anchors.bottom: actionButtonsContainer.top;
|
||||||
anchors.bottomMargin: 8;
|
anchors.bottomMargin: 8;
|
||||||
|
|
||||||
//
|
//
|
||||||
// FILTER BAR START
|
// FILTER BAR START
|
||||||
//
|
//
|
||||||
|
@ -383,7 +391,7 @@ Rectangle {
|
||||||
itemHref: root_file_url;
|
itemHref: root_file_url;
|
||||||
anchors.topMargin: 12;
|
anchors.topMargin: 12;
|
||||||
anchors.bottomMargin: 12;
|
anchors.bottomMargin: 12;
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
onSendToPurchases: {
|
onSendToPurchases: {
|
||||||
if (msg.method === 'purchases_itemInfoClicked') {
|
if (msg.method === 'purchases_itemInfoClicked') {
|
||||||
|
@ -402,7 +410,7 @@ Rectangle {
|
||||||
anchors.left: parent.left;
|
anchors.left: parent.left;
|
||||||
anchors.bottom: parent.bottom;
|
anchors.bottom: parent.bottom;
|
||||||
width: parent.width;
|
width: parent.width;
|
||||||
|
|
||||||
// Explanitory text
|
// Explanitory text
|
||||||
RalewayRegular {
|
RalewayRegular {
|
||||||
id: haventPurchasedYet;
|
id: haventPurchasedYet;
|
||||||
|
|
|
@ -31,6 +31,13 @@
|
||||||
#include <openssl/evp.h>
|
#include <openssl/evp.h>
|
||||||
#include <openssl/aes.h>
|
#include <openssl/aes.h>
|
||||||
|
|
||||||
|
// I know, right? But per https://www.openssl.org/docs/faq.html
|
||||||
|
// this avoids OPENSSL_Uplink(00007FF847238000,08): no OPENSSL_Applink
|
||||||
|
// at runtime.
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
#include <openssl/applink.c>
|
||||||
|
#endif
|
||||||
|
|
||||||
static const char* KEY_FILE = "hifikey";
|
static const char* KEY_FILE = "hifikey";
|
||||||
static const char* IMAGE_FILE = "hifi_image"; // eventually this will live in keyfile
|
static const char* IMAGE_FILE = "hifi_image"; // eventually this will live in keyfile
|
||||||
|
|
||||||
|
|
|
@ -144,25 +144,33 @@ int main(int argc, const char* argv[]) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// FIXME this method of checking the OpenGL version screws up the `QOpenGLContext::globalShareContext()` value, which in turn
|
||||||
|
// leads to crashes when creating the real OpenGL instance. Disabling for now until we come up with a better way of checking
|
||||||
|
// the GL version on the system without resorting to creating a full Qt application
|
||||||
|
#if 0
|
||||||
// Check OpenGL version.
|
// Check OpenGL version.
|
||||||
// This is done separately from the main Application so that start-up and shut-down logic within the main Application is
|
// This is done separately from the main Application so that start-up and shut-down logic within the main Application is
|
||||||
// not made more complicated than it already is.
|
// not made more complicated than it already is.
|
||||||
bool override = false;
|
bool overrideGLCheck = false;
|
||||||
|
|
||||||
QJsonObject glData;
|
QJsonObject glData;
|
||||||
{
|
{
|
||||||
OpenGLVersionChecker openGLVersionChecker(argc, const_cast<char**>(argv));
|
OpenGLVersionChecker openGLVersionChecker(argc, const_cast<char**>(argv));
|
||||||
bool valid = true;
|
bool valid = true;
|
||||||
glData = openGLVersionChecker.checkVersion(valid, override);
|
glData = openGLVersionChecker.checkVersion(valid, overrideGLCheck);
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
if (override) {
|
if (overrideGLCheck) {
|
||||||
auto glVersion = glData["version"].toString();
|
auto glVersion = glData["version"].toString();
|
||||||
qCDebug(interfaceapp, "Running on insufficient OpenGL version: %s.", glVersion.toStdString().c_str());
|
qCWarning(interfaceapp, "Running on insufficient OpenGL version: %s.", glVersion.toStdString().c_str());
|
||||||
} else {
|
} else {
|
||||||
qCDebug(interfaceapp, "Early exit due to OpenGL version.");
|
qCWarning(interfaceapp, "Early exit due to OpenGL version.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// Debug option to demonstrate that the client's local time does not
|
// Debug option to demonstrate that the client's local time does not
|
||||||
// need to be in sync with any other network node. This forces clock
|
// need to be in sync with any other network node. This forces clock
|
||||||
|
@ -223,8 +231,9 @@ int main(int argc, const char* argv[]) {
|
||||||
|
|
||||||
Application app(argcExtended, const_cast<char**>(argvExtended.data()), startupTime, runningMarkerExisted);
|
Application app(argcExtended, const_cast<char**>(argvExtended.data()), startupTime, runningMarkerExisted);
|
||||||
|
|
||||||
|
#if 0
|
||||||
// If we failed the OpenGLVersion check, log it.
|
// If we failed the OpenGLVersion check, log it.
|
||||||
if (override) {
|
if (overrideGLcheck) {
|
||||||
auto accountManager = DependencyManager::get<AccountManager>();
|
auto accountManager = DependencyManager::get<AccountManager>();
|
||||||
if (accountManager->isLoggedIn()) {
|
if (accountManager->isLoggedIn()) {
|
||||||
UserActivityLogger::getInstance().insufficientGLVersion(glData);
|
UserActivityLogger::getInstance().insufficientGLVersion(glData);
|
||||||
|
@ -238,6 +247,8 @@ int main(int argc, const char* argv[]) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// Setup local server
|
// Setup local server
|
||||||
QLocalServer server { &app };
|
QLocalServer server { &app };
|
||||||
|
|
|
@ -62,24 +62,9 @@ QRect HmdDisplayPlugin::getRecommendedOverlayRect() const {
|
||||||
return CompositorHelper::VIRTUAL_SCREEN_RECOMMENDED_OVERLAY_RECT;
|
return CompositorHelper::VIRTUAL_SCREEN_RECOMMENDED_OVERLAY_RECT;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HmdDisplayPlugin::beginFrameRender(uint32_t frameIndex) {
|
#define DISABLE_PREVIEW_MENU_ITEM_DELAY_MS 500
|
||||||
if (!_vsyncEnabled && !_disablePreviewItemAdded) {
|
|
||||||
_container->addMenuItem(PluginType::DISPLAY_PLUGIN, MENU_PATH(), DISABLE_PREVIEW,
|
|
||||||
[this](bool clicked) {
|
|
||||||
_disablePreview = clicked;
|
|
||||||
_container->setBoolSetting("disableHmdPreview", _disablePreview);
|
|
||||||
if (_disablePreview) {
|
|
||||||
_clearPreviewFlag = true;
|
|
||||||
}
|
|
||||||
}, true, _disablePreview);
|
|
||||||
_disablePreviewItemAdded = true;
|
|
||||||
}
|
|
||||||
return Parent::beginFrameRender(frameIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool HmdDisplayPlugin::internalActivate() {
|
bool HmdDisplayPlugin::internalActivate() {
|
||||||
_disablePreviewItemAdded = false;
|
|
||||||
_monoPreview = _container->getBoolSetting("monoPreview", DEFAULT_MONO_VIEW);
|
_monoPreview = _container->getBoolSetting("monoPreview", DEFAULT_MONO_VIEW);
|
||||||
_clearPreviewFlag = true;
|
_clearPreviewFlag = true;
|
||||||
_container->addMenuItem(PluginType::DISPLAY_PLUGIN, MENU_PATH(), MONO_PREVIEW,
|
_container->addMenuItem(PluginType::DISPLAY_PLUGIN, MENU_PATH(), MONO_PREVIEW,
|
||||||
|
@ -94,6 +79,19 @@ bool HmdDisplayPlugin::internalActivate() {
|
||||||
_disablePreview = _container->getBoolSetting("disableHmdPreview", DEFAULT_DISABLE_PREVIEW || _vsyncEnabled);
|
_disablePreview = _container->getBoolSetting("disableHmdPreview", DEFAULT_DISABLE_PREVIEW || _vsyncEnabled);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
QTimer::singleShot(DISABLE_PREVIEW_MENU_ITEM_DELAY_MS, [this] {
|
||||||
|
if (isActive() && !_vsyncEnabled) {
|
||||||
|
_container->addMenuItem(PluginType::DISPLAY_PLUGIN, MENU_PATH(), DISABLE_PREVIEW,
|
||||||
|
[this](bool clicked) {
|
||||||
|
_disablePreview = clicked;
|
||||||
|
_container->setBoolSetting("disableHmdPreview", _disablePreview);
|
||||||
|
if (_disablePreview) {
|
||||||
|
_clearPreviewFlag = true;
|
||||||
|
}
|
||||||
|
}, true, _disablePreview);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
_container->removeMenu(FRAMERATE);
|
_container->removeMenu(FRAMERATE);
|
||||||
for_each_eye([&](Eye eye) {
|
for_each_eye([&](Eye eye) {
|
||||||
_eyeInverseProjections[eye] = glm::inverse(_eyeProjections[eye]);
|
_eyeInverseProjections[eye] = glm::inverse(_eyeProjections[eye]);
|
||||||
|
|
|
@ -51,7 +51,6 @@ protected:
|
||||||
virtual void postPreview() {};
|
virtual void postPreview() {};
|
||||||
virtual void updatePresentPose();
|
virtual void updatePresentPose();
|
||||||
|
|
||||||
bool beginFrameRender(uint32_t frameIndex) override;
|
|
||||||
bool internalActivate() override;
|
bool internalActivate() override;
|
||||||
void internalDeactivate() override;
|
void internalDeactivate() override;
|
||||||
void compositeOverlay() override;
|
void compositeOverlay() override;
|
||||||
|
@ -87,7 +86,6 @@ private:
|
||||||
ivec4 getViewportForSourceSize(const uvec2& size) const;
|
ivec4 getViewportForSourceSize(const uvec2& size) const;
|
||||||
float getLeftCenterPixel() const;
|
float getLeftCenterPixel() const;
|
||||||
|
|
||||||
bool _disablePreviewItemAdded { false };
|
|
||||||
bool _monoPreview { true };
|
bool _monoPreview { true };
|
||||||
bool _clearPreviewFlag { false };
|
bool _clearPreviewFlag { false };
|
||||||
gpu::TexturePointer _previewTexture;
|
gpu::TexturePointer _previewTexture;
|
||||||
|
|
|
@ -91,7 +91,12 @@ void entitiesScriptEngineDeleter(ScriptEngine* engine) {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Wait for the scripting thread from the thread pool to avoid hanging the main thread
|
// Wait for the scripting thread from the thread pool to avoid hanging the main thread
|
||||||
QThreadPool::globalInstance()->start(new WaitRunnable(engine));
|
auto threadPool = QThreadPool::globalInstance();
|
||||||
|
if (threadPool) {
|
||||||
|
threadPool->start(new WaitRunnable(engine));
|
||||||
|
} else {
|
||||||
|
delete engine;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityTreeRenderer::resetEntitiesScriptEngine() {
|
void EntityTreeRenderer::resetEntitiesScriptEngine() {
|
||||||
|
|
|
@ -91,20 +91,27 @@ void ParticleEffectEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePoi
|
||||||
qCWarning(entitiesrenderer) << "Bad particle properties";
|
qCWarning(entitiesrenderer) << "Bad particle properties";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_particleProperties != newParticleProperties) {
|
|
||||||
|
if (resultWithReadLock<bool>([&]{ return _particleProperties != newParticleProperties; })) {
|
||||||
_timeUntilNextEmit = 0;
|
_timeUntilNextEmit = 0;
|
||||||
_particleProperties = newParticleProperties;
|
withWriteLock([&]{
|
||||||
|
_particleProperties = newParticleProperties;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
_emitting = entity->getIsEmitting();
|
_emitting = entity->getIsEmitting();
|
||||||
|
|
||||||
if (_particleProperties.textures.isEmpty()) {
|
bool hasTexture = resultWithReadLock<bool>([&]{ return _particleProperties.textures.isEmpty(); });
|
||||||
|
if (hasTexture) {
|
||||||
if (_networkTexture) {
|
if (_networkTexture) {
|
||||||
withWriteLock([&] {
|
withWriteLock([&] {
|
||||||
_networkTexture.reset();
|
_networkTexture.reset();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!_networkTexture || _networkTexture->getURL() != QUrl(_particleProperties.textures)) {
|
bool textureNeedsUpdate = resultWithReadLock<bool>([&]{
|
||||||
|
return !_networkTexture || _networkTexture->getURL() != QUrl(_particleProperties.textures);
|
||||||
|
});
|
||||||
|
if (textureNeedsUpdate) {
|
||||||
withWriteLock([&] {
|
withWriteLock([&] {
|
||||||
_networkTexture = DependencyManager::get<TextureCache>()->getTexture(_particleProperties.textures);
|
_networkTexture = DependencyManager::get<TextureCache>()->getTexture(_particleProperties.textures);
|
||||||
});
|
});
|
||||||
|
@ -115,15 +122,17 @@ void ParticleEffectEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePoi
|
||||||
void ParticleEffectEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) {
|
void ParticleEffectEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) {
|
||||||
// Fill in Uniforms structure
|
// Fill in Uniforms structure
|
||||||
ParticleUniforms particleUniforms;
|
ParticleUniforms particleUniforms;
|
||||||
particleUniforms.radius.start = _particleProperties.radius.range.start;
|
withReadLock([&]{
|
||||||
particleUniforms.radius.middle = _particleProperties.radius.gradient.target;
|
particleUniforms.radius.start = _particleProperties.radius.range.start;
|
||||||
particleUniforms.radius.finish = _particleProperties.radius.range.finish;
|
particleUniforms.radius.middle = _particleProperties.radius.gradient.target;
|
||||||
particleUniforms.radius.spread = _particleProperties.radius.gradient.spread;
|
particleUniforms.radius.finish = _particleProperties.radius.range.finish;
|
||||||
particleUniforms.color.start = _particleProperties.getColorStart();
|
particleUniforms.radius.spread = _particleProperties.radius.gradient.spread;
|
||||||
particleUniforms.color.middle = _particleProperties.getColorMiddle();
|
particleUniforms.color.start = _particleProperties.getColorStart();
|
||||||
particleUniforms.color.finish = _particleProperties.getColorFinish();
|
particleUniforms.color.middle = _particleProperties.getColorMiddle();
|
||||||
particleUniforms.color.spread = _particleProperties.getColorSpread();
|
particleUniforms.color.finish = _particleProperties.getColorFinish();
|
||||||
particleUniforms.lifespan = _particleProperties.lifespan;
|
particleUniforms.color.spread = _particleProperties.getColorSpread();
|
||||||
|
particleUniforms.lifespan = _particleProperties.lifespan;
|
||||||
|
});
|
||||||
// Update particle uniforms
|
// Update particle uniforms
|
||||||
memcpy(&_uniformBuffer.edit<ParticleUniforms>(), &particleUniforms, sizeof(ParticleUniforms));
|
memcpy(&_uniformBuffer.edit<ParticleUniforms>(), &particleUniforms, sizeof(ParticleUniforms));
|
||||||
}
|
}
|
||||||
|
@ -146,35 +155,26 @@ Item::Bound ParticleEffectEntityRenderer::getBound() {
|
||||||
|
|
||||||
static const size_t VERTEX_PER_PARTICLE = 4;
|
static const size_t VERTEX_PER_PARTICLE = 4;
|
||||||
|
|
||||||
bool ParticleEffectEntityRenderer::emitting() const {
|
ParticleEffectEntityRenderer::CpuParticle ParticleEffectEntityRenderer::createParticle(uint64_t now, const Transform& baseTransform, const particle::Properties& particleProperties) {
|
||||||
return (
|
|
||||||
_emitting &&
|
|
||||||
_particleProperties.emission.rate > 0.0f &&
|
|
||||||
_particleProperties.lifespan > 0.0f &&
|
|
||||||
_particleProperties.polar.start <= _particleProperties.polar.finish
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ParticleEffectEntityRenderer::createParticle(uint64_t now) {
|
|
||||||
CpuParticle particle;
|
CpuParticle particle;
|
||||||
|
|
||||||
const auto& accelerationSpread = _particleProperties.emission.acceleration.spread;
|
const auto& accelerationSpread = particleProperties.emission.acceleration.spread;
|
||||||
const auto& azimuthStart = _particleProperties.azimuth.start;
|
const auto& azimuthStart = particleProperties.azimuth.start;
|
||||||
const auto& azimuthFinish = _particleProperties.azimuth.finish;
|
const auto& azimuthFinish = particleProperties.azimuth.finish;
|
||||||
const auto& emitDimensions = _particleProperties.emission.dimensions;
|
const auto& emitDimensions = particleProperties.emission.dimensions;
|
||||||
const auto& emitAcceleration = _particleProperties.emission.acceleration.target;
|
const auto& emitAcceleration = particleProperties.emission.acceleration.target;
|
||||||
auto emitOrientation = _particleProperties.emission.orientation;
|
auto emitOrientation = particleProperties.emission.orientation;
|
||||||
const auto& emitRadiusStart = glm::max(_particleProperties.radiusStart, EPSILON); // Avoid math complications at center
|
const auto& emitRadiusStart = glm::max(particleProperties.radiusStart, EPSILON); // Avoid math complications at center
|
||||||
const auto& emitSpeed = _particleProperties.emission.speed.target;
|
const auto& emitSpeed = particleProperties.emission.speed.target;
|
||||||
const auto& speedSpread = _particleProperties.emission.speed.spread;
|
const auto& speedSpread = particleProperties.emission.speed.spread;
|
||||||
const auto& polarStart = _particleProperties.polar.start;
|
const auto& polarStart = particleProperties.polar.start;
|
||||||
const auto& polarFinish = _particleProperties.polar.finish;
|
const auto& polarFinish = particleProperties.polar.finish;
|
||||||
|
|
||||||
particle.seed = randFloatInRange(-1.0f, 1.0f);
|
particle.seed = randFloatInRange(-1.0f, 1.0f);
|
||||||
particle.expiration = now + (uint64_t)(_particleProperties.lifespan * USECS_PER_SECOND);
|
particle.expiration = now + (uint64_t)(particleProperties.lifespan * USECS_PER_SECOND);
|
||||||
if (_particleProperties.emission.shouldTrail) {
|
if (particleProperties.emission.shouldTrail) {
|
||||||
particle.position = _modelTransform.getTranslation();
|
particle.position = baseTransform.getTranslation();
|
||||||
emitOrientation = _modelTransform.getRotation() * emitOrientation;
|
emitOrientation = baseTransform.getRotation() * emitOrientation;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Position, velocity, and acceleration
|
// Position, velocity, and acceleration
|
||||||
|
@ -232,7 +232,7 @@ void ParticleEffectEntityRenderer::createParticle(uint64_t now) {
|
||||||
particle.acceleration = emitAcceleration + randFloatInRange(-1.0f, 1.0f) * accelerationSpread;
|
particle.acceleration = emitAcceleration + randFloatInRange(-1.0f, 1.0f) * accelerationSpread;
|
||||||
}
|
}
|
||||||
|
|
||||||
_cpuParticles.push_back(particle);
|
return particle;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParticleEffectEntityRenderer::stepSimulation() {
|
void ParticleEffectEntityRenderer::stepSimulation() {
|
||||||
|
@ -244,14 +244,19 @@ void ParticleEffectEntityRenderer::stepSimulation() {
|
||||||
const auto now = usecTimestampNow();
|
const auto now = usecTimestampNow();
|
||||||
const auto interval = std::min<uint64_t>(USECS_PER_SECOND / 60, now - _lastSimulated);
|
const auto interval = std::min<uint64_t>(USECS_PER_SECOND / 60, now - _lastSimulated);
|
||||||
_lastSimulated = now;
|
_lastSimulated = now;
|
||||||
|
|
||||||
|
particle::Properties particleProperties;
|
||||||
|
withReadLock([&]{
|
||||||
|
particleProperties = _particleProperties;
|
||||||
|
});
|
||||||
|
|
||||||
if (emitting()) {
|
if (_emitting && particleProperties.emitting()) {
|
||||||
uint64_t emitInterval = (uint64_t)(USECS_PER_SECOND / _particleProperties.emission.rate);
|
uint64_t emitInterval = particleProperties.emitIntervalUsecs();
|
||||||
if (interval >= _timeUntilNextEmit) {
|
if (emitInterval > 0 && interval >= _timeUntilNextEmit) {
|
||||||
auto timeRemaining = interval;
|
auto timeRemaining = interval;
|
||||||
while (timeRemaining > _timeUntilNextEmit) {
|
while (timeRemaining > _timeUntilNextEmit) {
|
||||||
// emit particle
|
// emit particle
|
||||||
createParticle(now);
|
_cpuParticles.push_back(createParticle(now, _modelTransform, particleProperties));
|
||||||
_timeUntilNextEmit = emitInterval;
|
_timeUntilNextEmit = emitInterval;
|
||||||
if (emitInterval < timeRemaining) {
|
if (emitInterval < timeRemaining) {
|
||||||
timeRemaining -= emitInterval;
|
timeRemaining -= emitInterval;
|
||||||
|
@ -263,7 +268,7 @@ void ParticleEffectEntityRenderer::stepSimulation() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kill any particles that have expired or are over the max size
|
// Kill any particles that have expired or are over the max size
|
||||||
while (_cpuParticles.size() > _particleProperties.maxParticles || (!_cpuParticles.empty() && _cpuParticles.front().expiration <= now)) {
|
while (_cpuParticles.size() > particleProperties.maxParticles || (!_cpuParticles.empty() && _cpuParticles.front().expiration <= now)) {
|
||||||
_cpuParticles.pop_front();
|
_cpuParticles.pop_front();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -93,9 +93,8 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
void createParticle(uint64_t now);
|
static CpuParticle createParticle(uint64_t now, const Transform& baseTransform, const particle::Properties& particleProperties);
|
||||||
void stepSimulation();
|
void stepSimulation();
|
||||||
bool emitting() const;
|
|
||||||
|
|
||||||
particle::Properties _particleProperties;
|
particle::Properties _particleProperties;
|
||||||
CpuParticles _cpuParticles;
|
CpuParticles _cpuParticles;
|
||||||
|
|
|
@ -30,14 +30,11 @@ TextEntityRenderer::TextEntityRenderer(const EntityItemPointer& entity) :
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TextEntityRenderer::~TextEntityRenderer() {
|
||||||
void TextEntityRenderer::onRemoveFromSceneTyped(const TypedEntityPointer& entity) {
|
|
||||||
auto geometryCache = DependencyManager::get<GeometryCache>();
|
auto geometryCache = DependencyManager::get<GeometryCache>();
|
||||||
if (_geometryID && geometryCache) {
|
if (_geometryID && geometryCache) {
|
||||||
geometryCache->releaseID(_geometryID);
|
geometryCache->releaseID(_geometryID);
|
||||||
}
|
}
|
||||||
delete _textRenderer;
|
|
||||||
_textRenderer = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TextEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const {
|
bool TextEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const {
|
||||||
|
|
|
@ -24,14 +24,13 @@ class TextEntityRenderer : public TypedEntityRenderer<TextEntityItem> {
|
||||||
using Pointer = std::shared_ptr<TextEntityRenderer>;
|
using Pointer = std::shared_ptr<TextEntityRenderer>;
|
||||||
public:
|
public:
|
||||||
TextEntityRenderer(const EntityItemPointer& entity);
|
TextEntityRenderer(const EntityItemPointer& entity);
|
||||||
|
~TextEntityRenderer();
|
||||||
private:
|
private:
|
||||||
virtual void onRemoveFromSceneTyped(const TypedEntityPointer& entity) override;
|
|
||||||
virtual bool needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const override;
|
virtual bool needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const override;
|
||||||
virtual void doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) override;
|
virtual void doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) override;
|
||||||
virtual void doRender(RenderArgs* args) override;
|
virtual void doRender(RenderArgs* args) override;
|
||||||
int _geometryID{ 0 };
|
int _geometryID{ 0 };
|
||||||
TextRenderer3D* _textRenderer;
|
std::shared_ptr<TextRenderer3D> _textRenderer;
|
||||||
bool _faceCamera;
|
bool _faceCamera;
|
||||||
glm::vec3 _dimensions;
|
glm::vec3 _dimensions;
|
||||||
glm::vec3 _textColor;
|
glm::vec3 _textColor;
|
||||||
|
|
|
@ -104,7 +104,7 @@ bool operator!=(const Properties& a, const Properties& b) {
|
||||||
return !(a == b);
|
return !(a == b);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool particle::Properties::valid() const {
|
bool Properties::valid() const {
|
||||||
if (glm::any(glm::isnan(emission.orientation))) {
|
if (glm::any(glm::isnan(emission.orientation))) {
|
||||||
qCWarning(entities) << "Bad particle data";
|
qCWarning(entities) << "Bad particle data";
|
||||||
return false;
|
return false;
|
||||||
|
@ -133,6 +133,19 @@ bool particle::Properties::valid() const {
|
||||||
(radius.gradient.spread == glm::clamp(radius.gradient.spread, MINIMUM_PARTICLE_RADIUS, MAXIMUM_PARTICLE_RADIUS));
|
(radius.gradient.spread == glm::clamp(radius.gradient.spread, MINIMUM_PARTICLE_RADIUS, MAXIMUM_PARTICLE_RADIUS));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Properties::emitting() const {
|
||||||
|
return emission.rate > 0.0f && lifespan > 0.0f && polar.start <= polar.finish;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t Properties::emitIntervalUsecs() const {
|
||||||
|
if (emission.rate > 0.0f) {
|
||||||
|
return (uint64_t)(USECS_PER_SECOND / emission.rate);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
EntityItemPointer ParticleEffectEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) {
|
EntityItemPointer ParticleEffectEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) {
|
||||||
EntityItemPointer entity { new ParticleEffectEntityItem(entityID) };
|
EntityItemPointer entity { new ParticleEffectEntityItem(entityID) };
|
||||||
entity->setProperties(properties);
|
entity->setProperties(properties);
|
||||||
|
|
|
@ -160,7 +160,9 @@ namespace particle {
|
||||||
Properties() {};
|
Properties() {};
|
||||||
Properties(const Properties& other) { *this = other; }
|
Properties(const Properties& other) { *this = other; }
|
||||||
bool valid() const;
|
bool valid() const;
|
||||||
|
bool emitting() const;
|
||||||
|
uint64_t emitIntervalUsecs() const;
|
||||||
|
|
||||||
Properties& operator =(const Properties& other) {
|
Properties& operator =(const Properties& other) {
|
||||||
color = other.color;
|
color = other.color;
|
||||||
alpha = other.alpha;
|
alpha = other.alpha;
|
||||||
|
|
|
@ -40,8 +40,11 @@ const QSurfaceFormat& getDefaultOpenGLSurfaceFormat() {
|
||||||
|
|
||||||
int glVersionToInteger(QString glVersion) {
|
int glVersionToInteger(QString glVersion) {
|
||||||
QStringList versionParts = glVersion.split(QRegularExpression("[\\.\\s]"));
|
QStringList versionParts = glVersion.split(QRegularExpression("[\\.\\s]"));
|
||||||
int majorNumber = versionParts[0].toInt();
|
int majorNumber = 0, minorNumber = 0;
|
||||||
int minorNumber = versionParts[1].toInt();
|
if (versionParts.size() >= 2) {
|
||||||
|
majorNumber = versionParts[0].toInt();
|
||||||
|
minorNumber = versionParts[1].toInt();
|
||||||
|
}
|
||||||
return (majorNumber << 16) | minorNumber;
|
return (majorNumber << 16) | minorNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -467,12 +467,14 @@ void GLVariableAllocationSupport::updateMemoryPressure() {
|
||||||
_demoteQueue = WorkQueue();
|
_demoteQueue = WorkQueue();
|
||||||
|
|
||||||
// Populate the existing textures into the queue
|
// Populate the existing textures into the queue
|
||||||
for (const auto& texture : strongTextures) {
|
if (_memoryPressureState != MemoryPressureState::Idle) {
|
||||||
// Race conditions can still leave nulls in the list, so we need to check
|
for (const auto& texture : strongTextures) {
|
||||||
if (!texture) {
|
// Race conditions can still leave nulls in the list, so we need to check
|
||||||
continue;
|
if (!texture) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
addToWorkQueue(texture);
|
||||||
}
|
}
|
||||||
addToWorkQueue(texture);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,7 +69,7 @@ float Interpolate::simpleNonLinearBlend(float fraction) {
|
||||||
}
|
}
|
||||||
|
|
||||||
float Interpolate::calculateFadeRatio(quint64 start) {
|
float Interpolate::calculateFadeRatio(quint64 start) {
|
||||||
const float FADE_TIME = 1.0f;
|
const float FADE_TIME = 0.5f;
|
||||||
float t = 2.0f * std::min(((float)(usecTimestampNow() - start)) / ((float)(FADE_TIME * USECS_PER_SECOND)), 1.0f);
|
float t = 2.0f * std::min(((float)(usecTimestampNow() - start)) / ((float)(FADE_TIME * USECS_PER_SECOND)), 1.0f);
|
||||||
float fadeRatio = (t < 1.0f) ? 0.5f * powf(2.0f, 10.0f * (t - 1.0f)) : 0.5f * (-powf(2.0f, -10.0f * (t - 1.0f)) + 2.0f);
|
float fadeRatio = (t < 1.0f) ? 0.5f * powf(2.0f, 10.0f * (t - 1.0f)) : 0.5f * (-powf(2.0f, -10.0f * (t - 1.0f)) + 2.0f);
|
||||||
|
|
||||||
|
|
|
@ -528,6 +528,12 @@ void OffscreenQmlSurface::create() {
|
||||||
|
|
||||||
connect(_quickWindow, &QQuickWindow::focusObjectChanged, this, &OffscreenQmlSurface::onFocusObjectChanged);
|
connect(_quickWindow, &QQuickWindow::focusObjectChanged, this, &OffscreenQmlSurface::onFocusObjectChanged);
|
||||||
|
|
||||||
|
// acquireEngine interrogates the GL context, so we need to have the context current here
|
||||||
|
if (!_canvas->makeCurrent()) {
|
||||||
|
qFatal("Failed to make context current for QML Renderer");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Create a QML engine.
|
// Create a QML engine.
|
||||||
auto qmlEngine = acquireEngine(_quickWindow);
|
auto qmlEngine = acquireEngine(_quickWindow);
|
||||||
|
|
||||||
|
@ -540,11 +546,6 @@ void OffscreenQmlSurface::create() {
|
||||||
// FIXME Compatibility mechanism for existing HTML and JS that uses eventBridgeWrapper
|
// FIXME Compatibility mechanism for existing HTML and JS that uses eventBridgeWrapper
|
||||||
// Find a way to flag older scripts using this mechanism and wanr that this is deprecated
|
// Find a way to flag older scripts using this mechanism and wanr that this is deprecated
|
||||||
_qmlContext->setContextProperty("eventBridgeWrapper", new EventBridgeWrapper(this, _qmlContext));
|
_qmlContext->setContextProperty("eventBridgeWrapper", new EventBridgeWrapper(this, _qmlContext));
|
||||||
|
|
||||||
if (!_canvas->makeCurrent()) {
|
|
||||||
qWarning("Failed to make context current for QML Renderer");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_renderControl->initialize(_canvas->getContext());
|
_renderControl->initialize(_canvas->getContext());
|
||||||
|
|
||||||
// When Quick says there is a need to render, we will not render immediately. Instead,
|
// When Quick says there is a need to render, we will not render immediately. Instead,
|
||||||
|
@ -639,7 +640,7 @@ void OffscreenQmlSurface::setBaseUrl(const QUrl& baseUrl) {
|
||||||
_qmlContext->setBaseUrl(baseUrl);
|
_qmlContext->setBaseUrl(baseUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OffscreenQmlSurface::load(const QUrl& qmlSource, bool createNewContext, std::function<void(QQmlContext*, QObject*)> f) {
|
void OffscreenQmlSurface::load(const QUrl& qmlSource, bool createNewContext, std::function<void(QQmlContext*, QObject*)> onQmlLoadedCallback) {
|
||||||
if (QThread::currentThread() != thread()) {
|
if (QThread::currentThread() != thread()) {
|
||||||
qCWarning(uiLogging) << "Called load on a non-surface thread";
|
qCWarning(uiLogging) << "Called load on a non-surface thread";
|
||||||
}
|
}
|
||||||
|
@ -659,28 +660,28 @@ void OffscreenQmlSurface::load(const QUrl& qmlSource, bool createNewContext, std
|
||||||
auto qmlComponent = new QQmlComponent(_qmlContext->engine(), finalQmlSource, QQmlComponent::PreferSynchronous);
|
auto qmlComponent = new QQmlComponent(_qmlContext->engine(), finalQmlSource, QQmlComponent::PreferSynchronous);
|
||||||
if (qmlComponent->isLoading()) {
|
if (qmlComponent->isLoading()) {
|
||||||
connect(qmlComponent, &QQmlComponent::statusChanged, this,
|
connect(qmlComponent, &QQmlComponent::statusChanged, this,
|
||||||
[this, qmlComponent, targetContext, f](QQmlComponent::Status) {
|
[this, qmlComponent, targetContext, onQmlLoadedCallback](QQmlComponent::Status) {
|
||||||
finishQmlLoad(qmlComponent, targetContext, f);
|
finishQmlLoad(qmlComponent, targetContext, onQmlLoadedCallback);
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
finishQmlLoad(qmlComponent, targetContext, f);
|
finishQmlLoad(qmlComponent, targetContext, onQmlLoadedCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OffscreenQmlSurface::loadInNewContext(const QUrl& qmlSource, std::function<void(QQmlContext*, QObject*)> f) {
|
void OffscreenQmlSurface::loadInNewContext(const QUrl& qmlSource, std::function<void(QQmlContext*, QObject*)> onQmlLoadedCallback) {
|
||||||
load(qmlSource, true, f);
|
load(qmlSource, true, onQmlLoadedCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OffscreenQmlSurface::load(const QUrl& qmlSource, std::function<void(QQmlContext*, QObject*)> f) {
|
void OffscreenQmlSurface::load(const QUrl& qmlSource, std::function<void(QQmlContext*, QObject*)> onQmlLoadedCallback) {
|
||||||
load(qmlSource, false, f);
|
load(qmlSource, false, onQmlLoadedCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OffscreenQmlSurface::clearCache() {
|
void OffscreenQmlSurface::clearCache() {
|
||||||
_qmlContext->engine()->clearComponentCache();
|
_qmlContext->engine()->clearComponentCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OffscreenQmlSurface::finishQmlLoad(QQmlComponent* qmlComponent, QQmlContext* qmlContext, std::function<void(QQmlContext*, QObject*)> f) {
|
void OffscreenQmlSurface::finishQmlLoad(QQmlComponent* qmlComponent, QQmlContext* qmlContext, std::function<void(QQmlContext*, QObject*)> onQmlLoadedCallback) {
|
||||||
disconnect(qmlComponent, &QQmlComponent::statusChanged, this, 0);
|
disconnect(qmlComponent, &QQmlComponent::statusChanged, this, 0);
|
||||||
if (qmlComponent->isError()) {
|
if (qmlComponent->isError()) {
|
||||||
for (const auto& error : qmlComponent->errors()) {
|
for (const auto& error : qmlComponent->errors()) {
|
||||||
|
@ -690,7 +691,6 @@ void OffscreenQmlSurface::finishQmlLoad(QQmlComponent* qmlComponent, QQmlContext
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QObject* newObject = qmlComponent->beginCreate(qmlContext);
|
QObject* newObject = qmlComponent->beginCreate(qmlContext);
|
||||||
if (qmlComponent->isError()) {
|
if (qmlComponent->isError()) {
|
||||||
for (const auto& error : qmlComponent->errors()) {
|
for (const auto& error : qmlComponent->errors()) {
|
||||||
|
@ -704,7 +704,20 @@ void OffscreenQmlSurface::finishQmlLoad(QQmlComponent* qmlComponent, QQmlContext
|
||||||
}
|
}
|
||||||
|
|
||||||
qmlContext->engine()->setObjectOwnership(this, QQmlEngine::CppOwnership);
|
qmlContext->engine()->setObjectOwnership(this, QQmlEngine::CppOwnership);
|
||||||
f(qmlContext, newObject);
|
|
||||||
|
// All quick items should be focusable
|
||||||
|
QQuickItem* newItem = qobject_cast<QQuickItem*>(newObject);
|
||||||
|
if (newItem) {
|
||||||
|
// Make sure we make items focusable (critical for
|
||||||
|
// supporting keyboard shortcuts)
|
||||||
|
newItem->setFlag(QQuickItem::ItemIsFocusScope, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure we will call callback for this codepath
|
||||||
|
// Call this before qmlComponent->completeCreate() otherwise ghost window appears
|
||||||
|
if (newItem && _rootItem) {
|
||||||
|
onQmlLoadedCallback(qmlContext, newObject);
|
||||||
|
}
|
||||||
|
|
||||||
QObject* eventBridge = qmlContext->contextProperty("eventBridge").value<QObject*>();
|
QObject* eventBridge = qmlContext->contextProperty("eventBridge").value<QObject*>();
|
||||||
if (qmlContext != _qmlContext && eventBridge && eventBridge != this) {
|
if (qmlContext != _qmlContext && eventBridge && eventBridge != this) {
|
||||||
|
@ -716,15 +729,6 @@ void OffscreenQmlSurface::finishQmlLoad(QQmlComponent* qmlComponent, QQmlContext
|
||||||
qmlComponent->completeCreate();
|
qmlComponent->completeCreate();
|
||||||
qmlComponent->deleteLater();
|
qmlComponent->deleteLater();
|
||||||
|
|
||||||
|
|
||||||
// All quick items should be focusable
|
|
||||||
QQuickItem* newItem = qobject_cast<QQuickItem*>(newObject);
|
|
||||||
if (newItem) {
|
|
||||||
// Make sure we make items focusable (critical for
|
|
||||||
// supporting keyboard shortcuts)
|
|
||||||
newItem->setFlag(QQuickItem::ItemIsFocusScope, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we already have a root, just set a couple of flags and the ancestry
|
// If we already have a root, just set a couple of flags and the ancestry
|
||||||
if (newItem && _rootItem) {
|
if (newItem && _rootItem) {
|
||||||
// Allow child windows to be destroyed from JS
|
// Allow child windows to be destroyed from JS
|
||||||
|
@ -747,6 +751,8 @@ void OffscreenQmlSurface::finishQmlLoad(QQmlComponent* qmlComponent, QQmlContext
|
||||||
_rootItem = newItem;
|
_rootItem = newItem;
|
||||||
_rootItem->setParentItem(_quickWindow->contentItem());
|
_rootItem->setParentItem(_quickWindow->contentItem());
|
||||||
_rootItem->setSize(_quickWindow->renderTargetSize());
|
_rootItem->setSize(_quickWindow->renderTargetSize());
|
||||||
|
// Call this callback after rootitem is set, otherwise VrMenu wont work
|
||||||
|
onQmlLoadedCallback(qmlContext, newObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OffscreenQmlSurface::updateQuick() {
|
void OffscreenQmlSurface::updateQuick() {
|
||||||
|
|
|
@ -50,11 +50,11 @@ public:
|
||||||
void resize(const QSize& size, bool forceResize = false);
|
void resize(const QSize& size, bool forceResize = false);
|
||||||
QSize size() const;
|
QSize size() const;
|
||||||
|
|
||||||
Q_INVOKABLE void load(const QUrl& qmlSource, bool createNewContext, std::function<void(QQmlContext*, QObject*)> f = [](QQmlContext*, QObject*) {});
|
Q_INVOKABLE void load(const QUrl& qmlSource, bool createNewContext, std::function<void(QQmlContext*, QObject*)> onQmlLoadedCallback = [](QQmlContext*, QObject*) {});
|
||||||
Q_INVOKABLE void loadInNewContext(const QUrl& qmlSource, std::function<void(QQmlContext*, QObject*)> f = [](QQmlContext*, QObject*) {});
|
Q_INVOKABLE void loadInNewContext(const QUrl& qmlSource, std::function<void(QQmlContext*, QObject*)> onQmlLoadedCallback = [](QQmlContext*, QObject*) {});
|
||||||
Q_INVOKABLE void load(const QUrl& qmlSource, std::function<void(QQmlContext*, QObject*)> f = [](QQmlContext*, QObject*) {});
|
Q_INVOKABLE void load(const QUrl& qmlSource, std::function<void(QQmlContext*, QObject*)> onQmlLoadedCallback = [](QQmlContext*, QObject*) {});
|
||||||
Q_INVOKABLE void load(const QString& qmlSourceFile, std::function<void(QQmlContext*, QObject*)> f = [](QQmlContext*, QObject*) {}) {
|
Q_INVOKABLE void load(const QString& qmlSourceFile, std::function<void(QQmlContext*, QObject*)> onQmlLoadedCallback = [](QQmlContext*, QObject*) {}) {
|
||||||
return load(QUrl(qmlSourceFile), f);
|
return load(QUrl(qmlSourceFile), onQmlLoadedCallback);
|
||||||
}
|
}
|
||||||
void clearCache();
|
void clearCache();
|
||||||
void setMaxFps(uint8_t maxFps) { _maxFps = maxFps; }
|
void setMaxFps(uint8_t maxFps) { _maxFps = maxFps; }
|
||||||
|
@ -120,7 +120,7 @@ protected:
|
||||||
private:
|
private:
|
||||||
static QOpenGLContext* getSharedContext();
|
static QOpenGLContext* getSharedContext();
|
||||||
|
|
||||||
void finishQmlLoad(QQmlComponent* qmlComponent, QQmlContext* qmlContext, std::function<void(QQmlContext*, QObject*)> f);
|
void finishQmlLoad(QQmlComponent* qmlComponent, QQmlContext* qmlContext, std::function<void(QQmlContext*, QObject*)> onQmlLoadedCallback);
|
||||||
QPointF mapWindowToUi(const QPointF& sourcePosition, QObject* sourceObject);
|
QPointF mapWindowToUi(const QPointF& sourcePosition, QObject* sourceObject);
|
||||||
void setupFbo();
|
void setupFbo();
|
||||||
bool allowNewFrame(uint8_t fps);
|
bool allowNewFrame(uint8_t fps);
|
||||||
|
|
|
@ -54,49 +54,6 @@ SDL_JoystickID SDL2Manager::getInstanceId(SDL_GameController* controller) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDL2Manager::init() {
|
void SDL2Manager::init() {
|
||||||
loadSettings();
|
|
||||||
|
|
||||||
auto preferences = DependencyManager::get<Preferences>();
|
|
||||||
static const QString SDL2_PLUGIN { "Game Controller" };
|
|
||||||
{
|
|
||||||
auto getter = [this]()->bool { return _isEnabled; };
|
|
||||||
auto setter = [this](bool value) {
|
|
||||||
_isEnabled = value;
|
|
||||||
saveSettings();
|
|
||||||
};
|
|
||||||
auto preference = new CheckPreference(SDL2_PLUGIN, "Enabled", getter, setter);
|
|
||||||
preferences->addPreference(preference);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool initSuccess = (SDL_Init(SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC) == 0);
|
|
||||||
|
|
||||||
if (initSuccess) {
|
|
||||||
int joystickCount = SDL_NumJoysticks();
|
|
||||||
|
|
||||||
for (int i = 0; i < joystickCount; i++) {
|
|
||||||
SDL_GameController* controller = SDL_GameControllerOpen(i);
|
|
||||||
|
|
||||||
if (controller) {
|
|
||||||
SDL_JoystickID id = getInstanceId(controller);
|
|
||||||
if (!_openJoysticks.contains(id)) {
|
|
||||||
//Joystick* joystick = new Joystick(id, SDL_GameControllerName(controller), controller);
|
|
||||||
Joystick::Pointer joystick = std::make_shared<Joystick>(id, controller);
|
|
||||||
_openJoysticks[id] = joystick;
|
|
||||||
auto userInputMapper = DependencyManager::get<controller::UserInputMapper>();
|
|
||||||
userInputMapper->registerDevice(joystick);
|
|
||||||
auto name = SDL_GameControllerName(controller);
|
|
||||||
_subdeviceNames << name;
|
|
||||||
emit joystickAdded(joystick.get());
|
|
||||||
emit subdeviceConnected(getName(), name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_isInitialized = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
qDebug() << "Error initializing SDL2 Manager";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList SDL2Manager::getSubdeviceNames() {
|
QStringList SDL2Manager::getSubdeviceNames() {
|
||||||
|
@ -110,8 +67,61 @@ void SDL2Manager::deinit() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SDL2Manager::activate() {
|
bool SDL2Manager::activate() {
|
||||||
|
|
||||||
|
// FIXME for some reason calling this code in the `init` function triggers a crash
|
||||||
|
// on OSX in PR builds, but not on my local debug build. Attempting a workaround by
|
||||||
|
//
|
||||||
|
static std::once_flag once;
|
||||||
|
std::call_once(once, [&]{
|
||||||
|
loadSettings();
|
||||||
|
|
||||||
|
auto preferences = DependencyManager::get<Preferences>();
|
||||||
|
static const QString SDL2_PLUGIN { "Game Controller" };
|
||||||
|
{
|
||||||
|
auto getter = [this]()->bool { return _isEnabled; };
|
||||||
|
auto setter = [this](bool value) {
|
||||||
|
_isEnabled = value;
|
||||||
|
saveSettings();
|
||||||
|
};
|
||||||
|
auto preference = new CheckPreference(SDL2_PLUGIN, "Enabled", getter, setter);
|
||||||
|
preferences->addPreference(preference);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool initSuccess = (SDL_Init(SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC) == 0);
|
||||||
|
|
||||||
|
if (initSuccess) {
|
||||||
|
int joystickCount = SDL_NumJoysticks();
|
||||||
|
|
||||||
|
for (int i = 0; i < joystickCount; i++) {
|
||||||
|
SDL_GameController* controller = SDL_GameControllerOpen(i);
|
||||||
|
|
||||||
|
if (controller) {
|
||||||
|
SDL_JoystickID id = getInstanceId(controller);
|
||||||
|
if (!_openJoysticks.contains(id)) {
|
||||||
|
//Joystick* joystick = new Joystick(id, SDL_GameControllerName(controller), controller);
|
||||||
|
Joystick::Pointer joystick = std::make_shared<Joystick>(id, controller);
|
||||||
|
_openJoysticks[id] = joystick;
|
||||||
|
auto userInputMapper = DependencyManager::get<controller::UserInputMapper>();
|
||||||
|
userInputMapper->registerDevice(joystick);
|
||||||
|
auto name = SDL_GameControllerName(controller);
|
||||||
|
_subdeviceNames << name;
|
||||||
|
emit joystickAdded(joystick.get());
|
||||||
|
emit subdeviceConnected(getName(), name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_isInitialized = true;
|
||||||
|
} else {
|
||||||
|
qDebug() << "Error initializing SDL2 Manager";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!_isInitialized) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
InputPlugin::activate();
|
InputPlugin::activate();
|
||||||
|
|
||||||
auto userInputMapper = DependencyManager::get<controller::UserInputMapper>();
|
auto userInputMapper = DependencyManager::get<controller::UserInputMapper>();
|
||||||
for (auto joystick : _openJoysticks) {
|
for (auto joystick : _openJoysticks) {
|
||||||
userInputMapper->registerDevice(joystick);
|
userInputMapper->registerDevice(joystick);
|
||||||
|
|
Loading…
Reference in a new issue