diff --git a/CMakeLists.txt b/CMakeLists.txt index c35dfa48b4..09410db6b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,8 +22,8 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -cmake_minimum_required(VERSION 3.10 FATAL_ERROR) -cmake_policy(SET CMP0120 NEW) +cmake_minimum_required(VERSION 3.25 FATAL_ERROR) +cmake_policy(VERSION 3.25) project(OpenSpace) @@ -32,18 +32,12 @@ set(OPENSPACE_VERSION_MINOR 19) set(OPENSPACE_VERSION_PATCH 0) set(OPENSPACE_VERSION_STRING "") -set(OPENSPACE_BASE_DIR "${PROJECT_SOURCE_DIR}") -set(OPENSPACE_CMAKE_EXT_DIR "${OPENSPACE_BASE_DIR}/support/cmake") -set(GHOUL_BASE_DIR "${OPENSPACE_BASE_DIR}/ext/ghoul") - -include(${OPENSPACE_CMAKE_EXT_DIR}/module_common.cmake) -include(${GHOUL_BASE_DIR}/support/cmake/copy_shared_libraries.cmake) -include(${GHOUL_BASE_DIR}/support/cmake/handle_external_library.cmake) -include(${GHOUL_BASE_DIR}/support/cmake/message_macros.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_common.cmake) +include(${PROJECT_SOURCE_DIR}/ext/ghoul/support/cmake/message_macros.cmake) begin_header("Configuring OpenSpace project") -# Bail out if the user tries to generate a 32 bit project. +# Bail out if the user tries to generate a 32 bit project if (NOT ${CMAKE_SIZEOF_VOID_P} EQUAL 8) message(FATAL_ERROR "OpenSpace can only be generated for 64 bit architectures.") endif () @@ -51,9 +45,7 @@ endif () ########################################################################################## # Cleanup project # ########################################################################################## -set(OPENSPACE_APPS_DIR "${OPENSPACE_BASE_DIR}/apps") - -if (NOT EXISTS "${OPENSPACE_BASE_DIR}/ext/ghoul/CMakeLists.txt") +if (NOT EXISTS "${PROJECT_SOURCE_DIR}/ext/ghoul/CMakeLists.txt") message(FATAL_ERROR "Git submodules are missing. Please run " "git submodule update --init --recursive to download the missing dependencies." ) @@ -68,11 +60,13 @@ mark_as_advanced(CMAKE_BACKWARDS_COMPATIBILITY CMAKE_BUILD_TYPE CMAKE_DEBUG_POST ) # Set build output directories -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${OPENSPACE_CMAKE_EXT_DIR}) -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OPENSPACE_BASE_DIR}/bin) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/support/cmake) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin) -# "OpenSpace Helper" is not a valid CMake target name under OLD -cmake_policy(SET CMP0037 NEW) +if (MSVC) + # Force all builds to be multi-threaded and increase number of sections in obj files + add_definitions(/MP /bigobj) +endif () ########################################################################################## # Main # @@ -106,8 +100,6 @@ else () set(OPENSPACE_GIT_STATUS "") endif () -option(OPENSPACE_WARNINGS_AS_ERRORS "Treat warnings as errors" OFF) - if (MSVC) option(OPENSPACE_BREAK_ON_FLOATING_POINT_EXCEPTION "Raise exceptions when encountering Inf's or Nan's in floating point numbers" OFF) @@ -134,31 +126,26 @@ if (MSVC) set(GHOUL_OPTIMIZATION_ENABLE_OTHER_OPTIMIZATIONS ${OPENSPACE_OPTIMIZATION_ENABLE_OTHER_OPTIMIZATIONS} CACHE BOOL "" FORCE) endif () -if (UNIX) - if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -stdlib=libc++") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -lc++ -lc++abi") - else () - if (NOT CMAKE_BUILD_TYPE) - #Can set to "RelWithDebInfo" or "Debug" also, but problems occur if this is blank by default - set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Default build type" FORCE) - endif () - if (NOT DEFINED CMAKE_CXX_FLAGS OR CMAKE_CXX_FLAGS MATCHES "") - set(CMAKE_CXX_FLAGS " ") - endif () - STRING(FIND ${CMAKE_CXX_FLAGS} "GLM_ENABLE_EXPERIMENTAL" GLM_FLAG_POS) - if (${GLM_FLAG_POS} EQUAL -1) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGLM_ENABLE_EXPERIMENTAL" CACHE STRING "" FORCE) - endif () - set(OpenGL_GL_PREFERENCE "GLVND" CACHE STRING "OpenGL Preference setting necessary for linux" FORCE) - #Fix for gcc tolerating space in target name - if (NOT DEFINED CMAKE_C_FLAGS OR CMAKE_C_FLAGS MATCHES "") - set(CMAKE_C_FLAGS " ") - endif () - STRING(FIND ${CMAKE_C_FLAGS} "_GNU_SOURCE" GNUSOURCE_FLAG_POS) - if (${GNUSOURCE_FLAG_POS} EQUAL -1) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_GNU_SOURCE" CACHE STRING "" FORCE) - endif () +if (UNIX AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") + if (NOT CMAKE_BUILD_TYPE) + # Can set to "RelWithDebInfo" or "Debug" also, but problems occur if this is blank by default + set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Default build type" FORCE) + endif () + if (NOT DEFINED CMAKE_CXX_FLAGS OR CMAKE_CXX_FLAGS MATCHES "") + set(CMAKE_CXX_FLAGS " ") + endif () + STRING(FIND ${CMAKE_CXX_FLAGS} "GLM_ENABLE_EXPERIMENTAL" GLM_FLAG_POS) + if (${GLM_FLAG_POS} EQUAL -1) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGLM_ENABLE_EXPERIMENTAL" CACHE STRING "" FORCE) + endif () + set(OpenGL_GL_PREFERENCE "GLVND" CACHE STRING "OpenGL Preference setting necessary for linux" FORCE) + # Fix for GCC tolerating space in target name + if (NOT DEFINED CMAKE_C_FLAGS OR CMAKE_C_FLAGS MATCHES "") + set(CMAKE_C_FLAGS " ") + endif () + STRING(FIND ${CMAKE_C_FLAGS} "_GNU_SOURCE" GNUSOURCE_FLAG_POS) + if (${GNUSOURCE_FLAG_POS} EQUAL -1) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_GNU_SOURCE" CACHE STRING "" FORCE) endif () endif () @@ -176,12 +163,12 @@ add_custom_target( add_dependencies(run_codegen codegen) add_custom_command( OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/__codegen.h" - COMMAND codegen ARGS "${OPENSPACE_BASE_DIR}/modules" "${OPENSPACE_BASE_DIR}/src" + COMMAND codegen ARGS "${PROJECT_SOURCE_DIR}/modules" "${PROJECT_SOURCE_DIR}/src" VERBATIM ) -set_folder_location(codegen-lib "support") -set_folder_location(codegen "support") -set_folder_location(run_codegen "support") +set_target_properties(codegen-lib PROPERTIES FOLDER "support") +set_target_properties(codegen PROPERTIES FOLDER "support") +set_target_properties(run_codegen PROPERTIES FOLDER "support") # Qt @@ -218,12 +205,12 @@ end_header("End: Configuring Modules") add_subdirectory(support/coding/codegen/tests) -set_folder_location(run_test_codegen "Unit Tests/support") -set_folder_location(codegentest "Unit Tests") +set_target_properties(run_test_codegen PROPERTIES FOLDER "Unit Tests/support") +set_target_properties(codegentest PROPERTIES FOLDER "Unit Tests") begin_header("Configuring Applications") -add_subdirectory("${OPENSPACE_APPS_DIR}") +add_subdirectory(apps) end_header("End: Configuring Applications") @@ -235,7 +222,7 @@ endif () option(OPENSPACE_HAVE_TESTS "Activate the OpenSpace unit tests" ON) if (OPENSPACE_HAVE_TESTS) begin_header("Generating OpenSpace unit test") - add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/tests") + add_subdirectory(tests) end_header() endif (OPENSPACE_HAVE_TESTS) @@ -250,7 +237,7 @@ if (OPENSPACE_MODULE_WEBBROWSER AND CEF_ROOT) set(PROJECT_ARCH "x86_64") if (WIN32) - set(RESOURCE_FILE ${OPENSPACE_APPS_DIR}/OpenSpace/openspace.rc) + set(RESOURCE_FILE openspace.rc) endif () # Add the CEF binary distribution's cmake/ directory to the module path and @@ -266,6 +253,6 @@ endif () ########################################################################################## # Manage the CPack packaging -include(${OPENSPACE_CMAKE_EXT_DIR}/packaging.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/packaging.cmake) end_header("End: Configuring OpenSpace project") diff --git a/README.md b/README.md index 25a841efb1..c5f30645b6 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ OpenSpace requires at least support for [OpenGL](https://www.opengl.org/) versio This repository contains the source code and example profiles for OpenSpace, but does not contain any data. To build and install the application, please check out the [GitHub Wiki](https://github.com/OpenSpace/OpenSpace/wiki). Here, you will find two pages, a [build instruction](https://github.com/OpenSpace/OpenSpace/wiki/Compiling) for all operating systems and then additional instructions for [Windows](https://github.com/OpenSpace/OpenSpace/wiki/Compiling-Windows), [Linux (Ubuntu)](https://github.com/OpenSpace/OpenSpace/wiki/Compiling-Ubuntu), and [MacOS](https://github.com/OpenSpace/OpenSpace/wiki/Compiling-MacOS). Please note that the Apple Silicon series of chips do not support OpenGL natively and Metal 2 does not support `double` precision accuracy (see [here](https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf) Section 2.1), therefore only the Intel processors for MacOS are supported and maintained. Requirements for compiling are: - - CMake version 3.10 or above + - CMake version 3.25 or above - C++ compiler supporting C++20 (MSVC 19.31, GCC11, Clang14, AppleClang 13.1.6) - [Boost](http://www.boost.org/) - [Qt](http://www.qt.io/download) diff --git a/apps/OpenSpace-MinVR/CMakeLists.txt b/apps/OpenSpace-MinVR/CMakeLists.txt index ae592d8d42..4f9e59fd48 100644 --- a/apps/OpenSpace-MinVR/CMakeLists.txt +++ b/apps/OpenSpace-MinVR/CMakeLists.txt @@ -22,9 +22,9 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${GHOUL_BASE_DIR}/support/cmake/copy_shared_libraries.cmake) -include(${OPENSPACE_CMAKE_EXT_DIR}/application_definition.cmake) -include(${OPENSPACE_CMAKE_EXT_DIR}/global_variables.cmake) +include(${PROJECT_SOURCE_DIR}/ext/ghoul/support/cmake/copy_shared_libraries.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/application_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/global_variables.cmake) set(MACOSX_BUNDLE_ICON_FILE openspace.icns) @@ -57,7 +57,7 @@ target_link_libraries(OpenSpace-MinVR PUBLIC openspace-core MinVR) # target as of July 2017, which is needed. if (OPENSPACE_MODULE_WEBBROWSER AND CEF_ROOT) if (WIN32) - set(RESOURCE_FILE ${OPENSPACE_APPS_DIR}/OpenSpace-MinVR/openspace.rc) + set(RESOURCE_FILE openspace.rc) endif () # Add the CEF binary distribution's cmake/ directory to the module path and diff --git a/apps/OpenSpace/CMakeLists.txt b/apps/OpenSpace/CMakeLists.txt index 9dd334e0f9..80670c427e 100644 --- a/apps/OpenSpace/CMakeLists.txt +++ b/apps/OpenSpace/CMakeLists.txt @@ -22,9 +22,8 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${GHOUL_BASE_DIR}/support/cmake/copy_shared_libraries.cmake) -include(${GHOUL_BASE_DIR}/support/cmake/message_macros.cmake) -include(${OPENSPACE_CMAKE_EXT_DIR}/application_definition.cmake) +include(${PROJECT_SOURCE_DIR}/ext/ghoul/support/cmake/message_macros.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/application_definition.cmake) # We are getting all_enabled_modules from the handle_applications.cmake file which gets # it from the main CMakeLists file @@ -43,14 +42,14 @@ if (OPENSPACE_OPENVR_SUPPORT) if (WIN32) find_path(SGCT_OPENVR_INCLUDE_DIRECTORY NAMES SGCTOpenVR.h - PATHS ${OPENSPACE_BASE_DIR}/ext/sgct/additional_includes/openvr NO_DEFAULT_PATH + PATHS ${PROJECT_SOURCE_DIR}/ext/sgct/additional_includes/openvr NO_DEFAULT_PATH REQUIRED ) else () find_path(SGCT_OPENVR_INCLUDE_DIRECTORY NAMES SGCTOpenVR.h PATH_SUFFIXES SGCTOpenVR - PATHS ${OPENSPACE_BASE_DIR}/ext/sgct/additional_includes/openvr + PATHS ${PROJECT_SOURCE_DIR}/ext/sgct/additional_includes/openvr REQUIRED ) endif () @@ -115,19 +114,14 @@ set(SGCT_TEXT OFF CACHE BOOL "" FORCE) set(SGCT_DEP_INCLUDE_FREETYPE OFF CACHE BOOL "" FORCE) set(SGCT_DEP_INCLUDE_FMT OFF CACHE BOOL "" FORCE) set(SGCT_DEP_INCLUDE_SCN OFF CACHE BOOL "" FORCE) +set(SGCT_DEP_INCLUDE_CATCH2 OFF CACHE BOOL "" FORCE) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/ext/sgct) target_link_libraries(OpenSpace PRIVATE sgct) -set_folder_location(sgct "External") -set_folder_location(glfw "External") -set_folder_location(miniziplibstatic "External") -set_folder_location(png16_static "External") -set_folder_location(quat "External") -set_folder_location(tinyxml2static "External") -set_folder_location(vrpn "External") -set_folder_location(zlibstatic "External") -set_folder_location(SGCTTest "Unit Tests") +set_target_properties(sgct PROPERTIES FOLDER "External") +set_target_properties(glfw PROPERTIES FOLDER "External") +set_target_properties(SGCTTest PROPERTIES FOLDER "External") if (UNIX AND (NOT APPLE)) target_link_libraries(OpenSpace PRIVATE Xcursor Xinerama X11) @@ -161,7 +155,7 @@ if (OPENSPACE_MODULE_WEBBROWSER AND CEF_ROOT) set(PROJECT_ARCH "x86_64") if (WIN32) - set(RESOURCE_FILE ${OPENSPACE_APPS_DIR}/OpenSpace/openspace.rc) + set(RESOURCE_FILE openspace.rc) endif () # Add the CEF binary distribution's cmake/ directory to the module path and diff --git a/apps/OpenSpace/ext/launcher/CMakeLists.txt b/apps/OpenSpace/ext/launcher/CMakeLists.txt index c31f3087db..b1c87bfe64 100644 --- a/apps/OpenSpace/ext/launcher/CMakeLists.txt +++ b/apps/OpenSpace/ext/launcher/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/set_openspace_compile_settings.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/set_openspace_compile_settings.cmake) set(HEADER_FILES include/filesystemaccess.h @@ -113,8 +113,9 @@ target_include_directories( openspace-ui-launcher PUBLIC include - ${OPENSPACE_APPS_DIR}/OpenSpace/ext/sgct/include - ${OPENSPACE_APPS_DIR}/OpenSpace/ext/sgct/sgct/ext/glm + # @TODO: This should be handled in a better way + ../sgct/include + ../sgct/sgct/ext/glm ) target_link_libraries( openspace-ui-launcher diff --git a/apps/OpenSpace/ext/launcher/include/profile/actiondialog.h b/apps/OpenSpace/ext/launcher/include/profile/actiondialog.h index b71af7cbb7..9b0bd5f717 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/actiondialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/actiondialog.h @@ -101,7 +101,7 @@ private: QDialogButtonBox* saveButtons = nullptr; } _keybindingWidgets; - QDialogButtonBox* _mainButtons = nullptr; + QDialogButtonBox* _mainButton = nullptr; }; #endif // __OPENSPACE_UI_LAUNCHER___ACTIONDIALOG___H__ diff --git a/apps/OpenSpace/ext/launcher/src/profile/actiondialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/actiondialog.cpp index 14c3174cbe..b90fa9a125 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/actiondialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/actiondialog.cpp @@ -114,17 +114,13 @@ void ActionDialog::createWidgets() { layout->addWidget(new Line, 16, 0, 1, 3); - _mainButtons = new QDialogButtonBox; - _mainButtons->setStandardButtons(QDialogButtonBox::Save | QDialogButtonBox::Cancel); + _mainButton = new QDialogButtonBox; + _mainButton->setStandardButtons(QDialogButtonBox::Close); QObject::connect( - _mainButtons, &QDialogButtonBox::accepted, - this, &ActionDialog::applyChanges - ); - QObject::connect( - _mainButtons, &QDialogButtonBox::rejected, + _mainButton, &QDialogButtonBox::rejected, this, &ActionDialog::reject ); - layout->addWidget(_mainButtons, 17, 2, Qt::AlignRight); + layout->addWidget(_mainButton, 17, 2, Qt::AlignRight); } void ActionDialog::createActionWidgets(QGridLayout* layout) { @@ -427,12 +423,6 @@ void ActionDialog::createKeyboardWidgets(QGridLayout* layout) { layout->addWidget(_keybindingWidgets.saveButtons, 14, 2, Qt::AlignRight); } -void ActionDialog::applyChanges() { - *_actions = std::move(_actionData); - *_keybindings = std::move(_keybindingsData); - accept(); -} - Profile::Action* ActionDialog::selectedAction() { QListWidgetItem* item = _actionWidgets.list->currentItem(); const int idx = _actionWidgets.list->row(item); @@ -476,6 +466,10 @@ void ActionDialog::actionRemove() { _keybindingsData.erase(_keybindingsData.begin() + i); delete _keybindingWidgets.list->takeItem(static_cast(i)); i--; + //Save the updated keybindings to the profile + if (_keybindings) { + *_keybindings = _keybindingsData; + } } else { // If the user chooses 'No' at least once, we have to bail @@ -494,6 +488,10 @@ void ActionDialog::actionRemove() { _keybindingWidgets.action->addItem(QString::fromStdString(a.identifier)); } clearKeybindingFields(); + //Save the updated actions to the profile + if (_actions) { + *_actions = _actionData; + } return; } } @@ -523,9 +521,10 @@ void ActionDialog::actionSelected() { _actionWidgets.addButton->setEnabled(false); _actionWidgets.removeButton->setEnabled(true); _actionWidgets.saveButtons->setEnabled(true); - if (_mainButtons) { - _mainButtons->setEnabled(false); + if (_mainButton) { + _mainButton->setEnabled(false); } + _actionWidgets.list->setEnabled(false); } else { // No action selected @@ -533,9 +532,10 @@ void ActionDialog::actionSelected() { _actionWidgets.removeButton->setEnabled(false); _actionWidgets.saveButtons->setEnabled(false); //Keybinding panel must also be in valid state to re-enable main start button - if (_mainButtons && !_keybindingWidgets.saveButtons->isEnabled()) { - _mainButtons->setEnabled(true); + if (_mainButton && !_keybindingWidgets.saveButtons->isEnabled()) { + _mainButton->setEnabled(true); } + _actionWidgets.list->setEnabled(true); } } @@ -610,6 +610,10 @@ void ActionDialog::actionSaved() { for (const Profile::Action& a : _actionData) { _keybindingWidgets.action->addItem(QString::fromStdString(a.identifier)); } + //Save the updated actions to the profile + if (_actions) { + *_actions = _actionData; + } clearKeybindingFields(); clearActionFields(); } @@ -630,6 +634,7 @@ void ActionDialog::clearActionFields() { _actionWidgets.script->clear(); _actionWidgets.script->setEnabled(false); _actionWidgets.saveButtons->setEnabled(false); + _actionWidgets.list->setEnabled(true); } void ActionDialog::actionRejected() { @@ -675,6 +680,10 @@ void ActionDialog::keybindingRemove() { clearKeybindingFields(); _keybindingsData.erase(_keybindingsData.begin() + i); delete _keybindingWidgets.list->takeItem(static_cast(i)); + //Save the updated keybindings to the profile + if (_keybindings) { + *_keybindings = _keybindingsData; + } return; } } @@ -716,9 +725,10 @@ void ActionDialog::keybindingSelected() { _keybindingWidgets.saveButtons->button(QDialogButtonBox::Save)->setEnabled( _keybindingWidgets.key->currentIndex() > 0 ); - if (_mainButtons) { - _mainButtons->setEnabled(false); + if (_mainButton) { + _mainButton->setEnabled(false); } + _keybindingWidgets.list->setEnabled(false); } else { // No keybinding selected @@ -726,9 +736,10 @@ void ActionDialog::keybindingSelected() { _keybindingWidgets.removeButton->setEnabled(false); _keybindingWidgets.saveButtons->setEnabled(false); //Action panel must also be in valid state to re-enable main start button - if (_mainButtons && !_actionWidgets.saveButtons->isEnabled()) { - _mainButtons->setEnabled(true); + if (_mainButton && !_actionWidgets.saveButtons->isEnabled()) { + _mainButton->setEnabled(true); } + _keybindingWidgets.list->setEnabled(true); } } @@ -766,6 +777,10 @@ void ActionDialog::keybindingSaved() { keybinding->action = _keybindingWidgets.actionText->text().toStdString(); updateListItem(_keybindingWidgets.list->currentItem(), *keybinding); + //Save the updated keybindings to the profile + if (_keybindings) { + *_keybindings = _keybindingsData; + } clearKeybindingFields(); } @@ -783,6 +798,7 @@ void ActionDialog::clearKeybindingFields() { _keybindingWidgets.action->setEnabled(false); _keybindingWidgets.actionText->clear(); _keybindingWidgets.actionText->setEnabled(false); + _keybindingWidgets.list->setEnabled(true); } void ActionDialog::keybindingRejected() { diff --git a/apps/OpenSpace/ext/launcher/src/profile/horizonsdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/horizonsdialog.cpp index d47e31338c..ba6027adc6 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/horizonsdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/horizonsdialog.cpp @@ -457,8 +457,8 @@ bool HorizonsDialog::isValidInput() { // Range 1 to 2147483647 (max of 32 bit int). // Horizons read the step size into a 32 bit int, but verifies the input on their // website as a uint32_t. If step size over 32 bit int is sent, this error message is - // recived: Cannot read numeric value -- re-enter - if (step < 1 || step > std::numeric_limits::max()) { + // received: Cannot read numeric value -- re-enter + if (step < 1) { _errorMsg->setText(QString::fromStdString(fmt::format( "Step size is outside valid range 1 to '{}'", std::numeric_limits::max() diff --git a/apps/OpenSpace/ext/launcher/src/profile/timedialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/timedialog.cpp index 63557a3dcd..0eeae0a527 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/timedialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/timedialog.cpp @@ -52,7 +52,8 @@ TimeDialog::TimeDialog(QWidget* parent, std::optional* if (_timeData.value.empty()) { _timeData.value = "0d"; } - _relativeEdit->setSelection(0, _relativeEdit->text().length()); + int len = static_cast(_relativeEdit->text().length()); + _relativeEdit->setSelection(0, len); } else { _absoluteEdit->setSelectedSection(QDateTimeEdit::YearSection); diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index 704742c4c1..4a555d7922 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit 704742c4c10254fa5d8415b1aab6e0b673aa1ab6 +Subproject commit 4a555d7922d161a0ada27e060e3741cfd6c336fa diff --git a/apps/OpenSpace/main.cpp b/apps/OpenSpace/main.cpp index d012932ca5..9c97586b33 100644 --- a/apps/OpenSpace/main.cpp +++ b/apps/OpenSpace/main.cpp @@ -1199,12 +1199,7 @@ int main(int argc, char* argv[]) { } catch (const documentation::SpecificationError& e) { LFATALC("main", "Loading of configuration file failed"); - for (const documentation::TestResult::Offense& o : e.result.offenses) { - LERRORC(o.offender, ghoul::to_string(o.reason)); - } - for (const documentation::TestResult::Warning& w : e.result.warnings) { - LWARNINGC(w.offender, ghoul::to_string(w.reason)); - } + logError(e); ghoul::deinitialize(); exit(EXIT_FAILURE); } diff --git a/apps/Sync/CMakeLists.txt b/apps/Sync/CMakeLists.txt index 9aca731357..63800783e1 100644 --- a/apps/Sync/CMakeLists.txt +++ b/apps/Sync/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/application_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/application_definition.cmake) set_source_files_properties( ${CMAKE_CURRENT_SOURCE_DIR}/openspace.icns @@ -47,7 +47,7 @@ if (OPENSPACE_MODULE_WEBBROWSER AND CEF_ROOT) set(CMAKE_BUILD_TYPE Debug CACHE STRING "CMAKE_BUILD_TYPE") if (WIN32) - set(RESOURCE_FILE ${OPENSPACE_APPS_DIR}/OpenSpace/openspace.rc) + set(RESOURCE_FILE openspace.rc) endif () # Add the CEF binary distribution's cmake/ directory to the module path and diff --git a/apps/TaskRunner/CMakeLists.txt b/apps/TaskRunner/CMakeLists.txt index 017ee293c7..d22fd966fa 100644 --- a/apps/TaskRunner/CMakeLists.txt +++ b/apps/TaskRunner/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/application_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/application_definition.cmake) set_source_files_properties( ${CMAKE_CURRENT_SOURCE_DIR}/openspace.icns @@ -47,7 +47,7 @@ if (OPENSPACE_MODULE_WEBBROWSER AND CEF_ROOT) set(CMAKE_BUILD_TYPE Debug CACHE STRING "CMAKE_BUILD_TYPE") if (WIN32) - set(RESOURCE_FILE ${OPENSPACE_APPS_DIR}/OpenSpace/openspace.rc) + set(RESOURCE_FILE openspace.rc) endif () # Add the CEF binary distribution's cmake/ directory to the module path and diff --git a/data/assets/actions/trails/on_off_all_minor_moons.asset b/data/assets/actions/trails/on_off_all_minor_moons.asset new file mode 100644 index 0000000000..b9d74ac2aa --- /dev/null +++ b/data/assets/actions/trails/on_off_all_minor_moons.asset @@ -0,0 +1,70 @@ +local minormoons_on = { + Identifier = "os_default.minormoons_on", + Name = "Turn ON minor moons and trails", + Command = [[ + local trails = openspace.getProperty('{moonTrail_minor}.Renderable.Enabled'); + local trails_fade = openspace.getProperty('{moonTrail_minor}.Renderable.Fade'); + + local moons = openspace.getProperty('{moon_minor}.Renderable.Enabled'); + local moons_fade = openspace.getProperty('{moon_minor}.Renderable.Fade'); + + for i, v in pairs(trails_fade) do + openspace.setPropertyValueSingle(trails[i], true) + openspace.setPropertyValueSingle(v, 1, 2, 'Linear') + end + + for i, v in pairs(moons_fade) do + openspace.setPropertyValueSingle(moons[i], true) + openspace.setPropertyValueSingle(v, 1, 2, 'Linear') + end + ]], + Documentation = "Turn ON minor moons and their trails for all planets in the solar system", + GuiPath = "/Solar System/Minor Moons", + IsLocal = true +} + +local minormoons_off = { + Identifier = "os_default.minormoons_off", + Name = "Turn OFF minor moons and trails", + Command = [[ + local trails = openspace.getProperty('{moonTrail_minor}.Renderable.Enabled'); + local trails_fade = openspace.getProperty('{moonTrail_minor}.Renderable.Fade'); + + local moons = openspace.getProperty('{moon_minor}.Renderable.Enabled'); + local moons_fade = openspace.getProperty('{moon_minor}.Renderable.Fade'); + + for i, v in pairs(trails_fade) do + openspace.setPropertyValueSingle(v, 0, 2, 'Linear', "openspace.setPropertyValueSingle('" .. trails[i] .. "', false)" ) + end + + for i, v in pairs(moons_fade) do + openspace.setPropertyValueSingle(v, 0, 2, 'Linear', "openspace.setPropertyValueSingle('" .. moons[i] .. "', false)" ) + end + ]], + Documentation = "Turn OFF minor moons and their trails for all planets in the solar system", + GuiPath = "/Solar System/Minor Moons", + IsLocal = true +} + +asset.export("minormoons_on", minormoons_on.Identifier) +asset.export("minormoons_off", minormoons_off.Identifier) + +asset.onInitialize(function() + openspace.action.registerAction(minormoons_on) + openspace.action.registerAction(minormoons_off) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(minormoons_off) + openspace.action.removeAction(minormoons_on) +end) + + +asset.meta = { + Name = "Actions - Turn ON/OFF all Minor Moons", + Version = "1.0", + Description = "Asset providing actions to turn ON/OFF all minor moons and their trails", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/actions/trails/toggle_all_minor_moon_trails.asset b/data/assets/actions/trails/toggle_all_minor_moon_trails.asset new file mode 100644 index 0000000000..369f3365cf --- /dev/null +++ b/data/assets/actions/trails/toggle_all_minor_moon_trails.asset @@ -0,0 +1,32 @@ +local toggle_minormoon_trails = { + Identifier = "os_default.toggle_minormoon_trails", + Name = "Toggle Minor Moon Trails", + Command = [[ + local list = openspace.getProperty('{moonTrail_minor}.Renderable.Enabled'); + for _,v in pairs(list) do + openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + end + ]], + Documentation = "Toggle on/off minor moon trails for all planets in the solar system", + GuiPath = "/Trails", + IsLocal = true +} +asset.export("toggle_minormoon_trails", toggle_minormoon_trails.Identifier) + +asset.onInitialize(function() + openspace.action.registerAction(toggle_minormoon_trails) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(toggle_minormoon_trails) +end) + + +asset.meta = { + Name = "Actions - Toggle Minor Moon Trails", + Version = "1.0", + Description = "Asset providing actions to toggle all minor moon trails on and off", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/base_blank.asset b/data/assets/base_blank.asset index 00611bc658..40bfec6188 100644 --- a/data/assets/base_blank.asset +++ b/data/assets/base_blank.asset @@ -19,6 +19,7 @@ asset.require("util/launcher_images") -- Modules and component settings asset.require("modules/exoplanets/exoplanets") asset.require("modules/skybrowser/skybrowser") +asset.require("modules/touch/default_settings") asset.onInitialize(function () diff --git a/data/assets/modules/touch/default_settings.asset b/data/assets/modules/touch/default_settings.asset new file mode 100644 index 0000000000..1683bd3a03 --- /dev/null +++ b/data/assets/modules/touch/default_settings.asset @@ -0,0 +1,19 @@ +asset.onInitialize(function () + openspace.setPropertyValueSingle("Modules.Touch.EnableTouchInteraction", true) + + -- A list of renderable types that apply the "direct manipulation". Works best for + -- things with a sperical-ish shape and an intearction sphere of about the same size + -- as the bounding sphere. + -- Can also be set for each scene graph node using the "IsDirectlyTouchable" property + local directTouchList = { "RenderableGlobe" } + openspace.setPropertyValueSingle("Modules.Touch.DefaultDirectTouchRenderableTypes", directTouchList) +end) + +asset.meta = { + Name = "Touch Module Default Settings", + Version = "1.0", + Description = "Some default settings related to the touch module", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/milkyway/gaia/gaia_dr2_download_stars.asset b/data/assets/scene/milkyway/gaia/gaia_dr2_download_stars.asset index 357723674f..0afdf88ece 100644 --- a/data/assets/scene/milkyway/gaia/gaia_dr2_download_stars.asset +++ b/data/assets/scene/milkyway/gaia/gaia_dr2_download_stars.asset @@ -6,10 +6,8 @@ local gaia618Destination = asset.syncedResource({ Type = "HttpSynchronization", Identifier = "gaia_stars_618M_octree", Version = 1, - Unzip = { - UnzipFiles = true, - Destination = "data" - } + UnzipFiles = true, + UnzipFilesDestination = "data" }) local gaia618DestinationExtracted = gaia618Destination .. "data"; diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/actions.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/actions.asset new file mode 100644 index 0000000000..cce8a03967 --- /dev/null +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/actions.asset @@ -0,0 +1,97 @@ +local bastilleday_setup_startofcme = { + Identifier = "os.events.bastilleday.setup.startofcme", + Name = "Reset to start of CME, no loop", + Command = [[ + openspace.time.setTime('2000-JUL-14 10:03:00.00'); + openspace.scriptScheduler.clear(); + ]], + Documentation = "Button to reset to the the start of the CME", + GuiPath = "/Bastille-Day 2000", + IsLocal = false +} + +local bastilleday_setup_shortloop = { + Identifier = "os.events.bastilleday.setup.shortloop", + Name = "Loop 10:03 - 10:16, at 2 min/second", + Command = [[ + local EndtimeShortLoop = "2000 JUL 14 10:16:00"; + local starttimescriptslowloop = "openspace.time.setTime('2000 JUL 14 10:03:00')"; + openspace.scriptScheduler.clear(); + openspace.time.setDeltaTime(120); + openspace.time.setTime('2000-JUL-14 10:03:00.00'); + openspace.scriptScheduler.loadScheduledScript(EndtimeShortLoop, starttimescriptslowloop); + ]], + Documentation = "New loop: Restarts time at 10:03 and stops at 10:16, sets delta time to 2 min/second (120 seconds/second)", + GuiPath = "/Bastille-Day 2000", + IsLocal = false +} + +local bastilleday_setup_standardloop = { + Identifier = "os.events.bastilleday.setup.standardloop", + Name = "Loop 10:03 - 11:00, at 4 min/second", + Command = [[ + local starttimescriptslowloop = "openspace.time.setTime('2000 JUL 14 10:03:00')"; + openspace.scriptScheduler.clear(); + openspace.time.setDeltaTime(240); + openspace.time.setTime('2000-JUL-14 10:03:00.00'); + openspace.scriptScheduler.loadScheduledScript('2000 JUL 14 11:00:00', starttimescriptslowloop); + ]], + Documentation = "New loop: Restarts time at 10:03 and stops at 11:00, delta time to 4 min/second (240 seconds/second)", + GuiPath = "/Bastille-Day 2000", + IsLocal = false +} + +local bastilleday_setup_fastloop = { + Identifier = "os.events.bastilleday.setup.fastloop", + Name = "Loop 10:03 - 11.48, at 15 min/second", + Command = [[ + local starttimescriptfastloop = "openspace.time.setTime('2000 JUL 14 10:03:00')"; + openspace.scriptScheduler.clear(); + openspace.time.setDeltaTime(900); + openspace.time.setTime('2000-JUL-14 10:03:00.00'); + openspace.scriptScheduler.loadScheduledScript('2000 JUL 14 11:48:00', starttimescriptfastloop); + ]], + Documentation = "Fast loop: Starts from 10:03 and sets delta time to 15 min/second (900 seconds/second)", + GuiPath = "/Bastille-Day 2000", + IsLocal = false +} + +local bastilleday_setup_longloop = { + Identifier = "os.events.bastilleday.setup.longloop", + Name = "Loop 09:30 - 13:00, at 4 min/second", + Command = [[ + local starttimescriptlongloop = "openspace.time.setTime('2000 JUL 14 09:30:00')"; + openspace.scriptScheduler.clear(); + openspace.time.setDeltaTime(240); + openspace.time.setTime('2000-JUL-14 09:30:00.00'); + openspace.scriptScheduler.loadScheduledScript('2000 JUL 14 13:00:00', starttimescriptlongloop); + ]], + Documentation = "Long loop: Restarts time at 09:30 and stops at 11:50, delta time to 4 min/second (240 seconds/second)", + GuiPath = "/Bastille-Day 2000", + IsLocal = false +} + +asset.onInitialize(function() + openspace.action.registerAction(bastilleday_setup_startofcme) + openspace.action.registerAction(bastilleday_setup_shortloop) + openspace.action.registerAction(bastilleday_setup_standardloop) + openspace.action.registerAction(bastilleday_setup_fastloop) + openspace.action.registerAction(bastilleday_setup_longloop) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(bastilleday_setup_longloop) + openspace.action.removeAction(bastilleday_setup_fastloop) + openspace.action.removeAction(bastilleday_setup_standardloop) + openspace.action.removeAction(bastilleday_setup_shortloop) + openspace.action.removeAction(bastilleday_setup_startofcme) +end) + +asset.meta = { + Name = "Bastille day actions", + Version = "1.0", + Description = "Asset with actions related to Bastille day", + Author = "CCMC, OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/density_volume.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/density_volume.asset index c958d7ec8e..d65a1da26c 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/density_volume.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/density_volume.asset @@ -49,7 +49,7 @@ local densityVolume = { } local toggle_volume = { - Identifier = "density_volume.toggle_volume", + Identifier = "os.events.bastilleday.densityvolume.togglevolume", Name = "Toggle volume", Command = propertyHelper.invert("Scene.MAS-MHD-Density-bastille-day-2000.Renderable.Enabled"), Documentation = "Toggle volume rendering of CME", @@ -72,7 +72,7 @@ asset.export(densityVolume) asset.meta = { Name = "Predictive Science Inc. Volume Rendering Bastille Day", - Version = "1.0", + Version = "1.1", Description = "Volumetric rendering for the bastille day CME event", Author = "CCMC, OpenSpace team", URL = "https://dx.doi.org/10.3847/1538-4357/aab36d", diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/fieldlines.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/fieldlines.asset index 7541ff97e7..cfae12d725 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/fieldlines.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/fieldlines.asset @@ -48,7 +48,7 @@ local fieldlines = { } local toggle_fieldlines = { - Identifier = "fieldlines.toggle_fieldlines", + Identifier = "os.events.bastilleday.fieldlines.togglefieldlines", Name = "Toggle Fieldlines", Command = propertyHelper.invert("Scene.MAS-MHD-Fieldlines-bastille-day-2000.Renderable.Enabled"), Documentation = "Toggle fieldline rendering of CME", @@ -70,7 +70,7 @@ asset.export(fieldlines) asset.meta = { Name = "Predictive Science Inc. Fieldlines Bastille Day", - Version = "1.0", + Version = "1.1", Description = "Magnetic fieldlines for the bastille day CME event", Author = "CCMC, Jonathan Grangien, Matthias Berg", URL = "https://dx.doi.org/10.3847/1538-4357/aab36d", diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodes.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodes.asset index a679c7f529..b770439465 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodes.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodes.asset @@ -33,7 +33,7 @@ local fluxNodes = { } local toggle_fluxnodes = { - Identifier = "fluxnodes.toggle_fluxnodes", + Identifier = "os.events.bastilleday.fluxnodes.togglefluxnodes", Name = "Toggle flux nodes", Command = propertyHelper.invert("Scene.MAS-MHD-FluxNodes-bastille-day-2000.Renderable.Enabled"), Documentation = "Toggle flux node rendering of CME", @@ -56,7 +56,7 @@ asset.export(fluxNodes) asset.meta = { Name = "Predictive Science Inc. Flux nodes Bastille Day", - Version = "1.0", + Version = "1.1", Description = "Flux nodes for the bastille day CME event", Author = "CCMC, Christian Adamsson, Emilie Ho", URL = "https://dx.doi.org/10.3847/1538-4357/aab36d", diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodescutplane.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodescutplane.asset index b789e0eec8..62d6bdb192 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodescutplane.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodescutplane.asset @@ -70,7 +70,7 @@ local MeridialCutplane = { } local toggle_equatorial = { - Identifier = "fluxnodescutplane.toggle_equatorial", + Identifier = "os.events.bastilleday.fluxnodescutplane.toggleequatorial", Name = "Toggle equatorial cutplane", Command = propertyHelper.invert("Scene.EquatorialCutplane-bastille-day-2000.Renderable.Enabled"), Documentation = "Toggle equatorial cutplane of CME", @@ -78,7 +78,7 @@ local toggle_equatorial = { IsLocal = false } local toggle_meridial = { - Identifier = "fluxnodescutplane.toggle_meridial", + Identifier = "os.events.bastilleday.fluxnodescutplane.togglemeridial", Name = "Toggle meridial cutplane", Command = propertyHelper.invert("Scene.MeridialCutplane-bastille-day-2000.Renderable.Enabled"), Documentation = "Toggle meridial cutplane of CME", @@ -106,7 +106,7 @@ asset.export(MeridialCutplane) asset.meta = { Name = "Predictive Science Inc. Cutplanes Bastille Days", - Version = "1.0", + Version = "1.1", Description = "Cutplanes for the bastille day CME event", Author = "CCMC, Christian Adamsson, Emilie Ho", URL = "https://dx.doi.org/10.3847/1538-4357/aab36d", diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodeslegend.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodeslegend.asset index edcdbc6c88..03fa7c43df 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodeslegend.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodeslegend.asset @@ -16,7 +16,7 @@ local legend = { } local show_legend = { - Identifier = "fluxnodelegend.show_legend", + Identifier = "os.events.bastilleday.fluxnodelegend.showlegend", Name = "Show the legend image", Command = [[ openspace.setPropertyValueSingle("ScreenSpace.LegendFluxNodes-bastille-day-2000.Opacity", 0.0); @@ -27,8 +27,9 @@ local show_legend = { GuiPath = "/Bastille-Day 2000", IsLocal = false } + local hide_legend = { - Identifier = "fluxnodelegend.hide_legend", + Identifier = "os.events.bastilleday.fluxnodelegend.hidelegend", Name = "Hides the legend image", Command = [[openspace.setPropertyValueSingle("ScreenSpace.LegendFluxNodes-bastille-day-2000.Opacity", 0.0, 2)]], Documentation = "Hides the legend image", @@ -52,7 +53,7 @@ end) asset.meta = { Name = "Predictive Science Inc. Flux nodes legend for Bastille Days", - Version = "1.0", + Version = "1.1", Description = [[Screen space renderable image legend of flux nodes for the bastille day CME event]], Author = "Christian Adamsson, Emilie Ho", diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/magnetogram_textures.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/magnetogram_textures.asset index 9b5ae913b4..20ee5a17a8 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/magnetogram_textures.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/magnetogram_textures.asset @@ -5,7 +5,7 @@ local magnetogramDirectory = asset.require("./magnetogram").TexturesPath; local magnetograms; local switch_color_layer = { - Identifier = "magnetogram_texture.switch_color_layer", + Identifier = "os.events.bastilleday.magnetogramtexture.switchcolorlayer", Name = "Next sun texture", Command = [[ local textureList = openspace.globebrowsing.getLayers("Sun", "ColorLayers"); @@ -59,7 +59,7 @@ end) asset.meta = { Name = "Bastille Day magnetogram textures", - Version = "1.0", + Version = "1.1", Description = [[This asset adds multiple magnetogram textures to the Sun. In addition it provides an action to cycle through the textures. See magnetogram.asset for details of the textures]], diff --git a/data/assets/scene/solarsystem/missions/apollo/11/actions.asset b/data/assets/scene/solarsystem/missions/apollo/11/actions.asset new file mode 100644 index 0000000000..e8c5fd8ef9 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/apollo/11/actions.asset @@ -0,0 +1,36 @@ +asset.require("../apollo_globebrowsing") + +local apollo11_setup_landingsite = { + Identifier = "os.missions.apollo11.setup.landingsite", + Name = "Setup Apollo 11 landing site", + Command = [[ + openspace.time.setTime('1969 JUL 20 20:17:40'); + openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.HeightLayers.LRO_NAC_Apollo_11.Enabled', true); + openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A11_M177481212_p_longlat.Enabled', true); + openspace.setPropertyValueSingle('Scene.Moon.Renderable.TargetLodScaleFactor', 20.11); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'Apollo11LemPosition'); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + openspace.setPropertyValueSingle('Scene.Apollo11MoonTrail.Renderable.Enabled', true); + openspace.setPropertyValueSingle('Scene.Apollo11LemTrail.Renderable.Enabled', true); + ]], + Documentation = "Setup for Apollo 11 landing site", + GuiPath = "/Missions/Apollo/11", + IsLocal = false + } + +asset.onInitialize(function() + openspace.action.registerAction(apollo11_setup_landingsite) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(apollo11_setup_landingsite) +end) + +asset.meta = { + Name = "Apollo 11 Actions", + Version = "1.0", + Description = "Asset with actions related to the Apollo 11 mission", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/apollo/11/apollo11.asset b/data/assets/scene/solarsystem/missions/apollo/11/apollo11.asset index f9b0bf226e..f701e59aed 100644 --- a/data/assets/scene/solarsystem/missions/apollo/11/apollo11.asset +++ b/data/assets/scene/solarsystem/missions/apollo/11/apollo11.asset @@ -1,3 +1,7 @@ +asset.require("spice/base") +asset.require("../actions") +asset.require("./actions") + local sun = asset.require("scene/solarsystem/sun/sun") local moon_transforms = asset.require("scene/solarsystem/planets/earth/moon/moon") @@ -5,7 +9,6 @@ local descentKeyframes = asset.require("./lem_descent.asset") local descentRotationKeyframes = asset.require("./lem_descent_rotation.asset") local kernels = asset.require("./kernels").kernels -asset.require("spice/base") local models = asset.syncedResource({ Name = "Apollo Models", diff --git a/data/assets/scene/solarsystem/missions/apollo/15/apollo15.asset b/data/assets/scene/solarsystem/missions/apollo/15/apollo15.asset index 53614c802d..c151963293 100644 --- a/data/assets/scene/solarsystem/missions/apollo/15/apollo15.asset +++ b/data/assets/scene/solarsystem/missions/apollo/15/apollo15.asset @@ -1,6 +1,7 @@ local moon_transforms = asset.require("scene/solarsystem/planets/earth/moon/moon") local sun = asset.require("scene/solarsystem/sun/sun") asset.require("spice/base") +asset.require("../actions") local models = asset.syncedResource({ Name = "Apollo Models", diff --git a/data/assets/scene/solarsystem/missions/apollo/17/actions.asset b/data/assets/scene/solarsystem/missions/apollo/17/actions.asset new file mode 100644 index 0000000000..40fcfc2ae9 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/apollo/17/actions.asset @@ -0,0 +1,40 @@ +asset.require("../apollo_globebrowsing") + +local apollo17_setup_landingsite = { + Identifier = "os.missions.apollo17.setup.landingsite", + Name = "Setup for Apollo 17 landing site", + Command = [[ + openspace.time.setTime('1972 DEC 12 19:47:11'); + openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_travmap.BlendMode', 0.000000); + openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_travmap.Enabled', true); + openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.HeightLayers.LRO_NAC_Apollo_17.Enabled', true); + openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_LEM.Enabled', true); + openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_LEM.BlendMode', 0.000000); + openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_NAC_Alt_p.Enabled', true); + openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_NAC_Alt_p.BlendMode', 0.000000); + openspace.setPropertyValueSingle('Scene.Moon.Renderable.TargetLodScaleFactor', 20.17); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'Apollo17LemModel'); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_station7.BlendMode', 0.000000); + ]], + Documentation = "Setup for Apollo 17 landing site", + GuiPath = "/Missions/Apollo/17", + IsLocal = false +} + +asset.onInitialize(function() + openspace.action.registerAction(apollo17_setup_landingsite) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(apollo17_setup_landingsite) +end) + +asset.meta = { + Name = "Apollo 17 Actions", + Version = "1.0", + Description = "Asset with actions related to the Apollo 11 mission", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/apollo/17/apollo17.asset b/data/assets/scene/solarsystem/missions/apollo/17/apollo17.asset new file mode 100644 index 0000000000..dc40e224af --- /dev/null +++ b/data/assets/scene/solarsystem/missions/apollo/17/apollo17.asset @@ -0,0 +1,3 @@ +asset.require("./lem") +asset.require("./actions") +asset.require("../actions") diff --git a/data/assets/scene/solarsystem/missions/apollo/8/actions.asset b/data/assets/scene/solarsystem/missions/apollo/8/actions.asset new file mode 100644 index 0000000000..cd66969245 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/apollo/8/actions.asset @@ -0,0 +1,47 @@ +local apollo8_setup_earthrise = { + Identifier = "os.missions.apollo8.setup.earthrise", + Name = "Set Earthrise time", + Command = [[ + openspace.time.setPause(true); + openspace.time.setDeltaTime(1); + openspace.time.setTime('1968 DEC 24 16:37:31'); + openspace.navigation.setNavigationState({Anchor = 'Apollo8', Position = { 1.494592E1, 3.236777E1, -4.171296E1 }, ReferenceFrame = 'Root', Up = { 0.960608E0, -0.212013E0, 0.179675E0 }}); + openspace.setPropertyValue('*Trail.Renderable.Enabled', false); + ]], + Documentation = "Jump to right before the earthrise photo", + GuiPath = "/Missions/Apollo/8", + IsLocal = false +} + +local apollo8_setup_launch = { + Identifier = "os.missions.apollo8.setup.launch", + Name = "Set Apollo 8 launch time", + Command = [[ + openspace.time.setTime('1968-12-21T12:51:37.00'); + openspace.setPropertyValueSingle('Scene.Apollo8LaunchTrail.Renderable.Enabled', true); + ]], + Documentation = "Jump to time right before Apollo 8 liftoff, with its trail enabled", + GuiPath = "/Missions/Apollo/8", + IsLocal = false +} + + + +asset.onInitialize(function() + openspace.action.registerAction(apollo8_setup_earthrise) + openspace.action.registerAction(apollo8_setup_launch) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(apollo8_setup_launch) + openspace.action.removeAction(apollo8_setup_earthrise) +end) + +asset.meta = { + Name = "Apollo 8 Actions", + Version = "1.0", + Description = "Asset with actions related to the Apollo 8 mission", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/apollo/8/apollo8.asset b/data/assets/scene/solarsystem/missions/apollo/8/apollo8.asset index cf491145b7..6f1d47d3bf 100644 --- a/data/assets/scene/solarsystem/missions/apollo/8/apollo8.asset +++ b/data/assets/scene/solarsystem/missions/apollo/8/apollo8.asset @@ -1,3 +1,5 @@ asset.require("./model") asset.require("./launch_model") asset.require("./trails") +asset.require("./actions") +asset.require("../actions") diff --git a/data/assets/scene/solarsystem/missions/apollo/actions.asset b/data/assets/scene/solarsystem/missions/apollo/actions.asset new file mode 100644 index 0000000000..6bd483a6c1 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/apollo/actions.asset @@ -0,0 +1,57 @@ +local toggle_moon_shading = { + Identifier = "os.missions.apollo.moon.toggleshading", + Name = "Toggle Moon shading", + Command = [[ + openspace.setPropertyValueSingle('Scene.Moon.Renderable.PerformShading', not openspace.getPropertyValue('Scene.Moon.Renderable.PerformShading')); + ]], + Documentation = "Toggles the shading of the Moon", + GuiPath = "/Missions/Apollo", + isLocal = false +} + +local focus_moon = { + Identifier = "os.missions.apollo.moon.focus", + Name = "Focus on Moon", + Command = [[ + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Aim', ''); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Anchor', 'Moon'); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + ]], + Documentation = "Set camera focus on the Moon", + GuiPath = "/Missions/Apollo", + isLocal = false +} + +local focus_earth = { + Identifier = "os.missions.apollo.earth.focus", + Name = "Focus on Earth", + Command = [[ + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Aim', ''); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Anchor', 'Earth'); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + ]], + Documentation = "Set camera focus on the Earth", + GuiPath = "/Missions/Apollo", + isLocal = false +} + +asset.onInitialize(function() + openspace.action.registerAction(toggle_moon_shading) + openspace.action.registerAction(focus_moon) + openspace.action.registerAction(focus_earth) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(focus_earth) + openspace.action.removeAction(focus_moon) + openspace.action.removeAction(toggle_moon_shading) +end) + +asset.meta = { + Name = "Actions - Apollo missions", + Version = "1.0", + Description = "Actions related to the Apollo missions", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset b/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset index 93e7be48ca..682462e3b1 100644 --- a/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset +++ b/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset @@ -28,9 +28,45 @@ local stations = asset.syncedResource({ Version = 1 }) + +local apollo_moon_togglekaguyalayer = { + Identifier = "os.missions.apollo.moon.togglekaguyalayer", + Name = "Toggle Kaguya layer", + Command = [[ + openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.Kaguya_Utah.Enabled', not openspace.getPropertyValue('Scene.Moon.Renderable.Layers.ColorLayers.Kaguya_Utah.Enabled')); + ]], + Documentation = "Toggles Moon Kaguya color layer", + GuiPath = "/Missions/Apollo", + IsLocal = false +} + +local apollo_moon_disableapollosites= { + Identifier = "os.missions.apollo.moon.disableapollosites", + Name = "Disable Apollo sites", + Command = [[ + openspace.setPropertyValue('Scene.Moon.Renderable.Layers.ColorLayers.A17_*.Enabled', false); + openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.HeightLayers.LRO_NAC_Apollo_11.Enabled', false); + openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A11_M177481212_p_longlat.Enabled', false); + openspace.setPropertyValueSingle('Scene.Apollo11MoonTrail.Renderable.Enabled', false); + openspace.setPropertyValueSingle('Scene.Apollo11LemTrail.Renderable.Enabled', false); + openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.HeightLayers.LRO_NAC_Apollo_17.Enabled', false); + ]], + Documentation = "Disable apollo site on moon when leaving", + GuiPath = "/Missions/Apollo", + IsLocal = false +} + asset.onInitialize(function () openspace.globebrowsing.addBlendingLayersFromDirectory(heightmaps, moon_transforms.Moon.Identifier) openspace.globebrowsing.addBlendingLayersFromDirectory(basemaps, moon_transforms.Moon.Identifier) openspace.globebrowsing.addBlendingLayersFromDirectory(naclighting, moon_transforms.Moon.Identifier) openspace.globebrowsing.addBlendingLayersFromDirectory(stations, moon_transforms.Moon.Identifier) + + openspace.action.registerAction(apollo_moon_togglekaguyalayer) + openspace.action.registerAction(apollo_moon_disableapollosites) +end) + +asset.onDeinitialize(function () + openspace.action.removeAction(apollo_moon_disableapollosites) + openspace.action.removeAction(apollo_moon_togglekaguyalayer) end) diff --git a/data/assets/scene/solarsystem/missions/insight/actions.asset b/data/assets/scene/solarsystem/missions/insight/actions.asset new file mode 100644 index 0000000000..e54890e4c5 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/insight/actions.asset @@ -0,0 +1,50 @@ +local setup_insight = { + Identifier = "os.missions.insight.setup", + Name = "Setup scene for insight EDL", + Command = [[ + openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.Mola_Utah.Settings.Offset', -469.300000); + openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.HiRISE-LS-DEM.Settings.Offset', -470.850006); + openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.MDEM200M.Settings.Offset', -470.000000); + openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.HiRISE-LS-DEM.Enabled', true); + openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.ColorLayers.HiRISE-LS.Enabled', true); + openspace.time.setPause(true); + openspace.time.setTime('2018 NOV 26 19:39:01.68'); + openspace.navigation.setNavigationState({Anchor = 'Insight',Pitch = 0.567457E-4,Position = { 1.240506E1,-1.369270E1,-2.423553E0 },ReferenceFrame = 'Root',Up = { 0.441211E0,0.247019E0,0.862737E0 },Yaw = -0.446853E-4}); + ]], + Documentation = "Set and goto Insight Landing", + GuiPath = "/Missions/Insight", + isLocal = false +} + +local setup_disablelayers = { + Identifier = "os.missions.insight.setup.disablelayers", + Name = "Disable insight EDL layers", + Command = [[ + openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.Mola_Utah.Settings.Offset', 0); + openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.HiRISE-LS-DEM.Settings.Offset', 0); + openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.HiRISE-LS-DEM.Enabled', false); + openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.ColorLayers.HiRISE-LS.Enabled', false); + ]], + Documentation = "Disable Mars layer settings used for insight EDL", + GuiPath = "/Missions/Insight", + isLocal = false +} + +asset.onInitialize(function() + openspace.action.registerAction(setup_insight) + openspace.action.registerAction(setup_disablelayers) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(setup_disablelayers) + openspace.action.removeAction(setup_insight) +end) + +asset.meta = { + Name = "Insight Actions", + Version = "1.0", + Description = "Actions related to the Insight mission", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/insight/edl.asset b/data/assets/scene/solarsystem/missions/insight/edl.asset index 3b24ae5265..1997be29fe 100644 --- a/data/assets/scene/solarsystem/missions/insight/edl.asset +++ b/data/assets/scene/solarsystem/missions/insight/edl.asset @@ -1,6 +1,8 @@ asset.require("spice/base") +asset.require("./actions") local sun = asset.require("scene/solarsystem/sun/sun") local mars = asset.require("scene/solarsystem/planets/mars/mars") +asset.require("scene/solarsystem/planets/mars/default_layers") local models = asset.syncedResource({ Name = "Insight Models Chutes", diff --git a/data/assets/scene/solarsystem/missions/jwst/actions.asset b/data/assets/scene/solarsystem/missions/jwst/actions.asset new file mode 100644 index 0000000000..e7b967a07e --- /dev/null +++ b/data/assets/scene/solarsystem/missions/jwst/actions.asset @@ -0,0 +1,157 @@ +local toggle_lagrangian_points = { + Identifier = "os.missions.jwst.togglelagrangianpoints", + Name = "Toggle Lagrangian points", + Command = [[ + local list = openspace.getProperty('{lagrange_points_earth}.Renderable.Enabled'); + for _,v in pairs(list) do + openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + end + ]], + Documentation = "Toggle points and labels for the Lagrangian points for Earth Sun system", + GuiPath = "/JWST", + isLocal = false +} + +local toggle_hudf = { + Identifier = "os.missions.jwst.togglehudf", + Name = "Toggle Hubble Ultra Deep Field", + Command = [[ + local list = openspace.getProperty('{mission_jwst_hudf}.*.Enabled'); + for _,v in pairs(list) do + openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + end + ]], + Documentation = "Toggle Hubble Ultra Deep Field image and line towards its coordinate", + GuiPath = "/JWST", + isLocal = false +} + +local toggle_l2 = { + Identifier = "os.missions.jwst.togglel2", + Name = "Toggle L2 line and small L2 label", + Command = [[ + local list = openspace.getProperty('{lagrange_points_earth_l2_small}.*.Enabled'); + for _,v in pairs(list) do + openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + end + ]], + Documentation = "Toggle L2 label, point and line", + GuiPath = "/JWST", + isLocal = false +} + +local toggle_fov = { + Identifier = "os.missions.jwst.togglefov", + Name = "Toggle JWST field of view and view band", + Command = [[ + local list = openspace.getProperty('{mission_jwst_fov}.*.Enabled'); + for _,v in pairs(list) do + openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + end + ]], + Documentation = "Toggle James Webb Space Telecope field of view and view band", + GuiPath = "/JWST", + isLocal = false +} + +local setup_launch = { + Identifier = "os.missoins.jwst.setup.launch", + Name = "Set to JWST launch time", + Command = [[ + openspace.time.setDeltaTime(1); + openspace.time.setTime('2021-12-25T12:20:01'); + ]], + Documentation = "Set the time to the launch time of JWST", + GuiPath = "/JWST", + isLocal = false +} + +local setup_detach = { + Identifier = "os.missions.jwst.setup.detach", + Name = "Set to JWST detach time", + Command = [[ + openspace.time.setDeltaTime(1); + openspace.time.setTime('2021-12-25T12:50:00'); + ]], + Documentation = "Set the time to the detach time of JWST", + GuiPath = "/JWST", + isLocal = false +} + +local toggle_sun_trail = { + Identifier = "os.missions.jwst.togglesuntrail", + Name = "Toggle JWST Sun trail", + Command = [[ + local value = openspace.getPropertyValue('Scene.JWSTSunTrail.Renderable.Enabled'); + openspace.setPropertyValueSingle('Scene.JWSTSunTrail.Renderable.Enabled', not value); + ]], + Documentation = "Toggle JWST trail relative to the Sun", + GuiPath = "/JWST", + isLocal = false +} + +local toggle_trails_except_moon = { + Identifier = "os.missions.jwst.toggletrialsexceptmoon", + Name = "Toggle trails (except Moon)", + Command = [[ + local list = openspace.getProperty('{planetTrail_solarSystem}.Renderable.Enabled'); + for _,v in pairs(list) do + openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + end + local moonlist = openspace.getProperty('{moonTrail_solarSystem}.Renderable.Enabled') + for _,v in pairs(moonlist) do + openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + end + openspace.setPropertyValueSingle('Scene.MoonTrail.Renderable.Enabled', true) + ]], + Documentation = "Toggle all planet and moon trails, except the Moon", + GuiPath = "/JWST", + isLocal = false +} + +local toggle_jwst_trail = { + Identifier = "os.missions.jwst.togglejwsttrails", + Name = "Toggle JWST trail", + Command = [[ + local list = {'Scene.JWSTTrailLaunch.Renderable.Enabled', 'Scene.JWSTTrailCruise.Renderable.Enabled', 'Scene.JWSTTrailCoRevOrbit.Renderable.Enabled'}; + for _,v in pairs(list) do + openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)); + end + ]], + Documentation = "Toggle JWST launch, cruise and L2 co-revolving orbit trails, not the Sun trail", + GuiPath = "/JWST", + isLocal = false +} + +asset.onInitialize(function() + openspace.action.registerAction(toggle_lagrangian_points) + openspace.action.registerAction(toggle_hudf) + openspace.action.registerAction(toggle_l2) + openspace.action.registerAction(toggle_fov) + openspace.action.registerAction(setup_launch) + openspace.action.registerAction(setup_detach) + openspace.action.registerAction(toggle_sun_trail) + openspace.action.registerAction(toggle_trails_except_moon) + openspace.action.registerAction(toggle_jwst_trail) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(toggle_jwst_trail) + openspace.action.removeAction(toggle_trails_except_moon) + openspace.action.removeAction(toggle_sun_trail) + openspace.action.removeAction(setup_detach) + openspace.action.removeAction(setup_launch) + openspace.action.removeAction(toggle_fov) + openspace.action.removeAction(toggle_l2) + openspace.action.removeAction(toggle_hudf) + openspace.action.removeAction(toggle_lagrangian_points) +end) + +asset.meta = { + Name = "Actions - JWST", + Version = "1.0", + Description = "Actions related to the JWST mission", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/jwst/jwst.asset b/data/assets/scene/solarsystem/missions/jwst/jwst.asset index b8a03fa668..92114813a9 100644 --- a/data/assets/scene/solarsystem/missions/jwst/jwst.asset +++ b/data/assets/scene/solarsystem/missions/jwst/jwst.asset @@ -1,9 +1,11 @@ +asset.require("spice/base") +asset.require("./actions") +asset.require("scene/solarsystem/planets/earth/layers/colorlayers/terra_modis_temporal") +asset.require("scene/solarsystem/planets/earth/layers/colorlayers/esri_viirs_combo") + local sun = asset.require("scene/solarsystem/sun/sun") local sunTransforms = asset.require("scene/solarsystem/sun/transforms") local transforms = asset.require("./transforms") -asset.require("spice/base") -asset.require("scene/solarsystem/planets/earth/layers/colorlayers/terra_modis_temporal") -asset.require("scene/solarsystem/planets/earth/layers/colorlayers/esri_viirs_combo") local models = asset.syncedResource({ Name = "JWST Model", @@ -218,7 +220,7 @@ asset.export(JWSTLabel) asset.meta = { Name = "James Webb Space Telescope", - Version = "1.0", + Version = "1.1", Description = [[ James Webb Space Telescope animated model, safe viewing band, field of view and label. ]], diff --git a/data/assets/scene/solarsystem/missions/jwst/timelapse.asset b/data/assets/scene/solarsystem/missions/jwst/timelapse.asset index d0c6737aa7..b14dab3ff3 100644 --- a/data/assets/scene/solarsystem/missions/jwst/timelapse.asset +++ b/data/assets/scene/solarsystem/missions/jwst/timelapse.asset @@ -504,7 +504,7 @@ end local function createActions() local playForwards = { - Identifier = "jwst.play.forwards", + Identifier = "os.missions.jwst.play.forwards", Name = "Play JWST from start", Command = [[ openspace.scriptScheduler.clear(0) @@ -520,7 +520,7 @@ local function createActions() } local playFromDetach = { - Identifier = "jwst.play.detach", + Identifier = "os.missions.jwst.play.detach", Name = "Play JWST from detach", Command = [[ openspace.scriptScheduler.clear(0) @@ -538,7 +538,7 @@ local function createActions() } local playBackwards = { - Identifier = "jwst.play.backwards", + Identifier = "os.missions.jwst.play.backwards", Name = "Play JWST from end", Command = [[ openspace.scriptScheduler.clear(0) @@ -554,7 +554,7 @@ local function createActions() } local clearPlay = { - Identifier = "jwst.play.clear", + Identifier = "os.missions.jwst.play.clear", Name = "Clear JWST timelapse", Command = [[ openspace.scriptScheduler.clear(0) @@ -562,7 +562,7 @@ local function createActions() openspace.setPropertyValueSingle("Scene.Earth.Renderable.Layers.NightLayers.Earth_at_Night_2012.Settings.Gamma", 1.0) openspace.setPropertyValueSingle("Scene.EarthAtmosphere.Renderable.Enabled", true) local deltaTime = openspace.time.deltaTime() - if deltaTime > 0 then + if deltaTime >= 0 then openspace.time.setDeltaTime(1) else openspace.time.setDeltaTime(-1) @@ -574,7 +574,7 @@ local function createActions() } local togglePlayDirection = { - Identifier = "jwst.toggle.direction", + Identifier = "os.missions.jwst.toggledirection", Name = "Toggle forwards / backwards", Command = [[ -- Flip deltatime @@ -611,7 +611,7 @@ local function createActions() IsLocal = false } - return {playForwards, playFromDetach, playBackwards, clearPlay, togglePlayDirection} + return { playForwards, playFromDetach, playBackwards, clearPlay, togglePlayDirection } end local text = { @@ -623,7 +623,7 @@ local text = { asset.onInitialize(function() actionsList = createActions() - for i, action in ipairs(actionsList) do + for _, action in ipairs(actionsList) do openspace.action.registerAction(action) end @@ -642,7 +642,7 @@ end) asset.meta = { Name = "James Webb Space Telescope Timelapse", - Version = "1.0", + Version = "1.1", Description = [[ Scripts that are scheduled to alter the speed of the simulation time so the deployment of the James Webb Space Telescope looks smoother. diff --git a/data/assets/scene/solarsystem/missions/newhorizons/actions.asset b/data/assets/scene/solarsystem/missions/newhorizons/actions.asset new file mode 100644 index 0000000000..b93946cd0d --- /dev/null +++ b/data/assets/scene/solarsystem/missions/newhorizons/actions.asset @@ -0,0 +1,244 @@ +local focus_newhorizons = { + Identifier = "os.missions.newhorizons.focus", + Name = "Focus on New Horizons", + Command = [[ + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'NewHorizons'); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Aim', ''); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + ]], + Documentation = "Sets the focus of the camera on 'NewHorizons'", + GuiPath = "/Missions/New Horizons", + isLocal = false +} + +local anchor_nh_aim_pluto = { + Identifier = "os.missions.newhorizons.aimpluto", + Name = "Anchor NH, Aim Pluto", + Command = [[ + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'NewHorizons'); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Aim', 'Pluto'); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil) + ]], + Documentation = "Anchor at New Horizons, Aim at Pluto", + GuiPath = "/Missions/New Horizons", + isLocal = false +} + +local focus_pluto = { + Identifier = "os.missions.newhorizons.pluto.focus", + Name = "Focus on Pluto", + Command = [[ + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'PlutoProjection'); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Aim', ''); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + ]], + Documentation = "Sets the focus of the camera on 'Pluto'", + GuiPath = "/Missions/New Horizons", + isLocal = false +} + +local focus_charon = { + Identifier = "os.missions.newhorizons.charon.focus", + Name = "Focus on Charon", + Command = [[ + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'Charon'); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Aim', ''); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + ]], + Documentation = "Sets the focus of the camera on 'Charon'", + GuiPath = "/Missions/New Horizons", + isLocal = false +} + +local toggle_nh_imageprojection = { + Identifier = "os.missions.newhorizons.toggleimageprojection", + Name = "Toggle NH Image Projection", + Command = [[ + local enabled = openspace.getPropertyValue('Scene.PlutoProjection.Renderable.ProjectionComponent.PerformProjection'); + openspace.setPropertyValue('Scene.PlutoProjection.Renderable.ProjectionComponent.PerformProjection', not enabled); + openspace.setPropertyValue('Scene.CharonProjection.Renderable.ProjectionComponent.PerformProjection', not enabled); + ]], + Documentation = "Toggles New Horizons image projection", + GuiPath = "/Missions/New Horizons", + isLocal = false +} + +local clear_image_projections = { + Identifier = "os.missions.newhorizons.clearimageprojections", + Name = "Clear image projections", + Command = [[ + openspace.setPropertyValue('Scene.PlutoProjection.Renderable.ProjectionComponent.ClearAllProjections', true); + openspace.setPropertyValue('Scene.CharonProjection.Renderable.ProjectionComponent.ClearAllProjections', true); + ]], + Documentation = "Removes all image projections from Pluto and Charon", + GuiPath = "/Missions/New Horizons", + isLocal = false +} + +local approach_time_and_projections = { + Identifier = "os.missions.newhorizons.approach", + Name = "Reset time and projections", + Command = [[ + openspace.time.setTime('2015-07-14T09:00:00.00'); + openspace.setPropertyValue('Scene.PlutoProjection.Renderable.ProjectionComponent.ClearAllProjections', true); + openspace.setPropertyValue('Scene.CharonProjection.Renderable.ProjectionComponent.ClearAllProjections', true); + ]], + Documentation = "Jumps to the 14th of July 2015 at 0900 UTC and clears all projections", + GuiPath = "/Missions/New Horizons", + isLocal = false +} + +local increase_hightmap_pluto = { + Identifier = "os.missions.newhorizons.pluto.increasehightmap", + Name = "Pluto HeightExaggeration +", + Command = [[ + openspace.setPropertyValueSingle("Scene.PlutoProjection.Renderable.HeightExaggeration", openspace.getPropertyValue("Scene.PlutoProjection.Renderable.HeightExaggeration") + 5000); + ]], + Documentation = "Increases the height map exaggeration on Pluto", + GuiPath = "/Missions/New Horizons", + isLocal = false +} + +local decrease_hightmap_pluto = { + Identifier = "os.missions.newhorizons.pluto.decreasehightmap", + Name = "Pluto HeightExaggeration -", + Command = [[ + openspace.setPropertyValueSingle("Scene.PlutoProjection.Renderable.HeightExaggeration", openspace.getPropertyValue("Scene.PlutoProjection.Renderable.HeightExaggeration") - 5000); + ]], + Documentation = "Decreases the height map exaggeration on Pluto", + GuiPath = "/Missions/New Horizons", + isLocal = false +} + +local increase_hightmap_charon = { + Identifier = "os.missions.newhorizons.charon.increasehightmap", + Name = "Charon HeightExaggeration +", + Command = [[ + openspace.setPropertyValueSingle("Scene.CharonProjection.Renderable.HeightExaggeration", openspace.getPropertyValue("Scene.CharonProjection.Renderable.HeightExaggeration") + 5000); + ]], + Documentation = "Increases the height map exaggeration on Charon", + GuiPath = "/Missions/New Horizons", + isLocal = false +} + +local decrease_hightmap_charon = { + Identifier = "os.missions.newhorizons.charon.decreasehightmap", + Name = "Charon HeightExaggeration -", + Command = [[ + openspace.setPropertyValueSingle("Scene.CharonProjection.Renderable.HeightExaggeration", openspace.getPropertyValue("Scene.CharonProjection.Renderable.HeightExaggeration") - 5000); + ]], + Documentation = "Decreases the height map exaggeration on Charon", + GuiPath = "/Missions/New Horizons", + isLocal = false +} + +local toggle_pluto_trail = { + Identifier = "os.missions.newhorizons.pluto.toggletrail", + Name = "Toggle Pluto Trail", + Command = [[ + openspace.setPropertyValueSingle('Scene.PlutoBarycentricTrail.Renderable.Enabled', not openspace.getPropertyValue('Scene.PlutoBarycentricTrail.Renderable.Enabled')); + ]], + Documentation = "Toggles the visibility of the trail behind Pluto", + GuiPath = "/Missions/New Horizons", + isLocal = false +} + +local toggle_pluto_labels = { + Identifier = "os.missions.newhorizons.pluto.togglelabels", + Name = "Toggle Pluto Labels", + Command = [[ + local list = {"Scene.PlutoText.Renderable.Enabled", "Scene.CharonText.Renderable.Enabled", "Scene.HydraText.Renderable.Enabled", "Scene.NixText.Renderable.Enabled", "Scene.KerberosText.Renderable.Enabled", "Scene.StyxText.Renderable.Enabled"}; + for _,v in pairs(list) do + openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + end + ]], + Documentation = "Toggles the visibility of the text labels of Pluto, Charon, Hydra, Nix, Kerberos, and Styx", + GuiPath = "/Missions/New Horizons", + isLocal = false +} + +local toggle_nh_labels = { + Identifier = "os.missions.newhorizons.togglelabels", + Name = "Toggle New Horizons Labels", + Command = [[ + local v = openspace.getPropertyValue("Scene.Labels.Renderable.Opacity"); + if v <= 0.5 then + openspace.setPropertyValueSingle("Scene.Labels.Renderable.Opacity",1.0,2.0) + else + openspace.setPropertyValueSingle("Scene.Labels.Renderable.Opacity",0.0,2.0) + end + ]], + Documentation = "Toggles the visibility of the labels for the New Horizons instruments", + GuiPath = "/Missions/New Horizons", + isLocal = false +} + +local toggle_shadows = { + Identifier = "os.missions.newhorizons.toggleshadows", + Name = "Toggle Shadows", + Command = [[ + openspace.setPropertyValueSingle('Scene.PlutoShadow.Renderable.Enabled', not openspace.getPropertyValue('Scene.PlutoShadow.Renderable.Enabled')); + openspace.setPropertyValueSingle('Scene.CharonShadow.Renderable.Enabled', not openspace.getPropertyValue('Scene.CharonShadow.Renderable.Enabled')); + ]], + Documentation = "Toggles the visibility of the shadow visualization of Pluto and Charon", + GuiPath = "/Missions/New Horizons", + isLocal = false +} + +local toggle_nh_trail = { + Identifier = "os.missions.newhorizons.toggletrail", + Name = "Toggle NH Trail", + Command = [[ + openspace.setPropertyValueSingle('Scene.NewHorizonsTrailPluto.Renderable.Enabled', not openspace.getPropertyValue('Scene.NewHorizonsTrailPluto.Renderable.Enabled')); + ]], + Documentation = "Toggles the trail of New Horizons", + GuiPath = "/Missions/New Horizons", + isLocal = false +} + +asset.onInitialize(function() + openspace.action.registerAction(focus_newhorizons) + openspace.action.registerAction(anchor_nh_aim_pluto) + openspace.action.registerAction(focus_pluto) + openspace.action.registerAction(focus_charon) + openspace.action.registerAction(toggle_nh_imageprojection) + openspace.action.registerAction(clear_image_projections) + openspace.action.registerAction(approach_time_and_projections) + openspace.action.registerAction(decrease_hightmap_pluto) + openspace.action.registerAction(increase_hightmap_charon) + openspace.action.registerAction(decrease_hightmap_charon) + openspace.action.registerAction(toggle_pluto_trail) + openspace.action.registerAction(toggle_pluto_labels) + openspace.action.registerAction(toggle_nh_labels) + openspace.action.registerAction(toggle_shadows) + openspace.action.registerAction(toggle_nh_trail) + openspace.action.registerAction(increase_hightmap_pluto) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(increase_hightmap_pluto) + openspace.action.removeAction(toggle_nh_trail) + openspace.action.removeAction(toggle_shadows) + openspace.action.removeAction(toggle_nh_labels) + openspace.action.removeAction(toggle_pluto_labels) + openspace.action.removeAction(toggle_pluto_trail) + openspace.action.removeAction(decrease_hightmap_charon) + openspace.action.removeAction(increase_hightmap_charon) + openspace.action.removeAction(decrease_hightmap_pluto) + openspace.action.removeAction(approach_time_and_projections) + openspace.action.removeAction(clear_image_projections) + openspace.action.removeAction(toggle_nh_imageprojection) + openspace.action.removeAction(focus_charon) + openspace.action.removeAction(focus_pluto) + openspace.action.removeAction(anchor_nh_aim_pluto) + openspace.action.removeAction(focus_newhorizons) +end) + +asset.meta = { + Name = "New Horizons actions", + Version = "1.0", + Description = "Actions for the New Horizons mission", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/newhorizons/newhorizons.asset b/data/assets/scene/solarsystem/missions/newhorizons/newhorizons.asset index 5b54845b72..84128fff70 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/newhorizons.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/newhorizons.asset @@ -8,6 +8,8 @@ asset.require("./charon") asset.require("./othermoons") +asset.require("./actions") + local mission = asset.localResource("newhorizons.mission") local missionName diff --git a/data/assets/scene/solarsystem/missions/osirisrex/actions.asset b/data/assets/scene/solarsystem/missions/osirisrex/actions.asset new file mode 100644 index 0000000000..91161f838d --- /dev/null +++ b/data/assets/scene/solarsystem/missions/osirisrex/actions.asset @@ -0,0 +1,113 @@ +local focus_osirisrex = { + Identifier = "os.missions.osirisrex.focus", + Name = "Focus on OsirisRex", + Command = [[ + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'OsirisRex'); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Aim', ''); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + ]], + Documentation = "Sets the focus of the camera on 'OsirisRex'", + GuiPath = "/Missions/Osiris Rex", + isLocal = false +} + +local focus_bennu = { + Identifier = "os.missions.osirisrex.bennu.focus", + Name = "Focus on Bennu", + Command = [[ + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'BennuBarycenter'); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Aim', ''); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + ]], + Documentation = "Sets the focus of the camera on 'Bennu'", + GuiPath = "/Missions/Osiris Rex", + isLocal = false +} + +local bennu_approach_time = { + Identifier = "os.missions.osirisrex.setup.bennuapproach", + Name = "Set Bennu approach time", + Command = [[ + openspace.printInfo('Set time: Approach'); + openspace.time.setTime('2018-SEP-11 21:31:01.183'); + ]], + Documentation = "Sets the time to the approach at Bennu", + GuiPath = "/Missions/Osiris Rex", + isLocal = false +} + +local bennu_survey_time = { + Identifier = "os.missions.osirisrex.setup.bennusurvey", + Name = "Set Bennu survey time", + Command = [[ + openspace.printInfo('Set time: Preliminary Survey'); + openspace.time.setTime('2018-NOV-20 01:13:12.183'); + ]], + Documentation = "Sets the time to the preliminary survey of Bennu", + GuiPath = "/Missions/Osiris Rex", + isLocal = false +} + +local bennu_event_b = { + Identifier = "os.missions.osirisrex.setup.bennueventb", + Name = "Set orbital B event time", + Command = [[ + openspace.printInfo('Set time: Orbital B'); + openspace.time.setTime('2019-APR-08 10:35:27.186'); + ]], + Documentation = "Sets the time to the orbital B event", + GuiPath = "/Missions/Osiris Rex", + isLocal = false +} + +local bennu_recon_event = { + Identifier = "os.missions.osirisrex.setup.bennureconevent", + Name = "Set recon event time", + Command = [[ + openspace.printInfo('Set time: Recon'); + openspace.time.setTime('2019-MAY-25 03:50:31.195'); + ]], + Documentation = "Sets the time to the recon event", + GuiPath = "/Missions/Osiris Rex", + isLocal = false +} + +local toggle_sun_marker = { + Identifier = "os.missions.osirisrex.togglesunmarker", + Name = "Toggle Sun marker", + Command = [[ + openspace.setPropertyValueSingle('Scene.SunMarker.Renderable.Enabled', not openspace.getPropertyValue('Scene.SunMarker.Renderable.Enabled')); + ]], + Documentation = "Toggles the visibility of the text marking the location of the Sun", + GuiPath = "/Missions/Osiris Rex", + isLocal = false +} + +asset.onInitialize(function() + openspace.action.registerAction(focus_osirisrex) + openspace.action.registerAction(focus_bennu) + openspace.action.registerAction(bennu_approach_time) + openspace.action.registerAction(bennu_survey_time) + openspace.action.registerAction(bennu_event_b) + openspace.action.registerAction(bennu_recon_event) + openspace.action.registerAction(toggle_sun_marker) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(toggle_sun_marker) + openspace.action.removeAction(bennu_recon_event) + openspace.action.removeAction(bennu_event_b) + openspace.action.removeAction(bennu_survey_time) + openspace.action.removeAction(bennu_approach_time) + openspace.action.removeAction(focus_bennu) + openspace.action.removeAction(focus_osirisrex) +end) + +asset.meta = { + Name = "OsirisRex Actions", + Version = "1.0", + Description = "Actions related to the OsirisRex mission", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/osirisrex/model.asset b/data/assets/scene/solarsystem/missions/osirisrex/model.asset index 0495381e73..70c2dd8a08 100644 --- a/data/assets/scene/solarsystem/missions/osirisrex/model.asset +++ b/data/assets/scene/solarsystem/missions/osirisrex/model.asset @@ -116,7 +116,7 @@ local Rexis = { } local PolyCamFov = { - Identifier = "POLYCAM FOV", + Identifier = "POLYCAM_FOV", Parent = PolyCam.Identifier, Renderable = { Type = "RenderableFov", @@ -171,7 +171,7 @@ local nodes = { } asset.onInitialize(function() - for i, node in ipairs(nodes) do + for _, node in ipairs(nodes) do openspace.addSceneGraphNode(node) end end) diff --git a/data/assets/scene/solarsystem/missions/osirisrex/osirisrex.asset b/data/assets/scene/solarsystem/missions/osirisrex/osirisrex.asset index 389b3d1103..b050d9687d 100644 --- a/data/assets/scene/solarsystem/missions/osirisrex/osirisrex.asset +++ b/data/assets/scene/solarsystem/missions/osirisrex/osirisrex.asset @@ -5,6 +5,7 @@ asset.require("./trail") asset.require("scene/solarsystem/sun/marker") asset.require("./script_schedule") +asset.require("./actions") local mission = asset.localResource("osirisrex.mission") local missionName diff --git a/data/assets/scene/solarsystem/missions/perseverance/actions.asset b/data/assets/scene/solarsystem/missions/perseverance/actions.asset new file mode 100644 index 0000000000..534f8d8dfd --- /dev/null +++ b/data/assets/scene/solarsystem/missions/perseverance/actions.asset @@ -0,0 +1,34 @@ +local setup_perseverance = { + Identifier = "os.missions.perseverance.setup", + Name = "Setup and Goto Perseverance", + Command = [[ + openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.Mola_Utah.Settings.Offset', -1685.5); + openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.HiRISE-LS-DEM.Settings.Offset', -1686.0); + openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.MDEM200M.Settings.Offset', -1686); + openspace.time.setPause(true); + openspace.time.setTime('2021 FEB 18 20:32:16'); + openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.HiRISE-LS-DEM.Enabled', true); + openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.ColorLayers.HiRISE-LS.Enabled', true); + openspace.navigation.setNavigationState({Anchor = 'Perseverance',Pitch = 0.567457E-4,Position = { 1.240506E1,-1.369270E1,-2.423553E0 },ReferenceFrame = 'Root',Up = { 0.441211E0,0.247019E0,0.862737E0 },Yaw = -0.446853E-4}); + ]], + Documentation = "Sets time and layers for Perseverance landing", + GuiPath = "/Missions/Perseverance", + isLocal = false +} + +asset.onInitialize(function() + openspace.action.registerAction(setup_perseverance) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(setup_perseverance) +end) + +asset.meta = { + Name = "Perseverance Actions", + Version = "1.0", + Description = "Actions related to the Perseverance mission", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/perseverance/perseverance.asset b/data/assets/scene/solarsystem/missions/perseverance/perseverance.asset index 0e9df57fa6..3378ce1803 100644 --- a/data/assets/scene/solarsystem/missions/perseverance/perseverance.asset +++ b/data/assets/scene/solarsystem/missions/perseverance/perseverance.asset @@ -1,2 +1,5 @@ asset.require("./model") asset.require("./trail") +asset.require("./actions") +asset.require("scene/solarsystem/planets/mars/mars") +asset.require("scene/solarsystem/planets/mars/default_layers") diff --git a/data/assets/scene/solarsystem/missions/rosetta/67p.asset b/data/assets/scene/solarsystem/missions/rosetta/67p.asset index b548f18445..2c694b7059 100644 --- a/data/assets/scene/solarsystem/missions/rosetta/67p.asset +++ b/data/assets/scene/solarsystem/missions/rosetta/67p.asset @@ -131,13 +131,58 @@ local Trail67P = { } } +-- actions +local focus_67p = { + Identifier = "os.missions.rosetta.67p.focus", + Name = "Focus on 67P", + Command = [[ + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', '67P'); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Aim', ''); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + ]], + Documentation = "Sets the focus of the camera on 67P", + GuiPath = "/Missions/Rosetta", + isLocal = false +} + +local clear_image_projections_67p = { + Identifier = "os.missions.rosetta.67p.clearimageprojections", + Name = "Clear 67P projections", + Command = [[ + openspace.setPropertyValue('Scene.67P.Renderable.ProjectionComponent.ClearAllProjections', true); + ]], + Documentation = "Removes all image projections from 67P", + GuiPath = "/Missions/Rosetta", + isLocal = false +} + +local toggle_67p_projection = { + Identifier = "os.missions.rosetta.toggle67pprojection", + Name = "Toggle 67P projection", + Command = [[ + openspace.setPropertyValueSingle('Scene.67P.Renderable.ProjectionComponent.PerformProjection', not openspace.getPropertyValue('Scene.67P.Renderable.ProjectionComponent.PerformProjection')); + ]], + Documentation = "Enables or disables the image projection on 67P", + GuiPath = "/Missions/Rosetta", + isLocal = false +} + + asset.onInitialize(function() openspace.addSceneGraphNode(Barycenter) openspace.addSceneGraphNode(Comet67P) openspace.addSceneGraphNode(Trail67P) + + openspace.action.registerAction(focus_67p) + openspace.action.registerAction(clear_image_projections_67p) + openspace.action.registerAction(toggle_67p_projection) end) asset.onDeinitialize(function() + openspace.action.removeAction(toggle_67p_projection) + openspace.action.removeAction(clear_image_projections_67p) + openspace.action.removeAction(focus_67p) + openspace.removeSceneGraphNode(Trail67P) openspace.removeSceneGraphNode(Comet67P) openspace.removeSceneGraphNode(Barycenter) diff --git a/data/assets/scene/solarsystem/missions/rosetta/actions.asset b/data/assets/scene/solarsystem/missions/rosetta/actions.asset new file mode 100644 index 0000000000..f8fda4a8f2 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/rosetta/actions.asset @@ -0,0 +1,30 @@ +local toggle_outer_planetary_trails = { + Identifier = "os.missions.rosetta.toggleouterplanetarytrails", + Name = "Toggle outer planetary trails", + Command = [[ + local list = openspace.getProperty('{planetTrail_giants}.Renderable.Enabled'); + for _,v in pairs(list) do + openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + end + ]], + Documentation = "Toggles the visibility of all trails further from the Sun than 67P", + GuiPath = "/Missions/Rosetta", + isLocal = false +} + +asset.onInitialize(function() + openspace.action.registerAction(toggle_outer_planetary_trails) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(toggle_outer_planetary_trails) +end) + +asset.meta = { + Name = "Rosetta actions", + Version = "1.0", + Description = "Actions related to the rosetta mission", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset b/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset index add4e4e36c..e0fa4248cf 100644 --- a/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset +++ b/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset @@ -2,7 +2,6 @@ local sun = asset.require("scene/solarsystem/sun/sun") local sunTransforms = asset.require("scene/solarsystem/sun/transforms") local transforms = asset.require("./67p") - local models = asset.syncedResource({ Name = "Rosetta Models", Type = "HttpSynchronization", @@ -556,13 +555,70 @@ local nodes = { PhilaeTrail } +-- actions +local focus_rosetta = { + Identifier = "os.missions.rosetta.focus", + Name = "Focus on Rosetta", + Command = [[ + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'Rosetta'); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Aim', ''); + openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + ]], + Documentation = "Sets the focus of the camera on Rosetta", + GuiPath = "/Missions/Rosetta", + isLocal = false +} + +local setup_lander_release_time = { + Identifier = "os.missions.rosetta.setup.landerrelease", + Name = "Set lander release time", + Command = [[ + openspace.time.setTime('2014-11-12T08:20:00.00'); + ]], + Documentation = "Jumps to the time when the Philae lander is released", + GuiPath = "/Missions/Rosetta", + isLocal = false +} + +local toggle_image_plane = { + Identifier = "os.missions.rosetta.toggleimageplane", + Name = "Toggle image plane", + Command = [[ + openspace.setPropertyValueSingle('Scene.ImagePlaneRosetta.Renderable.Enabled', not openspace.getPropertyValue('Scene.ImagePlaneRosetta.Renderable.Enabled')); + ]], + Documentation = "Toggles the visibility of the free floating image plane", + GuiPath = "/Missions/Rosetta", + isLocal = false +} + +local toggle_philae_trail = { + Identifier = "os.mission.rosetta.togglephilaetrail", + Name = "Toggle Philae trail", + Command = [[ + openspace.setPropertyValueSingle('Scene.PhilaeTrail.Renderable.Enabled', not openspace.getPropertyValue('Scene.PhilaeTrail.Renderable.Enabled')); + ]], + Documentation = "Toggles the visibility of Philae's trail", + GuiPath = "/Missions/Rosetta", + isLocal = false +} + asset.onInitialize(function () - for i, node in ipairs(nodes) do + for _, node in ipairs(nodes) do openspace.addSceneGraphNode(node) end + + openspace.action.registerAction(focus_rosetta) + openspace.action.registerAction(setup_lander_release_time) + openspace.action.registerAction(toggle_image_plane) + openspace.action.registerAction(toggle_philae_trail) end) asset.onDeinitialize(function () + openspace.action.removeAction(toggle_philae_trail) + openspace.action.removeAction(toggle_image_plane) + openspace.action.removeAction(setup_lander_release_time) + openspace.action.removeAction(focus_rosetta) + for i = #nodes, 1, -1 do openspace.removeSceneGraphNode(nodes[i]) end diff --git a/data/assets/scene/solarsystem/missions/voyager/actions.asset b/data/assets/scene/solarsystem/missions/voyager/actions.asset new file mode 100644 index 0000000000..2a061362b7 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/voyager/actions.asset @@ -0,0 +1,86 @@ +local jupiter_approach = { + Identifier = "os.missions.voyager.setup.jupiterapproach", + Name = "Set Jupiter Approach", + Command = [[ + openspace.time.setTime('1979-01-20T01:32:07.914') + ]], + Documentation = "Sets the time for Voyager's approach to Jupiter", + GuiPath = "/Missions/Voyager", + isLocal = false +} + +local saturn_approach = { + Identifier = "os.missions.voyager.setup.saturnapproach", + Name = "Set Saturn Approach", + Command = [[ + openspace.time.setTime('1980-10-20T07:43:42.645'); + ]], + Documentation = "Sets the time for Voyager's approach to Saturn", + GuiPath = "/Missions/Voyager", + isLocal = false +} + +local focus_jupiter = { + Identifier = "os.missions.voyager.jupiter.focus", + Name = "Focus on Jupiter", + Command = [[ + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Anchor', 'Jupiter'); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Aim', ''); + ]], + Documentation = "Set the camera focus to Jupiter", + GuiPath = "/Missions/Voyager", + isLocal = false +} + +local focus_saturn = { + Identifier = "os.missions.voyager.saturn.focus", + Name = "Focus on Saturn", + Command = [[ + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Anchor', 'Saturn'); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Aim', ''); + ]], + Documentation = "Sets the camera focus on Saturn", + GuiPath = "/Missions/Voyager", + isLocal = false +} + +local toggle_minormoon_trails = { + Identifier = "os.missions.voyager.toggleminormoontrails", + Name = "Toggle minor trails", + Command = [[ + local list = openspace.getProperty('{moonTrail_minor}.Renderable.Enabled'); + for _,v in pairs(list) do + openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + end + ]], + Documentation = "Toggles the trails of the minor moons", + GuiPath = "/Trails", + isLocal = false +} + +asset.onInitialize(function() + openspace.action.registerAction(jupiter_approach) + openspace.action.registerAction(saturn_approach) + openspace.action.registerAction(focus_jupiter) + openspace.action.registerAction(focus_saturn) + openspace.action.registerAction(toggle_minormoon_trails) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(toggle_minormoon_trails) + openspace.action.removeAction(focus_saturn) + openspace.action.removeAction(focus_jupiter) + openspace.action.removeAction(saturn_approach) + openspace.action.removeAction(jupiter_approach) +end) + +asset.meta = { + Name = "Voyager Actions", + Version = "1.0", + Description = "Actions related to the Voyager 1 and 2 missions", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/voyager/dashboard.asset b/data/assets/scene/solarsystem/missions/voyager/dashboard.asset index ae99e94d5b..9960e66750 100644 --- a/data/assets/scene/solarsystem/missions/voyager/dashboard.asset +++ b/data/assets/scene/solarsystem/missions/voyager/dashboard.asset @@ -5,7 +5,8 @@ local distance_voyager1 = { SourceType = "Node", SourceNodeName = "Voyager_1", DestinationType = "Node", - DestinationNodeName = "Earth" + DestinationNodeName = "Earth", + Enabled = asset.enabled } local distance_voyager2 = { @@ -15,7 +16,8 @@ local distance_voyager2 = { SourceType = "Node", SourceNodeName = "Voyager_2", DestinationType = "Node", - DestinationNodeName = "Earth" + DestinationNodeName = "Earth", + Enabled = asset.enabled } asset.onInitialize(function() diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager1.asset b/data/assets/scene/solarsystem/missions/voyager/voyager1.asset index 8b6fe64442..4d849b4f96 100644 --- a/data/assets/scene/solarsystem/missions/voyager/voyager1.asset +++ b/data/assets/scene/solarsystem/missions/voyager/voyager1.asset @@ -73,8 +73,10 @@ local Voyager1Main = { Type = "CameraLightSource", Intensity = 0.5 } - } + }, + Enabled = asset.enabled }, + Tag = { "voyager1_part" }, GUI = { Name = "Voyager 1 Main", Path = "/Solar System/Missions/Voyager 1" @@ -95,8 +97,10 @@ local Voyager1Antenna = { Type = "CameraLightSource", Intensity = 0.5 } - } + }, + Enabled = asset.enabled }, + Tag = { "voyager1_part" }, GUI = { Name = "Voyager 1 Antenna", Path = "/Solar System/Missions/Voyager 1" @@ -120,8 +124,10 @@ local VoyagerTrailCruiseEarthJupiter = { Color = { 0.70, 0.50, 0.20 }, StartTime = "1977 SEP 05", EndTime = "1979 MAR 04", - SampleInterval = 545 * 2 -- 545 is the number of days between the Start and End time + SampleInterval = 545 * 2, -- 545 is the number of days between the Start and End time + Enabled = asset.enabled }, + Tag = { "voyager1_trail" }, GUI = { Name = "Voyager 1 Trail Cruise Earth-Jupiter", Path = "/Solar System/Missions/Voyager 1" @@ -143,8 +149,10 @@ local VoyagerTrailEncounterJupiter = { EnableFade = false, StartTime = "1979 MAR 03 23:24:00", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? EndTime = "1979 MAR 09", - SampleInterval = 100 + SampleInterval = 100, + Enabled = asset.enabled }, + Tag = { "voyager1_trail" }, GUI = { Name = "Voyager 1 Trail Encounter Jupiter", Path = "/Solar System/Missions/Voyager 1" @@ -166,8 +174,10 @@ local VoyagerTrailCruiseJupiterSaturn = { Color = { 0.70, 0.50, 0.20 }, StartTime = "1979 MAR 09", EndTime = "1980 NOV 11", - SampleInterval = 618 * 2 -- 618 is the number of days between the Start and End time + SampleInterval = 618 * 2, -- 618 is the number of days between the Start and End time + Enabled = asset.enabled }, + Tag = { "voyager1_trail" }, GUI = { Name = "Voyager 1 Trail Cruise Jupiter-Saturn", Path = "/Solar System/Missions/Voyager 1" @@ -189,8 +199,10 @@ local VoyagerTrailEncounterSaturn = { Color = { 0.70, 0.50, 0.20 }, StartTime = "1980 NOV 10 23:08:30", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? EndTime = "1980 NOV 16", - SampleInterval = 100 + SampleInterval = 100, + Enabled = asset.enabled }, + Tag = { "voyager1_trail" }, GUI = { Name = "Voyager 1 Trail Encounter Saturn", Path = "/Solar System/Missions/Voyager 1" @@ -211,9 +223,11 @@ local VoyagerTrailCruiseSaturnInf = { EnableFade = false, Color = { 0.70, 0.50, 0.20 }, StartTime = "1980 NOV 16", - EndTime = "2021 JAN 01", - SampleInterval = 14656 * 2 -- 14656 is the number of days between the Start and End time + EndTime = "2300 JAN 01", + SampleInterval = 116558 * 2, -- 116558 is the number of days between the Start and End time + Enabled = asset.enabled }, + Tag = { "voyager1_trail" }, GUI = { Name = "Voyager 1 Trail Cruise Saturn-Inf", Path = "/Solar System/Missions/Voyager 1" @@ -231,13 +245,34 @@ local nodes = { VoyagerTrailCruiseSaturnInf } +-- Actions + +local focus_voyager1 = { + Identifier = "os.missions.voyager.v1.focus", + Name = "Focus on Voyager 1", + Command = [[ + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Anchor', 'Voyager_1'); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Aim', '') + ]], + Documentation = "Set camera focus to Voyager 1", + GuiPath = "/Missions/Voyager", + isLocal = false +} + +-- Initialize + asset.onInitialize(function() for i, node in ipairs(nodes) do openspace.addSceneGraphNode(node) end + + openspace.action.registerAction(focus_voyager1) end) asset.onDeinitialize(function() + openspace.action.removeAction(focus_voyager1) + for i = #nodes, 1, -1 do openspace.removeSceneGraphNode(nodes[i]) end diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset index e918571335..eb7a56b181 100644 --- a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset +++ b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset @@ -77,8 +77,10 @@ local Voyager2Main = { Type = "CameraLightSource", Intensity = 0.5 } - } + }, + Enabled = asset.enabled }, + Tag = { "voyager2_part" }, GUI = { Name = "Voyager 2 Main", Path = "/Solar System/Missions/Voyager 2" @@ -99,8 +101,10 @@ local Voyager2Antenna = { Type = "CameraLightSource", Intensity = 0.5 } - } + }, + Enabled = asset.enabled }, + Tag = { "voyager2_part" }, GUI = { Name = "Voyager 2 Antenna", Path = "/Solar System/Missions/Voyager 2" @@ -124,8 +128,10 @@ local VoyagerTrailCruiseEarthJupiter = { Color = { 0.70, 0.50, 0.20 }, StartTime = "1977-AUG-20 16:07:06.535", EndTime = "1979 JUL 06", - SampleInterval = 669 * 2 -- 669 is the number of days between the Start and End time + SampleInterval = 669 * 2, -- 669 is the number of days between the Start and End time + Enabled = asset.enabled }, + Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Cruise Earth-Jupiter", Path = "/Solar System/Missions/Voyager 2" @@ -147,8 +153,10 @@ local VoyagerTrailEncounterJupiter = { EnableFade = false, StartTime = "1979 JUL 05 23:24:00", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? EndTime = "1979 JUL 15", - SampleInterval = 100 + SampleInterval = 100, + Enabled = asset.enabled }, + Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Encounter Jupiter", Path = "/Solar System/Missions/Voyager 2" @@ -170,8 +178,10 @@ local VoyagerTrailCruiseJupiterSaturn = { Color = { 0.70, 0.50, 0.20 }, StartTime = "1979 JUL 15", EndTime = "1981 AUG 23", - SampleInterval = 770 * 2 -- 770 is the number of days between the Start and End time + SampleInterval = 770 * 2, -- 770 is the number of days between the Start and End time + Enabled = asset.enabled }, + Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Cruise Jupiter-Saturn", Path = "/Solar System/Missions/Voyager 2" @@ -193,8 +203,10 @@ local VoyagerTrailEncounterSaturn = { Color = { 0.70, 0.50, 0.20 }, StartTime = "1981 AUG 22 23:08:30", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? EndTime = "1981 AUG 30", - SampleInterval = 100 + SampleInterval = 100, + Enabled = asset.enabled }, + Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Encounter Saturn", Path = "/Solar System/Missions/Voyager 2" @@ -216,8 +228,10 @@ local VoyagerTrailCruiseSaturnUranus = { Color = { 0.70, 0.50, 0.20 }, StartTime = "1981 AUG 30", EndTime = "1986 JAN 22", - SampleInterval = 1971 * 2 -- 1971 is the number of days between the Start and End time + SampleInterval = 1971 * 2, -- 1971 is the number of days between the Start and End time + Enabled = asset.enabled }, + Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Cruise Saturn-Uranus", Path = "/Solar System/Missions/Voyager 2" @@ -239,8 +253,10 @@ local VoyagerTrailEncounterUranus = { Color = { 0.70, 0.50, 0.20 }, StartTime = "1986 JAN 21 23:30:00", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? EndTime = "1986 JAN 27", - SampleInterval = 100 + SampleInterval = 100, + Enabled = asset.enabled }, + Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Encounter Uranus", Path = "/Solar System/Missions/Voyager 2" @@ -262,8 +278,10 @@ local VoyagerTrailCruiseUranusNeptune = { Color = { 0.70, 0.50, 0.20 }, StartTime = "1986 JAN 27", EndTime = "1989 AUG 24", - SampleInterval = 1305 * 2 -- 1305 is the number of days between the Start and End time + SampleInterval = 1305 * 2, -- 1305 is the number of days between the Start and End time + Enabled = asset.enabled }, + Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Cruise Uranus-Neptune", Path = "/Solar System/Missions/Voyager 2" @@ -285,8 +303,10 @@ local VoyagerTrailEncounterNeptune = { Color = { 0.70, 0.50, 0.20 }, StartTime = "1989 AUG 23 23:30:00", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? EndTime = "1989 AUG 26", - SampleInterval = 100 + SampleInterval = 100, + Enabled = asset.enabled }, + Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Encounter Neptune", Path = "/Solar System/Missions/Voyager 2" @@ -307,9 +327,11 @@ local VoyagerTrailCruiseNeptuneInf = { EnableFade = false, Color = { 0.70, 0.50, 0.20 }, StartTime = "1989 AUG 26", - EndTime = "2021 JAN 01", - SampleInterval = 11451 * 2 -- 11451 is the number of days between the Start and End time + EndTime = "2300 JAN 01", + SampleInterval = 113353 * 2, -- 113353 is the number of days between the Start and End time + Enabled = asset.enabled }, + Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Cruise Neptune-Inf", Path = "/Solar System/Missions/Voyager 2" @@ -331,16 +353,38 @@ local nodes = { VoyagerTrailCruiseNeptuneInf } + +-- Actions + +local focus_voyager2 = { + Identifier = "os.missions.voyager.v2.focus", + Name = "Focus on Voyager 2", + Command = [[ + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Anchor', 'Voyager_2'); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Aim', '') + ]], + Documentation = "Set camera focus to Voyager 2", + GuiPath = "/Missions/Voyager", + isLocal = false +} + +-- Initialize + asset.onInitialize(function() for i, node in ipairs(nodes) do openspace.addSceneGraphNode(node) end + + openspace.action.registerAction(focus_voyager2) end) asset.onDeinitialize(function() for i = #nodes, 1, -1 do openspace.removeSceneGraphNode(nodes[i]) end + + openspace.action.removeAction(focus_voyager2) end) for i, node in ipairs(nodes) do diff --git a/data/assets/scene/solarsystem/planets/earth/earth.asset b/data/assets/scene/solarsystem/planets/earth/earth.asset index a34c21e45f..70cf21bfd3 100644 --- a/data/assets/scene/solarsystem/planets/earth/earth.asset +++ b/data/assets/scene/solarsystem/planets/earth/earth.asset @@ -73,12 +73,45 @@ local EarthLabel = { } } +local focus_earth = { + Identifier = "os.solarsystem.earth.focus", + Name = "Focus on Earth", + Command = [[ + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Aim', ''); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Anchor', 'Earth'); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + ]], + Documentation = "Set camera focus on the Earth", + GuiPath = "/Solar System/Earth", + isLocal = false +} + +local toggle_earth_satellitetrails = { + Identifier = "os.solarsystem.earth.togglesatellitetrails", + Name = "Toggle satellite trails", + Command = [[ + local list = openspace.getProperty('{earth_satellites}.Renderable.Enabled'); + for _,v in pairs(list) do + openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + end + ]], + Documentation = "Toggle trails on or off for satellites around Earth", + GuiPath = "/Solar System/Earth", + isLocal = false +} + asset.onInitialize(function() openspace.addSceneGraphNode(Earth) openspace.addSceneGraphNode(EarthLabel) + + openspace.action.registerAction(focus_earth) + openspace.action.registerAction(toggle_earth_satellitetrails) end) asset.onDeinitialize(function() + openspace.action.removeAction(toggle_earth_satellitetrails) + openspace.action.removeAction(focus_earth) + openspace.removeSceneGraphNode(EarthLabel) openspace.removeSceneGraphNode(Earth) end) @@ -90,7 +123,7 @@ asset.export(EarthLabel) asset.meta = { Name = "Earth", - Version = "1.0", + Version = "1.1", Description = "Earth is a special planet with special needs", Author = "OpenSpace Team", URL = "http://openspaceproject.com", diff --git a/data/assets/scene/solarsystem/planets/earth/moon/moon.asset b/data/assets/scene/solarsystem/planets/earth/moon/moon.asset index d2f6ff416d..3a6c45e3c6 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/moon.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/moon.asset @@ -81,13 +81,42 @@ local MoonLabel = { } } +local focus_moon = { + Identifier = "os.solarsystem.earth.moon.focus", + Name = "Focus on Moon", + Command = [[ + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Aim', ''); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Anchor', 'Moon'); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + ]], + Documentation = "Set camera focus on the Moon", + GuiPath = "/Solar System/Earth/Moon", + isLocal = false +} + +local toggle_moon_shading = { + Identifier = "os.solarsystem.earth.moon.toggleshading", + Name = "Toggle Moon shading", + Command = [[ + openspace.setPropertyValueSingle('Scene.Moon.Renderable.PerformShading', not openspace.getPropertyValue('Scene.Moon.Renderable.PerformShading')); + ]], + Documentation = "Toggles the shading of the Moon", + GuiPath = "/Solar System/Earth/Moon", + isLocal = false +} asset.onInitialize(function() openspace.addSceneGraphNode(Moon) openspace.addSceneGraphNode(MoonLabel) + + openspace.action.registerAction(focus_moon) + openspace.action.registerAction(toggle_moon_shading) end) asset.onDeinitialize(function() + openspace.action.removeAction(toggle_moon_shading) + openspace.action.removeAction(focus_moon) + openspace.removeSceneGraphNode(MoonLabel) openspace.removeSceneGraphNode(Moon) end) @@ -98,8 +127,8 @@ asset.export(Moon) asset.meta = { Name = "Moon", - Version = "1.1", - Description = "Moon globe with labels", + Version = "1.2", + Description = "Moon globe with labels and actions", Author = "OpenSpace Team", URL = "http://openspaceproject.com", License = "MIT license" diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset b/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset index d5523fc067..9a51e5dddb 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset @@ -118,6 +118,19 @@ local IssLabel = { } } +local focus_iss = { + Identifier = "os.solarsystem.earth.iss.focus", + Name = "Focus on ISS", + Command = [[ + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Aim', ''); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Anchor', 'ISS'); + openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); + ]], + Documentation = "Refocuses the camera on the ISS", + GuiPath = "/Solar System/Earth", + isLocal = false +} + asset.onInitialize(function () local i = openspace.space.readKeplerFile(omm .. "ISS.txt", "OMM") issTrail.Renderable.Period = i[0].Period / (60 * 60 * 24) @@ -127,9 +140,12 @@ asset.onInitialize(function () openspace.addSceneGraphNode(issTrail) openspace.setPropertyValueSingle("Scene.ISS.Rotation.yAxisInvertObject", true) + openspace.action.registerAction(focus_iss) end) asset.onDeinitialize(function () + openspace.action.removeAction(focus_iss) + openspace.removeSceneGraphNode(issTrail) openspace.removeSceneGraphNode(issModel) openspace.removeSceneGraphNode(issPosition) @@ -141,7 +157,7 @@ asset.export(issPosition) asset.meta = { Name = "ISS", - Version = "1.0", + Version = "1.1", Description = [[Model and Trail for ISS. Model from NASA 3D models, trail from Celestrak.]], Author = "OpenSpace Team", diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/ananke_group.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/ananke_group.asset index 57b1e28372..0db8004434 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/ananke_group.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/ananke_group.asset @@ -6,13 +6,14 @@ local kernel = asset.require("../kernels").jup341 local parentIdentifier = transforms.JupiterBarycenter.Identifier local parentSpice = "JUPITER BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_jupiter", "moon_ananke", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_jupiter", "moon_ananke", "moon_minor", "moon_minor_jupiter" } local trailColor = { 0.4, 0.3, 0.01 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_jupiter", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_jupiter" } local anankeGroup = { diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/carme_group.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/carme_group.asset index 0a39412b0d..683cf0c489 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/carme_group.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/carme_group.asset @@ -6,13 +6,14 @@ local kernel = asset.require("../kernels").jup341 local parentIdentifier = transforms.JupiterBarycenter.Identifier local parentSpice = "JUPITER BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_jupiter", "moon_carme", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_jupiter", "moon_carme", "moon_minor", "moon_minor_jupiter" } local trailColor = { 0.4, 0.3, 0.01 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_jupiter", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_jupiter" } local carmeGroup = { diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/carpo_group.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/carpo_group.asset index dfd8d7d069..24834899a0 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/carpo_group.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/carpo_group.asset @@ -6,13 +6,14 @@ local kernel = asset.require("../kernels").jup341 local parentIdentifier = transforms.JupiterBarycenter.Identifier local parentSpice = "JUPITER BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_jupiter", "moon_carpo", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_jupiter", "moon_carpo", "moon_minor", "moon_minor_jupiter" } local trailColor = { 0.4, 0.3, 0.01 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_jupiter", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_jupiter" } local carpoGroup = { diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/himalia_group.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/himalia_group.asset index 5a4ce45db9..e66ae2fa9c 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/himalia_group.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/himalia_group.asset @@ -6,13 +6,14 @@ local kernel = asset.require("../kernels").jup341 local parentIdentifier = transforms.JupiterBarycenter.Identifier local parentSpice = "JUPITER BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_jupiter", "moon_himalia", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_jupiter", "moon_himalia", "moon_minor", "moon_minor_jupiter" } local trailColor = { 0.4, 0.3, 0.01 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_jupiter", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_jupiter" } local himaliaGroup = { diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/inner_group.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/inner_group.asset index 22ba7c7df1..b1bb9b4749 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/inner_group.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/inner_group.asset @@ -6,13 +6,14 @@ local kernel = asset.require("../kernels").jup341 local parentIdentifier = transforms.JupiterBarycenter.Identifier local parentSpice = "JUPITER BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_jupiter", "moon_inner", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_jupiter", "moon_inner", "moon_minor", "moon_minor_jupiter" } local trailColor = { 0.4, 0.3, 0.01 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_jupiter", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_jupiter" } local innerMoons = { diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/other_groups.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/other_groups.asset index d47e7cb08d..ca46e4a280 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/other_groups.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/other_groups.asset @@ -6,13 +6,14 @@ local kernel = asset.require("../kernels").jup341 local parentIdentifier = transforms.JupiterBarycenter.Identifier local parentSpice = "JUPITER BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_jupiter", "moon_other", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_jupiter", "moon_other", "moon_minor", "moon_minor_jupiter" } local trailColor = { 0.4, 0.3, 0.01 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_jupiter", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_jupiter" } local otherGroups = { diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/pasiphae_group.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/pasiphae_group.asset index 6e78f38342..0fbf568e03 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/pasiphae_group.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/pasiphae_group.asset @@ -6,13 +6,14 @@ local kernel = asset.require("../kernels").jup341 local parentIdentifier = transforms.JupiterBarycenter.Identifier local parentSpice = "JUPITER BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_jupiter", "moon_pasiphae", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_jupiter", "moon_pasiphae", "moon_minor", "moon_minor_jupiter" } local trailColor = { 0.4, 0.3, 0.01 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_jupiter", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_jupiter" } local pasiphaeGroup = { { diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/themisto_group.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/themisto_group.asset index 1442f47a6f..5656a8e53f 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/themisto_group.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/themisto_group.asset @@ -6,13 +6,14 @@ local kernel = asset.require("../kernels").jup341 local parentIdentifier = transforms.JupiterBarycenter.Identifier local parentSpice = "JUPITER BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_jupiter", "moon_themisto", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_jupiter", "moon_themisto", "moon_minor", "moon_minor_jupiter" } local trailColor = { 0.4, 0.3, 0.01 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_jupiter", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_jupiter" } local themistoGroup = { { diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor_moons.asset b/data/assets/scene/solarsystem/planets/jupiter/minor_moons.asset index a5b0119172..8bcf2aa6ee 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor_moons.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor_moons.asset @@ -7,10 +7,68 @@ asset.require("./minor/other_groups") asset.require("./minor/pasiphae_group") asset.require("./minor/themisto_group") +local minormoons_on = { + Identifier = "os.solarsystem.jupiter.minormoonson", + Name = "Turn ON minor moons and trails", + Command = [[ + local trails = openspace.getProperty('{moonTrail_minor_jupiter}.Renderable.Enabled'); + local trails_fade = openspace.getProperty('{moonTrail_minor_jupiter}.Renderable.Fade'); + + local moons = openspace.getProperty('{moon_minor_jupiter}.Renderable.Enabled'); + local moons_fade = openspace.getProperty('{moon_minor_jupiter}.Renderable.Fade'); + + for i, v in pairs(trails_fade) do + openspace.setPropertyValueSingle(trails[i], true) + openspace.setPropertyValueSingle(v, 1, 2, 'Linear') + end + + for i, v in pairs(moons_fade) do + openspace.setPropertyValueSingle(moons[i], true) + openspace.setPropertyValueSingle(v, 1, 2, 'Linear') + end + ]], + Documentation = "Turn ON Jupiter's minor moons and their trails", + GuiPath = "/Solar System/Jupiter", + IsLocal = true +} + +local minormoons_off = { + Identifier = "os.solarsystem.jupiter.minormoonsoff", + Name = "Turn OFF minors moon and trails", + Command = [[ + local trails = openspace.getProperty('{moonTrail_minor_jupiter}.Renderable.Enabled'); + local trails_fade = openspace.getProperty('{moonTrail_minor_jupiter}.Renderable.Fade'); + + local moons = openspace.getProperty('{moon_minor_jupiter}.Renderable.Enabled'); + local moons_fade = openspace.getProperty('{moon_minor_jupiter}.Renderable.Fade'); + + for i, v in pairs(trails_fade) do + openspace.setPropertyValueSingle(v, 0, 2, 'Linear', "openspace.setPropertyValueSingle('" .. trails[i] .. "', false)" ) + end + + for i, v in pairs(moons_fade) do + openspace.setPropertyValueSingle(v, 0, 2, 'Linear', "openspace.setPropertyValueSingle('" .. moons[i] .. "', false)" ) + end + ]], + Documentation = "Turn OFF Jupiter's minor moons and their trails", + GuiPath = "/Solar System/Jupiter", + IsLocal = true +} + +asset.onInitialize(function() + openspace.action.registerAction(minormoons_on) + openspace.action.registerAction(minormoons_off) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(minormoons_off) + openspace.action.removeAction(minormoons_on) +end) + asset.meta = { Name = "Jupiter Minor Moons", - Version = "1.0", + Version = "1.1", Description = [[Meta asset containing eight moon groups: Ananke, Carme, Carpo, Himalia, Pasiphae, Themisto, Inner, and Other]], Author = "OpenSpace Team", diff --git a/data/assets/scene/solarsystem/planets/neptune/inner_moons.asset b/data/assets/scene/solarsystem/planets/neptune/inner_moons.asset index 93d166d2de..29372eb903 100644 --- a/data/assets/scene/solarsystem/planets/neptune/inner_moons.asset +++ b/data/assets/scene/solarsystem/planets/neptune/inner_moons.asset @@ -9,13 +9,14 @@ local kernel088 = kernels.nep088 local parentIdentifier = transforms.NeptuneBarycenter.Identifier local parentSpice = "NEPTUNE BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_neptune", "moon_inner", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_neptune", "moon_inner", "moon_minor", "moon_minor_neptune" } local trailColor = { 0.2, 0.5, 0.75 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_neptune", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_neptune" } local innerMoons = { diff --git a/data/assets/scene/solarsystem/planets/neptune/irregular_prograde_moons.asset b/data/assets/scene/solarsystem/planets/neptune/irregular_prograde_moons.asset index bc869449b7..4677234303 100644 --- a/data/assets/scene/solarsystem/planets/neptune/irregular_prograde_moons.asset +++ b/data/assets/scene/solarsystem/planets/neptune/irregular_prograde_moons.asset @@ -9,13 +9,14 @@ local kernel088 = kernels.nep088 local parentIdentifier = transforms.NeptuneBarycenter.Identifier local parentSpice = "NEPTUNE BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_neptune", "moon_irregular_prograde", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_neptune", "moon_irregular_prograde", "moon_minor", "moon_minor_neptune" } local trailColor = { 0.2, 0.5, 0.75 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_neptune", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_neptune" } local irregularProgradeMoons = { diff --git a/data/assets/scene/solarsystem/planets/neptune/irregular_retrograde_moons.asset b/data/assets/scene/solarsystem/planets/neptune/irregular_retrograde_moons.asset index 3285c26633..ff8e2102c1 100644 --- a/data/assets/scene/solarsystem/planets/neptune/irregular_retrograde_moons.asset +++ b/data/assets/scene/solarsystem/planets/neptune/irregular_retrograde_moons.asset @@ -8,13 +8,14 @@ local kernel086 = kernels.nep086 local parentIdentifier = transforms.NeptuneBarycenter.Identifier local parentSpice = "NEPTUNE BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_neptune", "moon_irregular_retrograde", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_neptune", "moon_irregular_retrograde", "moon_minor", "moon_minor_neptune" } local trailColor = { 0.2, 0.5, 0.75 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_neptune", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_neptune" } local irregularRetrogradeMoons = { diff --git a/data/assets/scene/solarsystem/planets/neptune/minor_moons.asset b/data/assets/scene/solarsystem/planets/neptune/minor_moons.asset index 1371d1f711..9bc23449ea 100644 --- a/data/assets/scene/solarsystem/planets/neptune/minor_moons.asset +++ b/data/assets/scene/solarsystem/planets/neptune/minor_moons.asset @@ -2,10 +2,67 @@ asset.require("./inner_moons") asset.require("./irregular_prograde_moons") asset.require("./irregular_retrograde_moons") +local minormoons_on = { + Identifier = "os.solarsystem.neptune.minormoonson", + Name = "Turn ON minor moons and trails", + Command = [[ + local trails = openspace.getProperty('{moonTrail_minor_neptune}.Renderable.Enabled'); + local trails_fade = openspace.getProperty('{moonTrail_minor_neptune}.Renderable.Fade'); + + local moons = openspace.getProperty('{moon_minor_neptune}.Renderable.Enabled'); + local moons_fade = openspace.getProperty('{moon_minor_neptune}.Renderable.Fade'); + + for i, v in pairs(trails_fade) do + openspace.setPropertyValueSingle(trails[i], true) + openspace.setPropertyValueSingle(v, 1, 2, 'Linear') + end + + for i, v in pairs(moons_fade) do + openspace.setPropertyValueSingle(moons[i], true) + openspace.setPropertyValueSingle(v, 1, 2, 'Linear') + end + ]], + Documentation = "Turn ON Neptune's minor moons and their trails", + GuiPath = "/Solar System/Neptune", + IsLocal = true +} + +local minormoons_off = { + Identifier = "os.solarsystem.neptune.minormoonsoff", + Name = "Turn OFF minors moon and trails", + Command = [[ + local trails = openspace.getProperty('{moonTrail_minor_neptune}.Renderable.Enabled'); + local trails_fade = openspace.getProperty('{moonTrail_minor_neptune}.Renderable.Fade'); + + local moons = openspace.getProperty('{moon_minor_neptune}.Renderable.Enabled'); + local moons_fade = openspace.getProperty('{moon_minor_neptune}.Renderable.Fade'); + + for i, v in pairs(trails_fade) do + openspace.setPropertyValueSingle(v, 0, 2, 'Linear', "openspace.setPropertyValueSingle('" .. trails[i] .. "', false)" ) + end + + for i, v in pairs(moons_fade) do + openspace.setPropertyValueSingle(v, 0, 2, 'Linear', "openspace.setPropertyValueSingle('" .. moons[i] .. "', false)" ) + end + ]], + Documentation = "Turn OFF Neptune's minor moons and their trails", + GuiPath = "/Solar System/Neptune", + IsLocal = true +} + +asset.onInitialize(function() + openspace.action.registerAction(minormoons_on) + openspace.action.registerAction(minormoons_off) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(minormoons_off) + openspace.action.removeAction(minormoons_on) +end) asset.meta = { Name = "Neptune Minor Moons", - Version = "1.0", + Version = "1.1", Description = [[Meta asset containing 3 moon groups: inner_moons, irregular_prograde_moons, and irregular_retrograde_moons]], Author = "OpenSpace Team", diff --git a/data/assets/scene/solarsystem/planets/saturn/minor/gallic_group.asset b/data/assets/scene/solarsystem/planets/saturn/minor/gallic_group.asset index 4484d53c4a..7b2f72efdb 100644 --- a/data/assets/scene/solarsystem/planets/saturn/minor/gallic_group.asset +++ b/data/assets/scene/solarsystem/planets/saturn/minor/gallic_group.asset @@ -6,13 +6,14 @@ local kernel = asset.require("../kernels").sat368 local parentIdentifier = transforms.SaturnBarycenter.Identifier local parentSpice = "SATURN BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_saturn", "moon_gallic", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_saturn", "moon_gallic", "moon_minor", "moon_minor_saturn" } local trailColor = { 0.5, 0.3, 0.3 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_saturn", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_saturn" } local gallicGroup = { diff --git a/data/assets/scene/solarsystem/planets/saturn/minor/inuit_group.asset b/data/assets/scene/solarsystem/planets/saturn/minor/inuit_group.asset index 56b7ed7418..6642e7850f 100644 --- a/data/assets/scene/solarsystem/planets/saturn/minor/inuit_group.asset +++ b/data/assets/scene/solarsystem/planets/saturn/minor/inuit_group.asset @@ -6,13 +6,14 @@ local kernel = asset.require("../kernels").sat368 local parentIdentifier = transforms.SaturnBarycenter.Identifier local parentSpice = "SATURN BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_saturn", "moon_inuit", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_saturn", "moon_inuit", "moon_minor", "moon_minor_saturn" } local trailColor = { 0.5, 0.3, 0.3 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_saturn", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_saturn" } local inuitGroup = { diff --git a/data/assets/scene/solarsystem/planets/saturn/minor/norse_group.asset b/data/assets/scene/solarsystem/planets/saturn/minor/norse_group.asset index afc11e0075..0a1efada10 100644 --- a/data/assets/scene/solarsystem/planets/saturn/minor/norse_group.asset +++ b/data/assets/scene/solarsystem/planets/saturn/minor/norse_group.asset @@ -8,13 +8,14 @@ local kernel375 = kernels.sat375 local parentIdentifier = transforms.SaturnBarycenter.Identifier local parentSpice = "SATURN BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_saturn", "moon_norse", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_saturn", "moon_norse", "moon_minor", "moon_minor_saturn" } local trailColor = { 0.5, 0.3, 0.3 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_saturn", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_saturn" } local norseGroup = { diff --git a/data/assets/scene/solarsystem/planets/saturn/minor/other_group.asset b/data/assets/scene/solarsystem/planets/saturn/minor/other_group.asset index 19d44eba00..552104b632 100644 --- a/data/assets/scene/solarsystem/planets/saturn/minor/other_group.asset +++ b/data/assets/scene/solarsystem/planets/saturn/minor/other_group.asset @@ -8,13 +8,14 @@ local kernel393 = kernels.sat393 local parentIdentifier = transforms.SaturnBarycenter.Identifier local parentSpice = "SATURN BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_saturn", "moon_other", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_saturn", "moon_other", "moon_minor", "moon_minor_saturn" } local trailColor = { 0.5, 0.3, 0.3 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_saturn", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_saturn" } local otherGroup = { diff --git a/data/assets/scene/solarsystem/planets/saturn/minor/shepherd_group.asset b/data/assets/scene/solarsystem/planets/saturn/minor/shepherd_group.asset index df41cfe6ac..79715fa18a 100644 --- a/data/assets/scene/solarsystem/planets/saturn/minor/shepherd_group.asset +++ b/data/assets/scene/solarsystem/planets/saturn/minor/shepherd_group.asset @@ -16,13 +16,14 @@ local kernels = { local parentIdentifier = transforms.SaturnBarycenter.Identifier local parentSpice = "SATURN BARYCENTER" local guiPath = "/Solar System/Planets/Saturn/Moons/Shepherd Moons" -local tags = { "moon_solarSystem", "moon_giants", "moon_saturn", "moon_shepherd", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_saturn", "moon_shepherd", "moon_minor", "moon_minor_saturn" } local trailColor = { 0.5, 0.3, 0.3 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_saturn", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_saturn" } local shepherdGroup = { diff --git a/data/assets/scene/solarsystem/planets/saturn/minor_moons.asset b/data/assets/scene/solarsystem/planets/saturn/minor_moons.asset index 0012552b4c..cf98ce0f4f 100644 --- a/data/assets/scene/solarsystem/planets/saturn/minor_moons.asset +++ b/data/assets/scene/solarsystem/planets/saturn/minor_moons.asset @@ -4,10 +4,67 @@ asset.require("./minor/norse_group") asset.require("./minor/other_group") asset.require("./minor/shepherd_group") +local minormoons_on = { + Identifier = "os.solarsystem.saturn.minormoonson", + Name = "Turn ON minor moons and trails", + Command = [[ + local trails = openspace.getProperty('{moonTrail_minor_saturn}.Renderable.Enabled'); + local trails_fade = openspace.getProperty('{moonTrail_minor_saturn}.Renderable.Fade'); + + local moons = openspace.getProperty('{moon_minor_saturn}.Renderable.Enabled'); + local moons_fade = openspace.getProperty('{moon_minor_saturn}.Renderable.Fade'); + + for i, v in pairs(trails_fade) do + openspace.setPropertyValueSingle(trails[i], true) + openspace.setPropertyValueSingle(v, 1, 2, 'Linear') + end + + for i, v in pairs(moons_fade) do + openspace.setPropertyValueSingle(moons[i], true) + openspace.setPropertyValueSingle(v, 1, 2, 'Linear') + end + ]], + Documentation = "Turn ON Saturn's minor moons and their trails", + GuiPath = "/Solar System/Saturn", + IsLocal = true +} + +local minormoons_off = { + Identifier = "os.solarsystem.saturn.minormoonsoff", + Name = "Turn OFF minors moon and trails", + Command = [[ + local trails = openspace.getProperty('{moonTrail_minor_saturn}.Renderable.Enabled'); + local trails_fade = openspace.getProperty('{moonTrail_minor_saturn}.Renderable.Fade'); + + local moons = openspace.getProperty('{moon_minor_saturn}.Renderable.Enabled'); + local moons_fade = openspace.getProperty('{moon_minor_saturn}.Renderable.Fade'); + + for i, v in pairs(trails_fade) do + openspace.setPropertyValueSingle(v, 0, 2, 'Linear', "openspace.setPropertyValueSingle('" .. trails[i] .. "', false)" ) + end + + for i, v in pairs(moons_fade) do + openspace.setPropertyValueSingle(v, 0, 2, 'Linear', "openspace.setPropertyValueSingle('" .. moons[i] .. "', false)" ) + end + ]], + Documentation = "Turn OFF Saturn's minor moons and their trails", + GuiPath = "/Solar System/Saturn", + IsLocal = true +} + +asset.onInitialize(function() + openspace.action.registerAction(minormoons_on) + openspace.action.registerAction(minormoons_off) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(minormoons_off) + openspace.action.removeAction(minormoons_on) +end) asset.meta = { Name = "Saturn Minor Moons", - Version = "1.0", + Version = "1.1", Description = [[Meta asset containing five moon groups: Gallic, Inuit, Norse, Shepherd moons and Other]], Author = "OpenSpace Team", diff --git a/data/assets/scene/solarsystem/planets/uranus/inner_moons.asset b/data/assets/scene/solarsystem/planets/uranus/inner_moons.asset index 80d1fad724..c9cbabebe9 100644 --- a/data/assets/scene/solarsystem/planets/uranus/inner_moons.asset +++ b/data/assets/scene/solarsystem/planets/uranus/inner_moons.asset @@ -6,14 +6,15 @@ local kernel = asset.require("./kernels").ura091 local parentIdentifier = transforms.UranusBarycenter.Identifier local parentSpice = "URANUS BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_uranus", "moon_inner", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_uranus", "moon_inner", "moon_minor", "moon_minor_uranus" } local trailColor = { 0.60, 0.65, 0.84 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_uranus", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_uranus" } diff --git a/data/assets/scene/solarsystem/planets/uranus/irregular_prograde_moons.asset b/data/assets/scene/solarsystem/planets/uranus/irregular_prograde_moons.asset index ba6a20856f..b82b0446b3 100644 --- a/data/assets/scene/solarsystem/planets/uranus/irregular_prograde_moons.asset +++ b/data/assets/scene/solarsystem/planets/uranus/irregular_prograde_moons.asset @@ -6,13 +6,14 @@ local kernel = asset.require("./kernels").ura112 local parentIdentifier = transforms.UranusBarycenter.Identifier local parentSpice = "URANUS BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_uranus", "moon_irregular_prograde", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_uranus", "moon_irregular_prograde", "moon_minor", "moon_minor_uranus" } local trailColor = { 0.60, 0.65, 0.84 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_uranus", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_uranus" } local irregularMoons = { diff --git a/data/assets/scene/solarsystem/planets/uranus/irregular_retrograde_moons.asset b/data/assets/scene/solarsystem/planets/uranus/irregular_retrograde_moons.asset index c3a57042ce..df1e401f53 100644 --- a/data/assets/scene/solarsystem/planets/uranus/irregular_retrograde_moons.asset +++ b/data/assets/scene/solarsystem/planets/uranus/irregular_retrograde_moons.asset @@ -6,13 +6,14 @@ local kernel = asset.require("./kernels").ura112 local parentIdentifier = transforms.UranusBarycenter.Identifier local parentSpice = "URANUS BARYCENTER" -local tags = { "moon_solarSystem", "moon_giants", "moon_uranus", "moon_irregular_retrograde", "moon_minor" } +local tags = { "moon_solarSystem", "moon_giants", "moon_uranus", "moon_irregular_retrograde", "moon_minor", "moon_minor_uranus" } local trailColor = { 0.60, 0.65, 0.84 } local trailTags = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_uranus", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_uranus" } local irregularMoons = { diff --git a/data/assets/scene/solarsystem/planets/uranus/minor_moons.asset b/data/assets/scene/solarsystem/planets/uranus/minor_moons.asset index 7d58e98871..3dda4bd61d 100644 --- a/data/assets/scene/solarsystem/planets/uranus/minor_moons.asset +++ b/data/assets/scene/solarsystem/planets/uranus/minor_moons.asset @@ -2,10 +2,67 @@ asset.require("./inner_moons") asset.require("./irregular_prograde_moons") asset.require("./irregular_retrograde_moons") +local minormoons_on = { + Identifier = "os.solarsystem.uranus.minormoonson", + Name = "Turn ON minor moons and trails", + Command = [[ + local trails = openspace.getProperty('{moonTrail_minor_uranus}.Renderable.Enabled'); + local trails_fade = openspace.getProperty('{moonTrail_minor_uranus}.Renderable.Fade'); + + local moons = openspace.getProperty('{moon_minor_uranus}.Renderable.Enabled'); + local moons_fade = openspace.getProperty('{moon_minor_uranus}.Renderable.Fade'); + + for i, v in pairs(trails_fade) do + openspace.setPropertyValueSingle(trails[i], true) + openspace.setPropertyValueSingle(v, 1, 2, 'Linear') + end + + for i, v in pairs(moons_fade) do + openspace.setPropertyValueSingle(moons[i], true) + openspace.setPropertyValueSingle(v, 1, 2, 'Linear') + end + ]], + Documentation = "Turn ON Uranus's minor moons and their trails", + GuiPath = "/Solar System/Uranus", + IsLocal = true +} + +local minormoons_off = { + Identifier = "os.solarsystem.uranus.minormoonsoff", + Name = "Turn OFF minors moon and trails", + Command = [[ + local trails = openspace.getProperty('{moonTrail_minor_uranus}.Renderable.Enabled'); + local trails_fade = openspace.getProperty('{moonTrail_minor_uranus}.Renderable.Fade'); + + local moons = openspace.getProperty('{moon_minor_uranus}.Renderable.Enabled'); + local moons_fade = openspace.getProperty('{moon_minor_uranus}.Renderable.Fade'); + + for i, v in pairs(trails_fade) do + openspace.setPropertyValueSingle(v, 0, 2, 'Linear', "openspace.setPropertyValueSingle('" .. trails[i] .. "', false)" ) + end + + for i, v in pairs(moons_fade) do + openspace.setPropertyValueSingle(v, 0, 2, 'Linear', "openspace.setPropertyValueSingle('" .. moons[i] .. "', false)" ) + end + ]], + Documentation = "Turn OFF Uranus's minor moons and their trails", + GuiPath = "/Solar System/Uranus", + IsLocal = true +} + +asset.onInitialize(function() + openspace.action.registerAction(minormoons_on) + openspace.action.registerAction(minormoons_off) +end) + +asset.onDeinitialize(function() + openspace.action.removeAction(minormoons_off) + openspace.action.removeAction(minormoons_on) +end) asset.meta = { Name = "Uranus Minor Moons", - Version = "1.0", + Version = "1.1", Description = [[Meta asset containing three moon groups: Inner Moons, Irregular Prograde Moons and Irregular Retrograde Moons]], Author = "OpenSpace Team", diff --git a/data/assets/scene/solarsystem/sun/EUV_layer.asset b/data/assets/scene/solarsystem/sun/EUV_layer.asset index 88f171310a..6ec99ebad3 100644 --- a/data/assets/scene/solarsystem/sun/EUV_layer.asset +++ b/data/assets/scene/solarsystem/sun/EUV_layer.asset @@ -31,7 +31,7 @@ local EUVLayer = { } local toggle_EUV_layer = { - Identifier = "euv_layer.toggle_EUV", + Identifier = "os.solarsystem.sun.toggleeuv", Name = "Toggle EUV Layer", Command = propertyHelper.invert("Scene.EUV-Layer-bastille-day-2000.Renderable.Enabled"), Documentation = "Toggle EUV layer of sun", @@ -54,7 +54,7 @@ asset.export(EUVLayer) asset.meta = { Name = "Predictive Science Inc. EUV texture sequence Bastille Days", - Version = "1.1", + Version = "1.2", Description = [[Texture sequence of an extreme ultraviolet (EUV) simulation during, the CME]], Author = "CCMC, OpenSpace team", diff --git a/data/assets/util/default_actions.asset b/data/assets/util/default_actions.asset index f4b34c1683..ab7beaad76 100644 --- a/data/assets/util/default_actions.asset +++ b/data/assets/util/default_actions.asset @@ -2,3 +2,5 @@ asset.require("actions/trails/toggle_all_trails"); asset.require("actions/trails/toggle_trails_planets_moons"); asset.require("actions/planets/planet_lighting"); asset.require("actions/system/undo_event_fades"); +asset.require("actions/trails/toggle_all_minor_moon_trails"); +asset.require("actions/trails/on_off_all_minor_moons"); \ No newline at end of file diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset index 1a39190148..875362d765 100644 --- a/data/assets/util/webgui.asset +++ b/data/assets/util/webgui.asset @@ -3,7 +3,7 @@ asset.require("./static_server") local guiCustomization = asset.require("customization/gui") -- Select which commit hashes to use for the frontend and backend -local frontendHash = "97e50c5c6182bba2608868a54b4bc954115f238a" +local frontendHash = "234d03717e8f60d87ac73aa459de02232a4cd789" local dataProvider = "data.openspaceproject.com/files/webgui" local frontend = asset.syncedResource({ diff --git a/data/profiles/apollo.profile b/data/profiles/apollo.profile index ce3e96b213..febd2de247 100644 --- a/data/profiles/apollo.profile +++ b/data/profiles/apollo.profile @@ -1,85 +1,10 @@ { - "actions": [ - { - "documentation": "Jump to right before the earthrise photo", - "gui_path": "/Missions/Apollo/8", - "identifier": "profile.setup.earthrise", - "is_local": false, - "name": "Set Earthrise time", - "script": "openspace.time.setPause(true); openspace.time.setDeltaTime(1); openspace.time.setTime('1968 DEC 24 16:37:31'); openspace.navigation.setNavigationState({Anchor = 'Apollo8', Position = { 1.494592E1, 3.236777E1, -4.171296E1 }, ReferenceFrame = 'Root', Up = { 0.960608E0, -0.212013E0, 0.179675E0 }}); openspace.setPropertyValue('*Trail.Renderable.Enabled', false);" - }, - { - "documentation": "Jump to time right before Apollo 8 liftoff, with its trail enabled", - "gui_path": "/Missions/Apollo/8", - "identifier": "profile.setup.apollo8", - "is_local": false, - "name": "Set Apollo 8 launch time", - "script": "openspace.time.setTime('1968-12-21T12:51:37.00'); openspace.setPropertyValueSingle('Scene.Apollo8LaunchTrail.Renderable.Enabled', true);" - }, - { - "documentation": "Toggles Moon Kaguya color layer", - "gui_path": "/Missions/Apollo", - "identifier": "profile.moon.kaguyalayer", - "is_local": false, - "name": "Toggle Kaguya layer", - "script": "openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.Kaguya_Utah.Enabled', not openspace.getPropertyValue('Scene.Moon.Renderable.Layers.ColorLayers.Kaguya_Utah.Enabled'));" - }, - { - "documentation": "Toggles shading for the Moon", - "gui_path": "/Missions/Apollo", - "identifier": "profile.moon.shading", - "is_local": false, - "name": "Toggle Moon shading", - "script": "openspace.setPropertyValueSingle('Scene.Moon.Renderable.PerformShading', not openspace.getPropertyValue('Scene.Moon.Renderable.PerformShading'));" - }, - { - "documentation": "Set camera focus to the Earth", - "gui_path": "/Missions/Apollo", - "identifier": "profile.focus.earth", - "is_local": false, - "name": "Focus on Earth", - "script": "openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Aim', ''); openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Anchor', 'Earth'); openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil);" - }, - { - "documentation": "Set camera focus to the Moon", - "gui_path": "/Missions/Apollo", - "identifier": "profile.focus.moon", - "is_local": false, - "name": "Focus on Moon", - "script": "openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Aim', ''); openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Anchor', 'Moon'); openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil);" - }, - { - "documentation": "Disable apollo site on moon when leaving", - "gui_path": "/Missions/Apollo", - "identifier": "profile.moon.disableapollosites", - "is_local": false, - "name": "Disable Apollo sites", - "script": "openspace.setPropertyValue('Scene.Moon.Renderable.Layers.ColorLayers.A17_*.Enabled', false); openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.HeightLayers.LRO_NAC_Apollo_11.Enabled', false); openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A11_M177481212_p_longlat.Enabled', false); openspace.setPropertyValueSingle('Scene.Apollo11MoonTrail.Renderable.Enabled', false); openspace.setPropertyValueSingle('Scene.Apollo11LemTrail.Renderable.Enabled', false); openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.HeightLayers.LRO_NAC_Apollo_17.Enabled', false);" - }, - { - "documentation": "Setup for Apollo 11 landing site", - "gui_path": "/Missions/Apollo/11", - "identifier": "profile.setup.apollo11", - "is_local": false, - "name": "Setup A11 site", - "script": "openspace.time.setTime('1969 JUL 20 20:17:40'); openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.HeightLayers.LRO_NAC_Apollo_11.Enabled', true); openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A11_M177481212_p_longlat.Enabled', true); openspace.setPropertyValueSingle('Scene.Moon.Renderable.TargetLodScaleFactor', 20.11); openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'Apollo11LemPosition'); openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); openspace.setPropertyValueSingle('Scene.Apollo11MoonTrail.Renderable.Enabled', true); openspace.setPropertyValueSingle('Scene.Apollo11LemTrail.Renderable.Enabled', true);" - }, - { - "documentation": "Setup for Apollo 17 landing site", - "gui_path": "/Missions/Apollo/17", - "identifier": "profile.setup.apollo17", - "is_local": false, - "name": "Setup A17 site", - "script": "openspace.time.setTime('1972 DEC 12 19:47:11'); openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_travmap.BlendMode', 0.000000); openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_travmap.Enabled', true); openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.HeightLayers.LRO_NAC_Apollo_17.Enabled', true); openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_LEM.Enabled', true); openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_LEM.BlendMode', 0.000000); openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_NAC_Alt_p.Enabled', true); openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_NAC_Alt_p.BlendMode', 0.000000); openspace.setPropertyValueSingle('Scene.Moon.Renderable.TargetLodScaleFactor', 20.17); openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'Apollo17LemModel'); openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil); openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_station7.BlendMode', 0.000000);" - } - ], "assets": [ "base", + "scene/solarsystem/missions/apollo/8/apollo8", "scene/solarsystem/missions/apollo/11/apollo11", "scene/solarsystem/missions/apollo/11/lem_flipbook", - "scene/solarsystem/missions/apollo/17/lem", - "scene/solarsystem/missions/apollo/8/apollo8", - "scene/solarsystem/missions/apollo/apollo_globebrowsing", + "scene/solarsystem/missions/apollo/17/apollo17", "scene/solarsystem/missions/apollo/insignias_map" ], "camera": { @@ -113,40 +38,40 @@ ], "keybindings": [ { - "action": "profile.setup.earthrise", + "action": "os.missions.apollo8.setup.earthrise", "key": "E" }, { - "action": "profile.setup.apollo8", + "action": "os.missions.apollo8.setup.launch", "key": "U" }, { - "action": "profile.moon.kaguyalayer", + "action": "os.missions.apollo.moon.togglekaguyalayer", "key": "K" }, { - "action": "profile.moon.shading", + "action": "os.missions.apollo.moon.toggleshading", "key": "S" }, { - "action": "profile.focus.earth", + "action": "os.missions.apollo.earth.focus", "key": "Home" }, { - "action": "profile.focus.moon", + "action": "os.missions.apollo.moon.focus", "key": "M" }, { - "action": "profile.moon.disableapollosites", + "action": "os.missions.apollo17.setup.landingsite", + "key": "F7" + }, + { + "action": "os.missions.apollo.moon.disableapollosites", "key": "F9" }, { - "action": "profile.setup.apollo11", + "action": "os.missions.apollo11.setup.landingsite", "key": "F11" - }, - { - "action": "profile.setup.apollo17", - "key": "F7" } ], "mark_nodes": [ diff --git a/data/profiles/bastilleday2000.profile b/data/profiles/bastilleday2000.profile index 076287bb40..7975cb4492 100644 --- a/data/profiles/bastilleday2000.profile +++ b/data/profiles/bastilleday2000.profile @@ -1,49 +1,8 @@ { - "actions": [ - { - "documentation": "Reset button to start of CME", - "gui_path": "/Bastille-Day 2000", - "identifier": "bastille-day.reset_loops", - "is_local": false, - "name": "Reset button. Start of CME, no loop", - "script": "openspace.time.setTime('2000-JUL-14 10:03:00.00');openspace.scriptScheduler.clear();" - }, - { - "documentation": "New loop: Restarts time at 10:03 and stops at 10:16, sets delta time to 2 min/ second (120 seconds/ second)", - "gui_path": "/Bastille-Day 2000", - "identifier": "bastille-day.short_loop", - "is_local": false, - "name": "Loop 10:03 - 10:16, at 2 min/ second", - "script": "openspace.scriptScheduler.clear();openspace.time.setDeltaTime(120);openspace.time.setTime('2000-JUL-14 10:03:00.00');EndtimeShortLoop = \"2000 JUL 14 10:16:00\";StarttimescriptSlowLoop = \"openspace.time.setTime('2000 JUL 14 10:03:00')\";openspace.scriptScheduler.loadScheduledScript(EndtimeShortLoop, StarttimescriptSlowLoop);" - }, - { - "documentation": "New loop: Restarts time at 10:03 and stops at 11:00, delta time to 4 min/ second (240 seconds/ second)", - "gui_path": "/Bastille-Day 2000", - "identifier": "bastille-day.standard_loop", - "is_local": false, - "name": "Loop 10:03 - 11:00, at 4 min/ second", - "script": "StarttimescriptSlowLoop = \"openspace.time.setTime('2000 JUL 14 10:03:00')\";openspace.scriptScheduler.clear();openspace.time.setDeltaTime(240);openspace.time.setTime('2000-JUL-14 10:03:00.00');openspace.scriptScheduler.loadScheduledScript('2000 JUL 14 11:00:00', StarttimescriptSlowLoop);" - }, - { - "documentation": "Fast loop: Starts from 10:03 and sets delta time to 15 min/ second (900 seconds/ second)", - "gui_path": "/Bastille-Day 2000", - "identifier": "bastille-day.fast_loop", - "is_local": false, - "name": "Loop 10:03 - 11.48, at 15 min/ second", - "script": "openspace.scriptScheduler.clear();openspace.time.setDeltaTime(900);openspace.time.setTime('2000-JUL-14 10:03:00.00');StarttimescriptFastLoop = \"openspace.time.setTime('2000 JUL 14 10:03:00')\";openspace.scriptScheduler.loadScheduledScript('2000 JUL 14 11:48:00', StarttimescriptFastLoop);" - }, - { - "documentation": "Long loop: Restarts time at 09:30 and stops at 11:50, delta time to 4 min/ second (240 seconds/ second)", - "gui_path": "/Bastille-Day 2000", - "identifier": "bastille-day.long_loop", - "is_local": false, - "name": "Loop 09:30 - 13:00, at 4 min/ second", - "script": "openspace.scriptScheduler.clear();openspace.time.setDeltaTime(240);openspace.time.setTime('2000-JUL-14 09:30:00.00');StarttimescriptLongLoop = \"openspace.time.setTime('2000 JUL 14 09:30:00')\";openspace.scriptScheduler.loadScheduledScript('2000 JUL 14 13:00:00', StarttimescriptLongLoop);" - } - ], "assets": [ "base", "dashboard/default_dashboard", + "scene/solarsystem/heliosphere/bastille_day/actions", "scene/solarsystem/heliosphere/bastille_day/density_volume", "scene/solarsystem/heliosphere/bastille_day/fieldlines", "scene/solarsystem/heliosphere/bastille_day/fluxnodes", @@ -88,59 +47,59 @@ ], "keybindings": [ { - "action": "bastille-day.reset_loops", + "action": "os.events.bastilleday.setup.startofcme", "key": "R" }, { - "action": "bastille-day.short_loop", + "action": "os.events.bastilleday.setup.shortloop", "key": "CTRL+1" }, { - "action": "bastille-day.standard_loop", + "action": "os.events.bastilleday.setup.standardloop", "key": "CTRL+2" }, { - "action": "bastille-day.fast_loop", + "action": "os.events.bastilleday.setup.fastloop", "key": "CTRL+3" }, { - "action": "bastille-day.long_loop", + "action": "os.events.bastilleday.setup.longloop", "key": "CTRL+4" }, { - "action": "density_volume.toggle_volume", + "action": "os.events.bastilleday.densityvolume.togglevolume", "key": "D" }, { - "action": "fluxnodelegend.show_legend", + "action": "os.events.bastilleday.fluxnodelegend.showlegend", "key": "N" }, { - "action": "fluxnodelegend.hide_legend", + "action": "os.events.bastilleday.fluxnodelegend.hidelegend", "key": "M" }, { - "action": "magnetogram_texture.switch_color_layer", + "action": "os.events.bastilleday.magnetogramtexture.switchcolorlayer", "key": "I" }, { - "action": "euv_layer.toggle_EUV", + "action": "os.solarsystem.sun.toggleeuv", "key": "E" }, { - "action": "fluxnodes.toggle_fluxnodes", + "action": "os.events.bastilleday.fluxnodes.togglefluxnodes", "key": "O" }, { - "action": "fieldlines.toggle_fieldlines", + "action": "os.events.bastilleday.fieldlines.togglefieldlines", "key": "U" }, { - "action": "fluxnodescutplane.toggle_equatorial", + "action": "os.events.bastilleday.fluxnodescutplane.toggleequatorial", "key": "P" }, { - "action": "fluxnodescutplane.toggle_meridial", + "action": "os.events.bastilleday.fluxnodescutplane.togglemeridial", "key": "LEFTBRACKET" } ], @@ -158,7 +117,7 @@ "license": "MIT License", "name": "Bastille day 2000", "url": "https://www.openspaceproject.com", - "version": "1.0" + "version": "1.1" }, "properties": [ { diff --git a/data/profiles/default.profile b/data/profiles/default.profile index c659cd335d..ec5bcab272 100644 --- a/data/profiles/default.profile +++ b/data/profiles/default.profile @@ -1,30 +1,4 @@ { - "actions": [ - { - "documentation": "Toggle trails on or off for satellites around Earth", - "gui_path": "/Solar System/Earth", - "identifier": "profile.toggle.satellite", - "is_local": false, - "name": "Toggle satellite trails", - "script": "local list = openspace.getProperty('{earth_satellites}.Renderable.Enabled'); for _,v in pairs(list) do openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) end" - }, - { - "documentation": "Refocuses the camera on the ISS", - "gui_path": "/Solar System/Earth", - "identifier": "profile.focus.iss", - "is_local": false, - "name": "Focus ISS", - "script": "openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Aim', '');openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Anchor', 'ISS');openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil);" - }, - { - "documentation": "Retargets the camera on Earth", - "gui_path": "/Solar System/Earth", - "identifier": "profile.focus.earth", - "is_local": false, - "name": "Focus on Earth", - "script": "openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Aim', '');openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Anchor', 'Earth')openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil);" - } - ], "assets": [ "base", "events/toggle_sun", @@ -62,15 +36,15 @@ ], "keybindings": [ { - "action": "profile.toggle.satellite", + "action": "os.solarsystem.earth.togglesatellitetrails", "key": "S" }, { - "action": "profile.focus.iss", + "action": "os.solarsystem.earth.iss.focus", "key": "I" }, { - "action": "profile.focus.earth", + "action": "os.solarsystem.earth.focus", "key": "HOME" } ], diff --git a/data/profiles/default_full.profile b/data/profiles/default_full.profile index 12a80c8bf5..b191457fef 100644 --- a/data/profiles/default_full.profile +++ b/data/profiles/default_full.profile @@ -1,38 +1,4 @@ { - "actions": [ - { - "documentation": "Toggle trails on or off for satellites around Earth", - "gui_path": "/Solar System/Earth", - "identifier": "profile.toggle.satellite", - "is_local": false, - "name": "Toggle satellite trails", - "script": "local list = openspace.getProperty('{earth_satellites}.Renderable.Enabled'); for _,v in pairs(list) do openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) end" - }, - { - "documentation": "Refocuses the camera on the ISS", - "gui_path": "/Solar System/Earth", - "identifier": "profile.focus.iss", - "is_local": false, - "name": "Focus ISS", - "script": "openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Aim', '');openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Anchor', 'ISS');openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil);" - }, - { - "documentation": "Retargets the camera on Earth", - "gui_path": "/Solar System/Earth", - "identifier": "profile.focus.earth", - "is_local": false, - "name": "Focus on Earth", - "script": "openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Aim', '');openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.Anchor', 'Earth')openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil);" - }, - { - "documentation": "Toggle on/off minor moon trails for all planets in the solar system", - "gui_path": "/Trails", - "identifier": "profile.toggle.minormoons", - "is_local": false, - "name": "Toggle Minor Moon Trails", - "script": "local list = openspace.getProperty('{moonTrail_minor}.Renderable.Enabled'); for _,v in pairs(list) do openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) end" - } - ], "assets": [ "base", "events/toggle_sun", @@ -79,19 +45,19 @@ ], "keybindings": [ { - "action": "profile.toggle.satellite", + "action": "os.solarsystem.earth.togglesatellitetrails", "key": "S" }, { - "action": "profile.focus.iss", + "action": "os.solarsystem.earth.iss.focus", "key": "I" }, { - "action": "profile.focus.earth", + "action": "os.solarsystem.earth.focus", "key": "HOME" }, { - "action": "profile.toggle.minormoons", + "action": "os_default.toggle_minormoon_trails", "key": "SHIFT+H" } ], diff --git a/data/profiles/jwst.profile b/data/profiles/jwst.profile index ecf38ad0f5..07439f6c33 100644 --- a/data/profiles/jwst.profile +++ b/data/profiles/jwst.profile @@ -1,86 +1,4 @@ { - "actions": [ - { - "documentation": "Toggle trails on or off for satellites around Earth", - "gui_path": "/Solar System/Earth", - "identifier": "profile.toggle.satellitetrails", - "is_local": false, - "name": "Toggle satellite trails", - "script": "local list = openspace.getProperty('{earth_satellites}.Renderable.Enabled'); for _,v in pairs(list) do openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) end" - }, - { - "documentation": "Toggle points and labels for the Lagrangian points for Earth Sun system", - "gui_path": "/JWST", - "identifier": "profile.toggle.lagrangianpoints", - "is_local": false, - "name": "Toggle Lagrangian points", - "script": "local list = openspace.getProperty('{lagrange_points_earth}.Renderable.Enabled'); for _,v in pairs(list) do openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) end" - }, - { - "documentation": "Toggle Hubble Ultra Deep Field image and line towards its coordinate", - "gui_path": "/JWST", - "identifier": "profile.toggle.hudf", - "is_local": false, - "name": "Toggle Hubble Ultra Deep Field", - "script": "local list = openspace.getProperty('{mission_jwst_hudf}.*.Enabled'); for _,v in pairs(list) do openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) end" - }, - { - "documentation": "Toggle L2 label, point and line", - "gui_path": "/JWST", - "identifier": "profile.toggle.l2", - "is_local": false, - "name": "Toggle L2 line and small L2 label", - "script": "local list = openspace.getProperty('{lagrange_points_earth_l2_small}.*.Enabled'); for _,v in pairs(list) do openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) end" - }, - { - "documentation": "Toggle James Webb Space Telecope field of view and view band", - "gui_path": "/JWST", - "identifier": "profile.toggle.jwst_fov", - "is_local": false, - "name": "Toggle JWST field of view and view band", - "script": "local list = openspace.getProperty('{mission_jwst_fov}.*.Enabled'); for _,v in pairs(list) do openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) end" - }, - { - "documentation": "Set the time to the launch time of JWST", - "gui_path": "/JWST", - "identifier": "profile.set.jwst_launch", - "is_local": false, - "name": "Set to JWST launch time", - "script": "openspace.time.setDeltaTime(1); openspace.time.setTime('2021-12-25T12:20:01');" - }, - { - "documentation": "Set the time to the detach time of JWST", - "gui_path": "/JWST", - "identifier": "profile.set.jwst_detach", - "is_local": false, - "name": "Set to JWST detach time", - "script": "openspace.time.setDeltaTime(1); openspace.time.setTime('2021-12-25T12:50:00');" - }, - { - "documentation": "Toggle JWST trail relative to the Sun", - "gui_path": "/JWST", - "identifier": "profile.toggle.sun_trail", - "is_local": false, - "name": "Toggle JWST Sun trail", - "script": "local value = openspace.getPropertyValue('Scene.JWSTSunTrail.Renderable.Enabled'); openspace.setPropertyValueSingle('Scene.JWSTSunTrail.Renderable.Enabled', not value);" - }, - { - "documentation": "Toggle all planet and moon trails, except the Moon", - "gui_path": "/JWST", - "identifier": "profile.toggle.trails_not_moon", - "is_local": false, - "name": "Toggle trails (except Moon)", - "script": "local list = openspace.getProperty('{planetTrail_solarSystem}.Renderable.Enabled'); for _,v in pairs(list) do openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) end local moonlist = openspace.getProperty('{moonTrail_solarSystem}.Renderable.Enabled') for _,v in pairs(moonlist) do openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) end openspace.setPropertyValueSingle('Scene.MoonTrail.Renderable.Enabled', true)" - }, - { - "documentation": "Toggle JWST launch, cruise and L2 co-revolving orbit trails, not the Sun trail", - "gui_path": "/JWST", - "identifier": "profile.toggle.jwst_trails", - "is_local": false, - "name": "Toggle JWST trail", - "script": "local list = {'Scene.JWSTTrailLaunch.Renderable.Enabled', 'Scene.JWSTTrailCruise.Renderable.Enabled', 'Scene.JWSTTrailCoRevOrbit.Renderable.Enabled'}; for _,v in pairs(list) do openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)); end" - } - ], "additional_scripts": [ "openspace.setPropertyValue(\"Scene.MoonTrail.Renderable.Appearance.Color\", {0.7, 0.5, 0.5});" ], @@ -140,55 +58,55 @@ ], "keybindings": [ { - "action": "profile.toggle.satellitetrails", + "action": "os.solarsystem.earth.togglesatellitetrails", "key": "S" }, { - "action": "profile.toggle.lagrangianpoints", + "action": "os.missions.jwst.togglelagrangianpoints", "key": "P" }, { - "action": "profile.toggle.hudf", + "action": "os.missions.jwst.togglehudf", "key": "U" }, { - "action": "profile.toggle.l2", + "action": "os.missions.jwst.togglel2", "key": "O" }, { - "action": "profile.toggle.jwst_fov", + "action": "os.missions.jwst.togglefov", "key": "V" }, { - "action": "profile.set.jwst_launch", + "action": "os.missoins.jwst.setup.launch", "key": "J" }, { - "action": "profile.toggle.sun_trail", + "action": "os.missions.jwst.togglesuntrail", "key": "K" }, { - "action": "jwst.play.forwards", + "action": "os.missions.jwst.play.forwards", "key": "M" }, { - "action": "jwst.play.backwards", + "action": "os.missions.jwst.play.backwards", "key": "N" }, { - "action": "jwst.play.clear", + "action": "os.missions.jwst.play.clear", "key": "B" }, { - "action": "profile.toggle.trails_not_moon", + "action": "os.missions.jwst.toggletrialsexceptmoon", "key": "G" }, { - "action": "jwst.toggle.direction", + "action": "os.missions.jwst.toggledirection", "key": "Y" }, { - "action": "profile.toggle.jwst_trails", + "action": "os.missions.jwst.togglejwsttrails", "key": "T" } ], diff --git a/data/profiles/mars.profile b/data/profiles/mars.profile index ee0ef5776c..5eb8a9b4c0 100644 --- a/data/profiles/mars.profile +++ b/data/profiles/mars.profile @@ -1,30 +1,4 @@ { - "actions": [ - { - "documentation": "Set and goto Insight Landing", - "gui_path": "/Missions/Insight", - "identifier": "profile.setup.insight", - "is_local": false, - "name": "Setup scene for insight EDL", - "script": "openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.Mola_Utah.Settings.Offset', -469.300000);openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.HiRISE-LS-DEM.Settings.Offset', -470.850006);openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.MDEM200M.Settings.Offset', -470.000000);openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.HiRISE-LS-DEM.Enabled', true);openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.ColorLayers.HiRISE-LS.Enabled', true);openspace.time.setPause(true);openspace.time.setTime('2018 NOV 26 19:39:01.68');openspace.navigation.setNavigationState({Anchor = 'Insight',Pitch = 0.567457E-4,Position = { 1.240506E1,-1.369270E1,-2.423553E0 },ReferenceFrame = 'Root',Up = { 0.441211E0,0.247019E0,0.862737E0 },Yaw = -0.446853E-4});" - }, - { - "documentation": "Disable Mars layer settings used for insight EDL", - "gui_path": "/Missions/Insight", - "identifier": "profile.unsetup.insight", - "is_local": false, - "name": "Unset Insight Landing", - "script": "openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.Mola_Utah.Settings.Offset', 0);openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.HiRISE-LS-DEM.Settings.Offset', 0);openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.HiRISE-LS-DEM.Enabled', false);openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.ColorLayers.HiRISE-LS.Enabled', false);" - }, - { - "documentation": "Sets time and layers for Perseverance landing", - "gui_path": "/Missions/Perseverance", - "identifier": "profile.setup.perseverance", - "is_local": false, - "name": "Setup and Goto Perseverance", - "script": "openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.Mola_Utah.Settings.Offset', -1685.5);openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.HiRISE-LS-DEM.Settings.Offset', -1686.0);openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.MDEM200M.Settings.Offset', -1686);openspace.time.setPause(true);openspace.time.setTime('2021 FEB 18 20:32:16');openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.HeightLayers.HiRISE-LS-DEM.Enabled', true);openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.ColorLayers.HiRISE-LS.Enabled', true);openspace.navigation.setNavigationState({Anchor = 'Perseverance',Pitch = 0.567457E-4,Position = { 1.240506E1,-1.369270E1,-2.423553E0 },ReferenceFrame = 'Root',Up = { 0.441211E0,0.247019E0,0.862737E0 },Yaw = -0.446853E-4});" - } - ], "assets": [ "base", "scene/solarsystem/missions/insight/edl", @@ -60,15 +34,15 @@ ], "keybindings": [ { - "action": "profile.setup.insight", + "action": "os.missions.insight.setup", "key": "I" }, { - "action": "profile.unsetup.insight", + "action": "os.missions.insight.setup.disablelayers", "key": "SHIFT+I" }, { - "action": "profile.setup.perseverance", + "action": "os.missions.perseverance.setup", "key": "P" } ], diff --git a/data/profiles/newhorizons.profile b/data/profiles/newhorizons.profile index 1f354e90ef..80a82748d3 100644 --- a/data/profiles/newhorizons.profile +++ b/data/profiles/newhorizons.profile @@ -1,134 +1,4 @@ { - "actions": [ - { - "documentation": "Sets the focus of the camera on 'NewHorizons'", - "gui_path": "/Missions/New Horizons", - "identifier": "profile.focus.newhorizons", - "is_local": false, - "name": "Focus on New Horizons", - "script": "openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'NewHorizons');openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Aim', '');openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil);" - }, - { - "documentation": "Anchor at New Horizons, Aim at Pluto", - "gui_path": "/Missions/New Horizons", - "identifier": "profile.focus.anchor_nh|aim_pluto", - "is_local": false, - "name": "Anchor NH, Aim Pluto", - "script": "openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'NewHorizons');openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Aim', 'Pluto');openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil)" - }, - { - "documentation": "Sets the focus of the camera on 'Pluto'", - "gui_path": "/Missions/New Horizons", - "identifier": "profile.focus.pluto", - "is_local": false, - "name": "Focus on Pluto", - "script": "openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'PlutoProjection') ;openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Aim', ''); openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil);" - }, - { - "documentation": "Sets the focus of the camera on 'Charon'", - "gui_path": "/Missions/New Horizons", - "identifier": "profile.focus.charon", - "is_local": false, - "name": "Focus on Charon", - "script": "openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'Charon');openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Aim', '');openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil);" - }, - { - "documentation": "Toggles New Horizons image projection", - "gui_path": "/Missions/New Horizons", - "identifier": "profile.toggle_nh_image_projections", - "is_local": false, - "name": "Toggle NH Image Projection", - "script": "local enabled = openspace.getPropertyValue('Scene.PlutoProjection.Renderable.ProjectionComponent.PerformProjection'); openspace.setPropertyValue('Scene.PlutoProjection.Renderable.ProjectionComponent.PerformProjection', not enabled); openspace.setPropertyValue('Scene.CharonProjection.Renderable.ProjectionComponent.PerformProjection', not enabled);" - }, - { - "documentation": "Removes all image projections from Pluto and Charon", - "gui_path": "/Missions/New Horizons", - "identifier": "profile.clear_image_projections", - "is_local": false, - "name": "Clear image projections", - "script": "openspace.setPropertyValue('Scene.PlutoProjection.Renderable.ProjectionComponent.ClearAllProjections', true); openspace.setPropertyValue('Scene.CharonProjection.Renderable.ProjectionComponent.ClearAllProjections', true);" - }, - { - "documentation": "Jumps to the 14th of July 2015 at 0900 UTC and clears all projections", - "gui_path": "/Missions/New Horizons", - "identifier": "profile.setup.approach", - "is_local": false, - "name": "Reset time and projections", - "script": "openspace.time.setTime('2015-07-14T09:00:00.00');openspace.setPropertyValue('Scene.PlutoProjection.Renderable.ProjectionComponent.ClearAllProjections', true);openspace.setPropertyValue('Scene.CharonProjection.Renderable.ProjectionComponent.ClearAllProjections', true);" - }, - { - "documentation": "Increases the height map exaggeration on Pluto", - "gui_path": "/Missions/New Horizons", - "identifier": "profile.pluto.increase_height_exaggeration", - "is_local": false, - "name": "Pluto HeightExaggeration +", - "script": "openspace.setPropertyValueSingle(\"Scene.PlutoProjection.Renderable.HeightExaggeration\", openspace.getPropertyValue(\"Scene.PlutoProjection.Renderable.HeightExaggeration\") + 5000);" - }, - { - "documentation": "Decreases the height map exaggeration on Pluto", - "gui_path": "/Missions/New Horizons", - "identifier": "profile.pluto.decrease_height_exaggeration", - "is_local": false, - "name": "Pluto HeightExaggeration -", - "script": "openspace.setPropertyValueSingle(\"Scene.PlutoProjection.Renderable.HeightExaggeration\", openspace.getPropertyValue(\"Scene.PlutoProjection.Renderable.HeightExaggeration\") - 5000);" - }, - { - "documentation": "Increases the height map exaggeration on Charon", - "gui_path": "/Missions/New Horizons", - "identifier": "profile.charon.increase_height_exaggeration", - "is_local": false, - "name": "Charon HeightExaggeration +", - "script": "openspace.setPropertyValueSingle(\"Scene.CharonProjection.Renderable.HeightExaggeration\", openspace.getPropertyValue(\"Scene.CharonProjection.Renderable.HeightExaggeration\") + 5000);" - }, - { - "documentation": "Decreases the height map exaggeration on Charon", - "gui_path": "/Missions/New Horizons", - "identifier": "profile.charon.decrease_height_exaggeration", - "is_local": false, - "name": "Charon HeightExaggeration -", - "script": "openspace.setPropertyValueSingle(\"Scene.CharonProjection.Renderable.HeightExaggeration\", openspace.getPropertyValue(\"Scene.CharonProjection.Renderable.HeightExaggeration\") - 5000);" - }, - { - "documentation": "Toggles the visibility of the trail behind Pluto", - "gui_path": "/Missions/New Horizons", - "identifier": "profile.toggle.pluto_trail", - "is_local": false, - "name": "Toggle Pluto Trail", - "script": "openspace.setPropertyValueSingle('Scene.PlutoBarycentricTrail.Renderable.Enabled', not openspace.getPropertyValue('Scene.PlutoBarycentricTrail.Renderable.Enabled'));" - }, - { - "documentation": "Toggles the visibility of the text labels of Pluto, Charon, Hydra, Nix, Kerberos, and Styx", - "gui_path": "/Missions/New Horizons", - "identifier": "profile.toggle.pluto_labels", - "is_local": false, - "name": "Toggle Pluto Labels", - "script": "local list = {\"Scene.PlutoText.Renderable.Enabled\", \"Scene.CharonText.Renderable.Enabled\", \"Scene.HydraText.Renderable.Enabled\", \"Scene.NixText.Renderable.Enabled\", \"Scene.KerberosText.Renderable.Enabled\", \"Scene.StyxText.Renderable.Enabled\"}; for _,v in pairs(list) do openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) end" - }, - { - "documentation": "Toggles the visibility of the labels for the New Horizons instruments", - "gui_path": "/Missions/New Horizons", - "identifier": "profile.toggle_nh_labels", - "is_local": false, - "name": "Toggle New Horizons Labels", - "script": "local v = openspace.getPropertyValue(\"Scene.Labels.Renderable.Opacity\"); if v <= 0.5 then openspace.setPropertyValueSingle(\"Scene.Labels.Renderable.Opacity\",1.0,2.0) else openspace.setPropertyValueSingle(\"Scene.Labels.Renderable.Opacity\",0.0,2.0) end" - }, - { - "documentation": "Toggles the visibility of the shadow visualization of Pluto and Charon", - "gui_path": "/Missions/New Horizons", - "identifier": "profile.toggle_shadows", - "is_local": false, - "name": "Toggle Shadows", - "script": "openspace.setPropertyValueSingle('Scene.PlutoShadow.Renderable.Enabled', not openspace.getPropertyValue('Scene.PlutoShadow.Renderable.Enabled'));openspace.setPropertyValueSingle('Scene.CharonShadow.Renderable.Enabled', not openspace.getPropertyValue('Scene.CharonShadow.Renderable.Enabled'));" - }, - { - "documentation": "Toggles the trail of New Horizons", - "gui_path": "/Missions/New Horizons", - "identifier": "profile.toggle.nh_trail", - "is_local": false, - "name": "Toggle NH Trail", - "script": "openspace.setPropertyValueSingle('Scene.NewHorizonsTrailPluto.Renderable.Enabled', not openspace.getPropertyValue('Scene.NewHorizonsTrailPluto.Renderable.Enabled'));" - } - ], "assets": [ "base", "scene/solarsystem/missions/newhorizons/dashboard", @@ -167,83 +37,83 @@ ], "keybindings": [ { - "action": "profile.focus.newhorizons", + "action": "os.missions.newhorizons.focus", "key": "A" }, { - "action": "profile.focus.anchor_nh|aim_pluto", + "action": "os.missions.newhorizons.aimpluto", "key": "SHIFT+A" }, { - "action": "profile.focus.pluto", + "action": "os.missions.newhorizons.pluto.focus", "key": "S" }, { - "action": "profile.focus.charon", + "action": "os.missions.newhorizons.charon.focus", "key": "D" }, { - "action": "profile.toggle_nh_image_projections", + "action": "os.missions.newhorizons.toggleimageprojection", "key": "F7" }, { - "action": "profile.clear_image_projections", + "action": "os.missions.newhorizons.clearimageprojections", "key": "F8" }, { - "action": "profile.setup.approach", + "action": "os.missions.newhorizons.approach", "key": "F9" }, { - "action": "profile.pluto.increase_height_exaggeration", + "action": "os.missions.newhorizons.pluto.increasehightmap", "key": "KP_8" }, { - "action": "profile.pluto.increase_height_exaggeration", + "action": "os.missions.newhorizons.pluto.increasehightmap", "key": "CTRL+I" }, { - "action": "profile.pluto.decrease_height_exaggeration", + "action": "os.missions.newhorizons.pluto.decreasehightmap", "key": "CTRL+K" }, { - "action": "profile.pluto.decrease_height_exaggeration", + "action": "os.missions.newhorizons.pluto.decreasehightmap", "key": "KP_2" }, { - "action": "profile.charon.increase_height_exaggeration", + "action": "os.missions.newhorizons.charon.increasehightmap", "key": "KP_9" }, { - "action": "profile.charon.increase_height_exaggeration", + "action": "os.missions.newhorizons.charon.increasehightmap", "key": "CTRL+O" }, { - "action": "profile.charon.decrease_height_exaggeration", + "action": "os.missions.newhorizons.charon.decreasehightmap", "key": "KP_3" }, { - "action": "profile.charon.decrease_height_exaggeration", + "action": "os.missions.newhorizons.charon.decreasehightmap", "key": "CTRL+L" }, { - "action": "profile.toggle.pluto_trail", + "action": "os.missions.newhorizons.pluto.toggletrail", "key": "O" }, { - "action": "profile.toggle.pluto_labels", + "action": "os.missions.newhorizons.pluto.togglelabels", "key": "J" }, { - "action": "profile.toggle_nh_labels", + "action": "os.missions.newhorizons.togglelabels", "key": "I" }, { - "action": "profile.toggle_shadows", + "action": "os.missions.newhorizons.toggleshadows", "key": "SHIFT+T" }, { - "action": "profile.toggle.nh_trail", + "action": "os.missions.newhorizons.toggletrail", "key": "T" } ], diff --git a/data/profiles/osirisrex.profile b/data/profiles/osirisrex.profile index 12489852e9..a351f29964 100644 --- a/data/profiles/osirisrex.profile +++ b/data/profiles/osirisrex.profile @@ -1,62 +1,4 @@ { - "actions": [ - { - "documentation": "Sets the focus of the camera on 'OsirisRex'", - "gui_path": "/Missions/Osiris Rex", - "identifier": "profile.focus.osirisrex", - "is_local": false, - "name": "Focus on OsirisRex", - "script": "openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'OsirisRex'); openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Aim', ''); openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil);" - }, - { - "documentation": "Sets the focus of the camera on 'Bennu'", - "gui_path": "/Missions/Osiris Rex", - "identifier": "profile.focus.bennu", - "is_local": false, - "name": "Focus on Bennu", - "script": "openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'BennuBarycenter'); openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Aim', ''); openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil);" - }, - { - "documentation": "Sets the time to the approach at Bennu", - "gui_path": "/Missions/Osiris Rex", - "identifier": "profile.setup.bennu_approach", - "is_local": false, - "name": "Set Bennu approach time", - "script": "openspace.printInfo('Set time: Approach');openspace.time.setTime('2018-SEP-11 21:31:01.183');" - }, - { - "documentation": "Sets the time to the preliminary survey of Bennu", - "gui_path": "/Missions/Osiris Rex", - "identifier": "profile.setup.bennu_survey", - "is_local": false, - "name": "Set Bennu survey time", - "script": "openspace.printInfo('Set time: Preliminary Survey'); openspace.time.setTime('2018-NOV-20 01:13:12.183');" - }, - { - "documentation": "Sets the time to the orbital B event", - "gui_path": "/Missions/Osiris Rex", - "identifier": "profile.setup.orbital_b_event", - "is_local": false, - "name": "Set orbital B event time", - "script": "openspace.printInfo('Set time: Orbital B'); openspace.time.setTime('2019-APR-08 10:35:27.186');" - }, - { - "documentation": "Sets the time to the recon event", - "gui_path": "/Missions/Osiris Rex", - "identifier": "profile.setup.recon_event", - "is_local": false, - "name": "Set recon event time", - "script": "openspace.printInfo('Set time: Recon'); openspace.time.setTime('2019-MAY-25 03:50:31.195');" - }, - { - "documentation": "Toggles the visibility of the text marking the location of the Sun", - "gui_path": "/Missions/Osiris Rex", - "identifier": "profile.toggle.sun_marker", - "is_local": false, - "name": "Toggle Sun marker", - "script": "openspace.setPropertyValueSingle('Scene.SunMarker.Renderable.Enabled', not openspace.getPropertyValue('Scene.SunMarker.Renderable.Enabled'));" - } - ], "assets": [ "base", "scene/solarsystem/missions/osirisrex/dashboard", @@ -99,31 +41,31 @@ ], "keybindings": [ { - "action": "profile.focus.osirisrex", + "action": "os.missions.osirisrex.focus", "key": "A" }, { - "action": "profile.focus.bennu", + "action": "os.missions.osirisrex.bennu.focus", "key": "S" }, { - "action": "profile.setup.bennu_approach", + "action": "os.missions.osirisrex.setup.bennuapproach", "key": "F8" }, { - "action": "profile.setup.bennu_survey", + "action": "os.missions.osirisrex.setup.bennusurvey", "key": "F9" }, { - "action": "profile.setup.orbital_b_event", + "action": "os.missions.osirisrex.setup.bennueventb", "key": "F10" }, { - "action": "profile.setup.recon_event", + "action": "os.missions.osirisrex.setup.bennureconevent", "key": "F11" }, { - "action": "profile.toggle.sun_marker", + "action": "os.missions.osirisrex.togglesunmarker", "key": "Q" } ], @@ -138,7 +80,7 @@ "license": "MIT License", "name": "Osiris-Rex", "url": "https://www.openspaceproject.com", - "version": "1.0" + "version": "1.1" }, "properties": [ { diff --git a/data/profiles/rosetta.profile b/data/profiles/rosetta.profile index c2d0b629c7..d8e968e569 100644 --- a/data/profiles/rosetta.profile +++ b/data/profiles/rosetta.profile @@ -1,75 +1,10 @@ { - "actions": [ - { - "documentation": "Sets the focus of the camera on 67P", - "gui_path": "/Missions/Rosetta", - "identifier": "profile.focus.67P", - "is_local": false, - "name": "Focus on 67P", - "script": "openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', '67P'); openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Aim', ''); openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil);" - }, - { - "documentation": "Sets the focus of the camera on Rosetta", - "gui_path": "/Missions/Rosetta", - "identifier": "profile.focus.rosetta", - "is_local": false, - "name": "Focus on Rosetta", - "script": "openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'Rosetta'); openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Aim', ''); openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil);" - }, - { - "documentation": "Jumps to the time when the Philae lander is released", - "gui_path": "/Missions/Rosetta", - "identifier": "profile.setup.lander_release", - "is_local": false, - "name": "Set lander release time", - "script": "openspace.time.setTime('2014-11-12T08:20:00.00');" - }, - { - "documentation": "Removes all image projections from 67P", - "gui_path": "/Missions/Rosetta", - "identifier": "profile.67p.clear_projections", - "is_local": false, - "name": "Clear 67P projections", - "script": "openspace.setPropertyValue('Scene.67P.Renderable.ProjectionComponent.ClearAllProjections', true);" - }, - { - "documentation": "Toggles the visibility of all trails further from the Sun than 67P", - "gui_path": "/Missions/Rosetta", - "identifier": "profile.toggle.outerplanet_trails", - "is_local": false, - "name": "Toggle outer planetary trails", - "script": "local list = openspace.getProperty('{planetTrail_giants}.Renderable.Enabled'); for _,v in pairs(list) do openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) end" - }, - { - "documentation": "Toggles the visibility of the free floating image plane", - "gui_path": "/Missions/Rosetta", - "identifier": "profile.toggle.image_plane", - "is_local": false, - "name": "Toggle image plane", - "script": "openspace.setPropertyValueSingle('Scene.ImagePlaneRosetta.Renderable.Enabled', not openspace.getPropertyValue('Scene.ImagePlaneRosetta.Renderable.Enabled'));" - }, - { - "documentation": "Toggles the visibility of Philae's trail", - "gui_path": "/Missions/Rosetta", - "identifier": "profile.toggle.philae_trail", - "is_local": false, - "name": "Toggle Philae trail", - "script": "openspace.setPropertyValueSingle('Scene.PhilaeTrail.Renderable.Enabled', not openspace.getPropertyValue('Scene.PhilaeTrail.Renderable.Enabled'));" - }, - { - "documentation": "Enables or disables the image projection on 67P", - "gui_path": "/Missions/Rosetta", - "identifier": "profile.toggle.67p_projection", - "is_local": false, - "name": "Toggle 67P projection", - "script": "openspace.setPropertyValueSingle('Scene.67P.Renderable.ProjectionComponent.PerformProjection', not openspace.getPropertyValue('Scene.67P.Renderable.ProjectionComponent.PerformProjection'));" - } - ], "assets": [ "base", "scene/solarsystem/missions/rosetta/67p", "scene/solarsystem/missions/rosetta/dashboard", - "scene/solarsystem/missions/rosetta/rosetta" + "scene/solarsystem/missions/rosetta/rosetta", + "scene/solarsystem/missions/rosetta/actions" ], "camera": { "aim": "", @@ -111,35 +46,35 @@ ], "keybindings": [ { - "action": "profile.focus.67P", + "action": "os.missions.rosetta.67p.focus", "key": "A" }, { - "action": "profile.focus.rosetta", + "action": "os.missions.rosetta.focus", "key": "S" }, { - "action": "profile.setup.lander_release", + "action": "os.missions.rosetta.setup.landerrelease", "key": "F6" }, { - "action": "profile.67p.clear_projections", + "action": "os.missions.rosetta.67p.clearimageprojections", "key": "F8" }, { - "action": "profile.toggle.outerplanet_trails", + "action": "os.missions.rosetta.toggleouterplanetarytrails", "key": "E" }, { - "action": "profile.toggle.image_plane", + "action": "os.missions.rosetta.toggleimageplane", "key": "I" }, { - "action": "profile.toggle.philae_trail", + "action": "os.mission.rosetta.togglephilaetrail", "key": "O" }, { - "action": "profile.toggle.67p_projection", + "action": "os.missions.rosetta.toggle67pprojection", "key": "P" } ], @@ -154,7 +89,7 @@ "license": "MIT License", "name": "Rosetta", "url": "https://www.openspaceproject.com", - "version": "1.0" + "version": "1.1" }, "properties": [ { diff --git a/data/profiles/voyager.profile b/data/profiles/voyager.profile index d8c1df1738..7c830a0de2 100644 --- a/data/profiles/voyager.profile +++ b/data/profiles/voyager.profile @@ -1,67 +1,10 @@ { - "actions": [ - { - "documentation": "Set camera focus to Voyager 1", - "gui_path": "/Missions/Voyager", - "identifier": "profile.focus.voyager1", - "is_local": false, - "name": "Focus on Voyager 1", - "script": "openspace.setPropertyValueSingle(\"NavigationHandler.OrbitalNavigator.RetargetAnchor\", nil);openspace.setPropertyValueSingle(\"NavigationHandler.OrbitalNavigator.Anchor\", 'Voyager_1');openspace.setPropertyValueSingle(\"NavigationHandler.OrbitalNavigator.Aim\", '')" - }, - { - "documentation": "Sets the camera focus on Voyager 2", - "gui_path": "/Missions/Voyager", - "identifier": "profile.focus.voyager2", - "is_local": false, - "name": "Focus on Voyager 2", - "script": "openspace.setPropertyValueSingle(\"NavigationHandler.OrbitalNavigator.RetargetAnchor\", nil);openspace.setPropertyValueSingle(\"NavigationHandler.OrbitalNavigator.Anchor\", 'Voyager_2');openspace.setPropertyValueSingle(\"NavigationHandler.OrbitalNavigator.Aim\", '');" - }, - { - "documentation": "Sets the time for Voyager's approach to Jupiter", - "gui_path": "/Missions/Voyager", - "identifier": "profile.setup.jupiter_approach", - "is_local": false, - "name": "Set Jupiter Approach", - "script": "openspace.time.setTime(\"1979-01-20T01:32:07.914\")" - }, - { - "documentation": "Sets the time for Voyager's approach to Saturn", - "gui_path": "/Missions/Voyager", - "identifier": "profile.setup.saturn_approach", - "is_local": false, - "name": "Set Saturn Approach", - "script": "openspace.time.setTime(\"1980-10-20T07:43:42.645\");" - }, - { - "documentation": "Set the camera focus to Jupiter", - "gui_path": "/Missions/Voyager", - "identifier": "profile.focus.jupiter", - "is_local": false, - "name": "Focus on Jupiter", - "script": "openspace.setPropertyValueSingle(\"NavigationHandler.OrbitalNavigator.RetargetAnchor\", nil);openspace.setPropertyValueSingle(\"NavigationHandler.OrbitalNavigator.Anchor\", 'Jupiter');openspace.setPropertyValueSingle(\"NavigationHandler.OrbitalNavigator.Aim\", '');" - }, - { - "documentation": "Sets the camera focus on Saturn", - "gui_path": "/Missions/Voyager", - "identifier": "profile.focus.saturn", - "is_local": false, - "name": "Focus on Saturn", - "script": "openspace.setPropertyValueSingle(\"NavigationHandler.OrbitalNavigator.RetargetAnchor\", nil);openspace.setPropertyValueSingle(\"NavigationHandler.OrbitalNavigator.Anchor\", 'Saturn');openspace.setPropertyValueSingle(\"NavigationHandler.OrbitalNavigator.Aim\", '');" - }, - { - "documentation": "Toggles the trails of the minor moons", - "gui_path": "/Trails", - "identifier": "profile.toggle.minor_trails", - "is_local": false, - "name": "Toggle minor trails", - "script": "local list = openspace.getProperty('{moonTrail_minor}.Renderable.Enabled'); for _,v in pairs(list) do openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) end" - } - ], "assets": [ "base", "scene/solarsystem/missions/voyager/dashboard", "scene/solarsystem/missions/voyager/voyager1", "scene/solarsystem/missions/voyager/voyager2", + "scene/solarsystem/missions/voyager/actions", "scene/solarsystem/planets/jupiter/minor_moons", "scene/solarsystem/planets/neptune/minor_moons", "scene/solarsystem/planets/saturn/minor_moons", @@ -95,31 +38,31 @@ ], "keybindings": [ { - "action": "profile.focus.voyager1", + "action": "os.missions.voyager.v1.focus", "key": "V" }, { - "action": "profile.focus.voyager2", + "action": "os.missions.voyager.v2.focus", "key": "SHIFT+V" }, { - "action": "profile.setup.jupiter_approach", + "action": "os.missions.voyager.setup.jupiterapproach", "key": "SHIFT+J" }, { - "action": "profile.setup.saturn_approach", + "action": "os.missions.voyager.setup.saturnapproach", "key": "SHIFT+S" }, { - "action": "profile.focus.jupiter", + "action": "os.missions.voyager.jupiter.focus", "key": "J" }, { - "action": "profile.focus.saturn", + "action": "os.missions.voyager.saturn.focus", "key": "S" }, { - "action": "profile.toggle.minor_trails", + "action": "os.missions.voyager.toggleminormoontrails", "key": "SHIFT+H" } ], @@ -138,7 +81,7 @@ "license": "MIT License", "name": "Voyager", "url": "https://www.openspaceproject.com", - "version": "1.0" + "version": "1.1" }, "properties": [ { diff --git a/ext/CMakeLists.txt b/ext/CMakeLists.txt index b696061e25..3bb558417a 100644 --- a/ext/CMakeLists.txt +++ b/ext/CMakeLists.txt @@ -22,8 +22,6 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/set_openspace_compile_settings.cmake) - # System libraries if (APPLE) begin_dependency("Core Libraries") @@ -48,16 +46,14 @@ endif () # Ghoul add_subdirectory(ghoul) -set_folder_location(Lua "External") -set_folder_location(lz4 "External") -set_folder_location(GhoulTest "Unit Tests") +set_target_properties(GhoulTest PROPERTIES FOLDER "Unit Tests") # Spice begin_dependency("Spice") set(SPICE_BUILD_SHARED_LIBRARY OFF CACHE BOOL "" FORCE) -add_subdirectory(spice) +add_subdirectory(spice SYSTEM) target_compile_features(spice PUBLIC cxx_std_20) -set_folder_location(spice "External") +set_target_properties(spice PROPERTIES FOLDER "External") end_dependency() # Curl diff --git a/include/openspace/documentation/documentation.h b/include/openspace/documentation/documentation.h index 65a7531cd0..a0164d6df4 100644 --- a/include/openspace/documentation/documentation.h +++ b/include/openspace/documentation/documentation.h @@ -121,6 +121,8 @@ struct SpecificationError : public ghoul::RuntimeError { TestResult result; }; +void logError(const SpecificationError& error, std::string component = ""); + struct Verifier; /** diff --git a/include/openspace/navigation/orbitalnavigator.h b/include/openspace/navigation/orbitalnavigator.h index 1fa4a95bfb..00e083d55b 100644 --- a/include/openspace/navigation/orbitalnavigator.h +++ b/include/openspace/navigation/orbitalnavigator.h @@ -129,9 +129,18 @@ public: bool hasZoomFriction() const; bool hasRollFriction() const; + double minAllowedDistance() const; + glm::dvec3 anchorNodeToCameraVector() const; glm::quat anchorNodeToCameraRotation() const; + /** + * Compute a camera position that pushed the camera position to + * a valid position over the anchor node, accounting for the + * minimal allowed distance + */ + glm::dvec3 pushToSurfaceOfAnchor(const glm::dvec3& cameraPosition) const; + private: struct CameraRotationDecomposition { glm::dquat localRotation = glm::dquat(1.0, 0.0, 0.0, 0.0); @@ -328,11 +337,11 @@ private: /** * Push the camera out to the surface of the object. * - * \return a position vector adjusted to be at least minHeightAboveGround meters + * \return a position vector adjusted to be at least _minimumAllowedDistance meters * above the actual surface of the object */ - glm::dvec3 pushToSurface(double minHeightAboveGround, - const glm::dvec3& cameraPosition, const glm::dvec3& objectPosition, + glm::dvec3 pushToSurface(const glm::dvec3& cameraPosition, + const glm::dvec3& objectPosition, const SurfacePositionHandle& positionHandle) const; /** @@ -351,7 +360,7 @@ private: * Calculates a SurfacePositionHandle given a camera position in world space. */ SurfacePositionHandle calculateSurfacePositionHandle(const SceneGraphNode& node, - const glm::dvec3 cameraPositionWorldSpace); + const glm::dvec3& cameraPositionWorldSpace) const; void resetIdleBehavior(); diff --git a/include/openspace/rendering/dashboarditem.h b/include/openspace/rendering/dashboarditem.h index 9658656269..c9ec5f0250 100644 --- a/include/openspace/rendering/dashboarditem.h +++ b/include/openspace/rendering/dashboarditem.h @@ -52,7 +52,7 @@ public: virtual glm::vec2 size() const = 0; protected: - properties::BoolProperty _isEnabled; + properties::BoolProperty _enabled; }; } // openspace diff --git a/include/openspace/rendering/renderable.h b/include/openspace/rendering/renderable.h index a445f759ca..b484a12e7f 100644 --- a/include/openspace/rendering/renderable.h +++ b/include/openspace/rendering/renderable.h @@ -33,6 +33,7 @@ #include #include #include +#include namespace ghoul { class Dictionary; } namespace ghoul::opengl { @@ -80,6 +81,8 @@ public: double boundingSphere() const; double interactionSphere() const; + std::string_view typeAsString() const; + virtual void render(const RenderData& data, RendererTasks& rendererTask); virtual void update(const UpdateData& data); diff --git a/include/openspace/scene/scenegraphnode.h b/include/openspace/scene/scenegraphnode.h index b933a27a75..15388e12d2 100644 --- a/include/openspace/scene/scenegraphnode.h +++ b/include/openspace/scene/scenegraphnode.h @@ -139,6 +139,8 @@ public: double reachFactor() const; double approachFactor() const; + bool supportsDirectInteraction() const; + SceneGraphNode* childNode(const std::string& identifier); const Renderable* renderable() const; @@ -204,6 +206,7 @@ private: properties::DoubleProperty _distFromCamToNode; properties::DoubleProperty _screenSizeRadius; properties::FloatProperty _visibilityDistance; + properties::BoolProperty _supportsDirectInteraction; // This variable is used for the rate-limiting of the screenspace positions (if they // are calculated when _computeScreenSpaceValues is true) diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index c3d48ba749..4473f38255 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -22,8 +22,8 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/global_variables.cmake) -include(${GHOUL_BASE_DIR}/support/cmake/message_macros.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/global_variables.cmake) +include(${PROJECT_SOURCE_DIR}/ext/ghoul/support/cmake/message_macros.cmake) # This function takes a list of module paths and returns the list of include paths that @@ -164,7 +164,7 @@ endfunction () set(OPENSPACE_EXTERNAL_MODULES_PATHS "" CACHE STRING "List of external modules") -set(internal_module_path "${OPENSPACE_BASE_DIR}/modules") +set(internal_module_path "${PROJECT_SOURCE_DIR}/modules") set(all_enabled_modules "") @@ -378,12 +378,12 @@ if (NOT "${MODULE_PATHS}" STREQUAL "") endif () configure_file( - ${OPENSPACE_CMAKE_EXT_DIR}/module_registration.template + ${PROJECT_SOURCE_DIR}/support/cmake/module_registration.template ${CMAKE_BINARY_DIR}/_generated/include/openspace/moduleregistration.h ) configure_file( - ${OPENSPACE_CMAKE_EXT_DIR}/module_path.template + ${PROJECT_SOURCE_DIR}/support/cmake/module_path.template ${CMAKE_BINARY_DIR}/_generated/include/openspace/modulepath.h ) diff --git a/modules/atmosphere/CMakeLists.txt b/modules/atmosphere/CMakeLists.txt index 7c0815ae26..abc62c3d4c 100644 --- a/modules/atmosphere/CMakeLists.txt +++ b/modules/atmosphere/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES rendering/atmospheredeferredcaster.h diff --git a/modules/base/CMakeLists.txt b/modules/base/CMakeLists.txt index 220360e2a9..f37c8bc1a0 100644 --- a/modules/base/CMakeLists.txt +++ b/modules/base/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES dashboard/dashboarditemangle.h diff --git a/modules/base/rendering/renderablemodel.cpp b/modules/base/rendering/renderablemodel.cpp index 3995528983..bb65c1f07e 100644 --- a/modules/base/rendering/renderablemodel.cpp +++ b/modules/base/rendering/renderablemodel.cpp @@ -917,7 +917,7 @@ void RenderableModel::update(const UpdateData& data) { // starts again // s/\/\/\/\ ... relativeTime = - duration - abs(fmod(now - startTime, 2 * duration) - duration); + duration - std::abs(fmod(now - startTime, 2 * duration) - duration); break; case AnimationMode::BounceInfinitely: { // Bounce both before and after the start time where the model is @@ -927,7 +927,7 @@ void RenderableModel::update(const UpdateData& data) { if (modulo < 0.0) { modulo += 2 * duration; } - relativeTime = duration - abs(modulo - duration); + relativeTime = duration - std::abs(modulo - duration); break; } case AnimationMode::Once: diff --git a/modules/base/rendering/renderablenodeline.cpp b/modules/base/rendering/renderablenodeline.cpp index 4a86ec7d79..61d8d9c433 100644 --- a/modules/base/rendering/renderablenodeline.cpp +++ b/modules/base/rendering/renderablenodeline.cpp @@ -39,6 +39,8 @@ #include namespace { + constexpr std::string_view _loggerCat = "RenderableNodeLine"; + constexpr openspace::properties::Property::PropertyInfo StartNodeInfo = { "StartNode", "Start Node", @@ -65,6 +67,33 @@ namespace { "This value specifies the line width" }; + constexpr openspace::properties::Property::PropertyInfo StartOffsetInfo = { + "StartOffset", + "Offset to Start Node", + "A distance from the start node at which the rendered line should begin. " + "By default it takes a value in meters, but if 'UseRelativeOffsets' is set " + "to true it is read as a multiplier times the bounding sphere of the node.", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo EndOffsetInfo = { + "EndOffset", + "Offset to End Node", + "A distance to the end node at which the rendered line should end. " + "By default it takes a value in meters, but if 'UseRelativeOffsets' is set " + "to true it is read as a multiplier times the bounding sphere of the node.", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo RelativeOffsetsInfo = { + "UseRelativeOffsets", + "Use Relative Offsets", + "If true, the offset values are interpreted as relative values to be multiplied " + "with the bounding sphere of the start/end node. If false, the value is " + "interpreted as a distance in meters.", + openspace::properties::Property::Visibility::AdvancedUser + }; + // Returns a position that is relative to the current anchor node. This is a method to // handle precision problems that occur when approaching a line end point glm::dvec3 coordinatePosFromAnchorNode(const glm::dvec3& worldPos) { @@ -93,6 +122,15 @@ namespace { // [[codegen::verbatim(LineWidthInfo.description)]] std::optional lineWidth; + + // [[codegen::verbatim(StartOffsetInfo.description)]] + std::optional startOffset; + + // [[codegen::verbatim(EndOffsetInfo.description)]] + std::optional endOffset; + + // [[codegen::verbatim(RelativeOffsetsInfo.description)]] + std::optional useRelativeOffsets; }; #include "renderablenodeline_codegen.cpp" } // namespace @@ -109,14 +147,13 @@ RenderableNodeLine::RenderableNodeLine(const ghoul::Dictionary& dictionary) , _end(EndNodeInfo, "Root") , _lineColor(LineColorInfo, glm::vec3(1.f), glm::vec3(0.f), glm::vec3(1.f)) , _lineWidth(LineWidthInfo, 2.f, 1.f, 20.f) + , _startOffset(StartOffsetInfo, 0.f, 0.f, 1e13f) + , _endOffset(EndOffsetInfo, 0.f, 0.f, 1e13f) + , _useRelativeOffsets(RelativeOffsetsInfo, true) { const Parameters p = codegen::bake(dictionary); - _start = p.startNode.value_or(_start); - addProperty(_start); - - _end = p.endNode.value_or(_end); - addProperty(_end); + addProperty(_opacity); _lineColor = p.color.value_or(_lineColor); _lineColor.setViewOption(properties::Property::ViewOptions::Color); @@ -125,7 +162,82 @@ RenderableNodeLine::RenderableNodeLine(const ghoul::Dictionary& dictionary) _lineWidth = p.lineWidth.value_or(_lineWidth); addProperty(_lineWidth); - addProperty(_opacity); + _start = p.startNode.value_or(_start); + addProperty(_start); + + _end = p.endNode.value_or(_end); + addProperty(_end); + + addProperty(_startOffset); + _startOffset.setExponent(7.f); + _startOffset.onChange([&] { + if (_useRelativeOffsets) { + SceneGraphNode* node = global::renderEngine->scene()->sceneGraphNode(_start); + if (!node || node->boundingSphere() > 0.0) { + return; + } + LWARNING(fmt::format( + "Setting StartOffset for node line '{}': " + "Trying to use relative offsets for start node '{}' that has no " + "bounding sphere. This will result in no offset. Use direct " + "values by setting UseRelativeOffsets to false", + _parent->identifier(), _start + )); + } + }); + + addProperty(_endOffset); + _endOffset.setExponent(7.f); + _endOffset.onChange([&] { + if (_useRelativeOffsets) { + SceneGraphNode* node = global::renderEngine->scene()->sceneGraphNode(_end); + if (!node || node->boundingSphere() > 0.0) { + return; + } + LWARNING(fmt::format( + "Setting EndOffset for node line '{}': " + "Trying to use relative offsets for end node '{}' that has no " + "bounding sphere. This will result in no offset. Use direct " + "values by setting UseRelativeOffsets to false", + _parent->identifier(), _end + )); + } + }); + + addProperty(_useRelativeOffsets); + _useRelativeOffsets.onChange([&]() { + SceneGraphNode* startNode = global::renderEngine->scene()->sceneGraphNode(_start); + SceneGraphNode* endNode = global::renderEngine->scene()->sceneGraphNode(_end); + + if (!startNode) { + LERROR(fmt::format( + "Error when recomputing node line offsets for scene graph node '{}'. " + "Could not find start node '{}'", _parent->identifier(), _start.value() + )); + return; + } + + if (!endNode) { + LERROR(fmt::format( + "Error when recomputing node line offsets for scene graph node '{}'. " + "Could not find end node '{}'", _parent->identifier(), _end.value() + )); + return; + } + + if (_useRelativeOffsets) { + // Recompute previous offsets to relative values + double startBs = startNode->boundingSphere(); + double endBs = endNode->boundingSphere(); + _startOffset = startBs > 0.0 ? _startOffset / startBs : 0.0; + _endOffset = endBs > 0.0 ? _endOffset / startBs : 0.0; + } + else { + // Recompute relative values to meters + _startOffset = _startOffset * startNode->boundingSphere(); + _endOffset = _endOffset * endNode->boundingSphere(); + } + }); } double RenderableNodeLine::distance() const { @@ -200,15 +312,13 @@ void RenderableNodeLine::updateVertexData() { SceneGraphNode* startNode = global::renderEngine->scene()->sceneGraphNode(_start); SceneGraphNode* endNode = global::renderEngine->scene()->sceneGraphNode(_end); - if (!startNode || !endNode) { - LERRORC( - "RenderableNodeLine", - fmt::format( - "Could not find starting '{}' or ending '{}'", - _start.value(), _end.value() - ) - ); + if (!startNode) { + LERROR(fmt::format("Could not find start node '{}'", _start.value())); + return; + } + if (!endNode) { + LERROR(fmt::format("Could not find end node '{}'", _end.value())); return; } @@ -218,13 +328,26 @@ void RenderableNodeLine::updateVertexData() { _startPos = coordinatePosFromAnchorNode(startNode->worldPosition()); _endPos = coordinatePosFromAnchorNode(endNode->worldPosition()); - _vertexArray.push_back(static_cast(_startPos.x)); - _vertexArray.push_back(static_cast(_startPos.y)); - _vertexArray.push_back(static_cast(_startPos.z)); + // Handle relative values + double startOffset = static_cast(_startOffset); + double endOffset = static_cast(_endOffset); + if (_useRelativeOffsets) { + startOffset *= startNode->boundingSphere(); + endOffset *= endNode->boundingSphere(); + } - _vertexArray.push_back(static_cast(_endPos.x)); - _vertexArray.push_back(static_cast(_endPos.y)); - _vertexArray.push_back(static_cast(_endPos.z)); + // Compute line positions + glm::dvec3 dir = glm::normalize(_endPos - _startPos); + glm::dvec3 startPos = _startPos + startOffset * dir; + glm::dvec3 endPos = _endPos - endOffset * dir; + + _vertexArray.push_back(static_cast(startPos.x)); + _vertexArray.push_back(static_cast(startPos.y)); + _vertexArray.push_back(static_cast(startPos.z)); + + _vertexArray.push_back(static_cast(endPos.x)); + _vertexArray.push_back(static_cast(endPos.y)); + _vertexArray.push_back(static_cast(endPos.z)); bindGL(); glBufferData( diff --git a/modules/base/rendering/renderablenodeline.h b/modules/base/rendering/renderablenodeline.h index f0fc7f524c..7d62d0a534 100644 --- a/modules/base/rendering/renderablenodeline.h +++ b/modules/base/rendering/renderablenodeline.h @@ -83,6 +83,9 @@ private: properties::StringProperty _end; properties::Vec3Property _lineColor; properties::FloatProperty _lineWidth; + properties::FloatProperty _startOffset; + properties::FloatProperty _endOffset; + properties::BoolProperty _useRelativeOffsets; }; } // namespace openspace diff --git a/modules/cefwebgui/CMakeLists.txt b/modules/cefwebgui/CMakeLists.txt index 6b8cf42711..531702b264 100644 --- a/modules/cefwebgui/CMakeLists.txt +++ b/modules/cefwebgui/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) include(../webbrowser/cmake/webbrowser_helpers.cmake) set(CEFWEBGUI_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "CEFWEBGUI_MODULE_PATH") diff --git a/modules/debugging/CMakeLists.txt b/modules/debugging/CMakeLists.txt index 2495cf69fa..b72d237135 100644 --- a/modules/debugging/CMakeLists.txt +++ b/modules/debugging/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES debuggingmodule.h diff --git a/modules/digitaluniverse/CMakeLists.txt b/modules/digitaluniverse/CMakeLists.txt index aa2a475a0e..252b33d460 100644 --- a/modules/digitaluniverse/CMakeLists.txt +++ b/modules/digitaluniverse/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES rendering/renderablepoints.h @@ -34,7 +34,7 @@ source_group("Header Files" FILES ${HEADER_FILES}) set(SOURCE_FILES rendering/renderablepoints.cpp - rendering/renderabledumeshes.cpp + rendering/renderabledumeshes.cpp rendering/renderablebillboardscloud.cpp rendering/renderableplanescloud.cpp ) diff --git a/modules/digitaluniverse/rendering/renderableplanescloud.h b/modules/digitaluniverse/rendering/renderableplanescloud.h index a9f057a8c8..4ee824e228 100644 --- a/modules/digitaluniverse/rendering/renderableplanescloud.h +++ b/modules/digitaluniverse/rendering/renderableplanescloud.h @@ -87,7 +87,6 @@ private: bool _hasSpeckFile = false; bool _dataIsDirty = true; - bool _textColorIsDirty = true; bool _hasLabels = false; properties::FloatProperty _scaleFactor; diff --git a/modules/exoplanets/CMakeLists.txt b/modules/exoplanets/CMakeLists.txt index 6e82ca21a1..a803fa179b 100644 --- a/modules/exoplanets/CMakeLists.txt +++ b/modules/exoplanets/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES exoplanetshelper.h diff --git a/modules/exoplanets/exoplanetsmodule.cpp b/modules/exoplanets/exoplanetsmodule.cpp index b98810431d..d7c9aa84cd 100644 --- a/modules/exoplanets/exoplanetsmodule.cpp +++ b/modules/exoplanets/exoplanetsmodule.cpp @@ -275,7 +275,7 @@ float ExoplanetsModule::habitableZoneOpacity() const { void ExoplanetsModule::internalInitialize(const ghoul::Dictionary& dict) { const Parameters p = codegen::bake(dict); - _enabled = p.enabled.value_or(true); + _enabled = p.enabled.value_or(_enabled); if (p.dataFolder.has_value()) { _exoplanetsDataFolder = p.dataFolder.value().string(); diff --git a/modules/fieldlines/CMakeLists.txt b/modules/fieldlines/CMakeLists.txt index 288a72eb15..8951237b92 100644 --- a/modules/fieldlines/CMakeLists.txt +++ b/modules/fieldlines/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES rendering/renderablefieldlines.h diff --git a/modules/fieldlinessequence/CMakeLists.txt b/modules/fieldlinessequence/CMakeLists.txt index 72ec2ca260..e04a63f744 100644 --- a/modules/fieldlinessequence/CMakeLists.txt +++ b/modules/fieldlinessequence/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES rendering/renderablefieldlinessequence.h diff --git a/modules/fitsfilereader/CMakeLists.txt b/modules/fitsfilereader/CMakeLists.txt index f45670eeb9..d534344961 100644 --- a/modules/fitsfilereader/CMakeLists.txt +++ b/modules/fitsfilereader/CMakeLists.txt @@ -22,8 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) -include(${GHOUL_BASE_DIR}/support/cmake/handle_external_library.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES fitsfilereadermodule.h @@ -31,7 +30,7 @@ set(HEADER_FILES ) source_group("Header Files" FILES ${HEADER_FILES}) -set(SOURCE_FILES +set(SOURCE_FILES fitsfilereadermodule.cpp src/fitsfilereader.cpp ) @@ -44,25 +43,28 @@ create_new_module( ${SOURCE_FILES} ) -# Set root directories for external libraries. -set(CFITSIO_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ext/cfitsio/") -set(CCFITS_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ext/CCfits/") -set(INCLUDES_FOR_TARGET ${CCFITS_ROOT_DIR} "${CCFITS_ROOT_DIR}/../" ${CFITSIO_ROOT_DIR}) -set(MODULE_NAME openspace-module-fitsfilereader) - # CCfits is dependent on cfitsio, let it handle the internal linking -add_subdirectory(${CFITSIO_ROOT_DIR}) -set_folder_location(cfitsio "External") +add_subdirectory(ext/cfitsio SYSTEM) +set_target_properties(cfitsio PROPERTIES FOLDER "External") set(cfitsio_BUILD_SHARED_LIBS OFF) -add_subdirectory(${CCFITS_ROOT_DIR}) -set_folder_location(CCfits "External") +add_subdirectory(ext/CCfits SYSTEM) +set_target_properties(CCfits PROPERTIES FOLDER "External") set(CCfits_BUILD_SHARED_LIBS OFF) -disable_external_warnings(cfitsio) -disable_external_warnings(CCfits) +if (MSVC) + target_compile_options(cfitsio PRIVATE "/W0") + target_compile_definitions(cfitsio PRIVATE "_SCL_SECURE_NO_WARNINGS") -target_include_directories(openspace-module-fitsfilereader SYSTEM PRIVATE ${INCLUDES_FOR_TARGET}) + target_compile_options(CCfits PRIVATE "/W0") + target_compile_definitions(CCfits PRIVATE "_SCL_SECURE_NO_WARNINGS") +else () + target_compile_options(cfitsio PRIVATE "-w") + target_compile_options(CCfits PRIVATE "-w") +endif () + + +target_include_directories(openspace-module-fitsfilereader SYSTEM PRIVATE ext ext/CCfits ext/cfitsio) target_link_libraries(openspace-module-fitsfilereader PRIVATE cfitsio CCfits) target_precompile_headers(CCfits PRIVATE diff --git a/modules/gaia/CMakeLists.txt b/modules/gaia/CMakeLists.txt index a6ce4bab27..dae14a125a 100644 --- a/modules/gaia/CMakeLists.txt +++ b/modules/gaia/CMakeLists.txt @@ -22,17 +22,17 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES gaiamodule.h rendering/renderablegaiastars.h rendering/octreemanager.h rendering/octreeculler.h - tasks/readfilejob.h - tasks/readfitstask.h + tasks/readfilejob.h + tasks/readfitstask.h tasks/readspecktask.h - tasks/constructoctreetask.h + tasks/constructoctreetask.h rendering/gaiaoptions.h ) source_group("Header Files" FILES ${HEADER_FILES}) diff --git a/modules/gaia/rendering/renderablegaiastars.cpp b/modules/gaia/rendering/renderablegaiastars.cpp index ccea1a00bf..0058529543 100644 --- a/modules/gaia/rendering/renderablegaiastars.cpp +++ b/modules/gaia/rendering/renderablegaiastars.cpp @@ -928,7 +928,7 @@ void RenderableGaiaStars::render(const RenderData& data, RendererTasks&) { glm::vec2 screenSize = glm::vec2(global::renderEngine->renderingResolution()); // Wait until camera has stabilized before we traverse the Octree/stream from files. - const double rotationDiff = abs(length(_previousCameraRotation) - + const double rotationDiff = std::abs(length(_previousCameraRotation) - length(data.camera.rotationQuaternion())); if (_firstDrawCalls && rotationDiff > 1e-10) { _previousCameraRotation = data.camera.rotationQuaternion(); diff --git a/modules/galaxy/CMakeLists.txt b/modules/galaxy/CMakeLists.txt index d730d45842..0aeb7134cc 100644 --- a/modules/galaxy/CMakeLists.txt +++ b/modules/galaxy/CMakeLists.txt @@ -22,10 +22,10 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES - galaxymodule.h + galaxymodule.h rendering/galaxyraycaster.h rendering/renderablegalaxy.h tasks/milkywayconversiontask.h @@ -34,7 +34,7 @@ set(HEADER_FILES source_group("Header Files" FILES ${HEADER_FILES}) set(SOURCE_FILES - galaxymodule.cpp + galaxymodule.cpp rendering/galaxyraycaster.cpp rendering/renderablegalaxy.cpp tasks/milkywayconversiontask.cpp diff --git a/modules/globebrowsing/CMakeLists.txt b/modules/globebrowsing/CMakeLists.txt index 24e84d32d9..1bc921acf4 100644 --- a/modules/globebrowsing/CMakeLists.txt +++ b/modules/globebrowsing/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES globebrowsingmodule.h diff --git a/modules/globebrowsing/globebrowsingmodule.cpp b/modules/globebrowsing/globebrowsingmodule.cpp index f353633f99..97e7f28a4b 100644 --- a/modules/globebrowsing/globebrowsingmodule.cpp +++ b/modules/globebrowsing/globebrowsingmodule.cpp @@ -146,7 +146,7 @@ namespace { std::fill(IdentifierBuffer.begin(), IdentifierBuffer.end(), '\0'); int ret = sscanf( subDatasets[i], - "SUBDATASET_%i_%256[^=]", + "SUBDATASET_%i_%255[^=]", &iDataset, IdentifierBuffer.data() ); diff --git a/modules/globebrowsing/scripts/layer_support.lua b/modules/globebrowsing/scripts/layer_support.lua index d9c89cc383..8f58ac41f7 100644 --- a/modules/globebrowsing/scripts/layer_support.lua +++ b/modules/globebrowsing/scripts/layer_support.lua @@ -10,7 +10,7 @@ openspace.globebrowsing.documentation = { { Name = "createGibsGdalXml", Arguments = { layerName = "String", date = "String", resolution = "String", format = "String" }, - Documentation = + Documentation = "Creates an XML configuration for a GIBS dataset." .. "Arguments are: layerName, date, resolution, format." .. "For all specifications, see " .. @@ -94,7 +94,7 @@ openspace.globebrowsing.addGibsLayer = function(layer, resolution, format, start end local layer = { - Identifier = layerName, + Identifier = layerName, Type = "TemporalTileLayer", Mode = "Prototyped", Prototyped = { @@ -207,7 +207,7 @@ openspace.globebrowsing.parseInfoFile = function (file) file_func() else openspace.printError('Error loading file "' .. file .. '": '.. error) - return nil, nil, nil, nil + return nil end -- Hoist the global variables into local space @@ -220,11 +220,11 @@ openspace.globebrowsing.parseInfoFile = function (file) -- Now we can start local name = Name or Identifier - local identifier = Identifier or Name + local identifier = Identifier - if name == nil and identifier == nil then - openspace.printError('Error loading file "' .. file .. '": No "Name" or "Identifier" found') - return nil, nil, nil, nil + if identifier == "" then + openspace.printError('Error loading file "' .. file .. '": No "Identifier" found') + return nil end local color = nil @@ -287,11 +287,12 @@ openspace.globebrowsing.addBlendingLayersFromDirectory = function (dir, node_nam for _, file in pairs(files) do if file and file:find('.info') and ends_with(file, '.info') then local t = openspace.globebrowsing.parseInfoFile(file) - if t.Color then + + if t and t.Color then openspace.printInfo("Adding color layer '" .. t.Color["Identifier"] .. "'") openspace.globebrowsing.addLayer(node_name, "ColorLayers", t.Color) end - if t.Height then + if t and t.Height then openspace.printInfo("Adding height layer '" .. t.Height["Identifier"] .. "'") openspace.globebrowsing.addLayer(node_name, "HeightLayers", t.Height) end @@ -306,7 +307,7 @@ openspace.globebrowsing.addFocusNodesFromDirectory = function (dir, node_name) if file and file:find('.info') then local t = openspace.globebrowsing.parseInfoFile(file) - if node_name and t.Location then + if node_name and t and t.Location then openspace.printInfo("Creating focus node for '" .. node_name .. "'") local lat = t.Location.Center[1] diff --git a/modules/globebrowsing/src/layermanager.cpp b/modules/globebrowsing/src/layermanager.cpp index d8afc32605..03b7cb5c43 100644 --- a/modules/globebrowsing/src/layermanager.cpp +++ b/modules/globebrowsing/src/layermanager.cpp @@ -99,13 +99,7 @@ Layer* LayerManager::addLayer(layers::Group::ID id, const ghoul::Dictionary& lay return _layerGroups[static_cast(id)]->addLayer(layerDict); } catch (const documentation::SpecificationError& e) { - LERRORC(e.component, e.message); - for (const documentation::TestResult::Offense& o : e.result.offenses) { - LERRORC(o.offender, ghoul::to_string(o.reason)); - } - for (const documentation::TestResult::Warning& w : e.result.warnings) { - LWARNINGC(w.offender, ghoul::to_string(w.reason)); - } + logError(e); return nullptr; } catch (const ghoul::RuntimeError& e) { @@ -145,7 +139,7 @@ std::array LayerManager::layerGroups( ZoneScoped std::array res = {}; - for (int i = 0; i < NumLayerGroups; ++i) { + for (size_t i = 0; i < NumLayerGroups; ++i) { res[i] = _layerGroups[i].get(); } return res; diff --git a/modules/globebrowsing/src/renderableglobe.cpp b/modules/globebrowsing/src/renderableglobe.cpp index 89c2b8c908..b23bc233ae 100644 --- a/modules/globebrowsing/src/renderableglobe.cpp +++ b/modules/globebrowsing/src/renderableglobe.cpp @@ -1713,7 +1713,7 @@ void RenderableGlobe::recompileShaders() { } ghoul::Dictionary layerGroupNames; - for (int i = 0; i < layers::Groups.size(); ++i) { + for (size_t i = 0; i < layers::Groups.size(); ++i) { layerGroupNames.setValue( std::to_string(i), std::string(layers::Groups[i].identifier) diff --git a/modules/imgui/CMakeLists.txt b/modules/imgui/CMakeLists.txt index 29b5eb4487..4cb0a0b834 100644 --- a/modules/imgui/CMakeLists.txt +++ b/modules/imgui/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES include/guiactioncomponent.h @@ -74,4 +74,6 @@ create_new_module( ${HEADER_FILES} ${SOURCE_FILES} ${SHADER_FILES} ) -include_external_library(${imgui_module} PUBLIC Imgui ${CMAKE_CURRENT_SOURCE_DIR}/ext/imgui) +add_subdirectory(ext/imgui SYSTEM) +target_link_libraries(${imgui_module} PUBLIC Imgui) +set_target_properties(Imgui PROPERTIES FOLDER "External") diff --git a/modules/imgui/src/guipropertycomponent.cpp b/modules/imgui/src/guipropertycomponent.cpp index 78ceae63b3..9c3e0b87eb 100644 --- a/modules/imgui/src/guipropertycomponent.cpp +++ b/modules/imgui/src/guipropertycomponent.cpp @@ -53,14 +53,6 @@ namespace { "elements not listed" }; - constexpr openspace::properties::Property::PropertyInfo IgnoreHiddenInfo = { - "IgnoreHidden", - "Ignore Hidden Hint", - "If this value is 'true', all 'Hidden' hints passed into the SceneGraphNodes are " - "ignored and thus all SceneGraphNodes are displayed. If this value is 'false', " - "the hidden hints are followed" - }; - int nVisibleProperties(const std::vector& props) { using Visibility = openspace::properties::Property::Visibility; diff --git a/modules/iswa/CMakeLists.txt b/modules/iswa/CMakeLists.txt index c580e3297a..6031ea4eff 100644 --- a/modules/iswa/CMakeLists.txt +++ b/modules/iswa/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES rendering/datacygnet.h diff --git a/modules/kameleon/CMakeLists.txt b/modules/kameleon/CMakeLists.txt index eacbf68dea..08ea00b1be 100644 --- a/modules/kameleon/CMakeLists.txt +++ b/modules/kameleon/CMakeLists.txt @@ -22,12 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) -include(${GHOUL_BASE_DIR}/support/cmake/handle_external_library.cmake) - -# Use _ROOT variables -# https://cmake.org/cmake/help/git-stage/policy/CMP0074.html -cmake_policy(SET CMP0074 NEW) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES include/kameleonwrapper.h @@ -58,17 +53,22 @@ mark_as_advanced(BUILD_SHARED_LIBS) # Change to set instead of option option(KAMELEON_USE_HDF5 "Kameleon use HDF5" OFF) set(KAMELEON_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ext/kameleon) set(KAMELEON_INCLUDES ${KAMELEON_ROOT_DIR}/src) -add_subdirectory(${KAMELEON_ROOT_DIR}) +add_subdirectory(${KAMELEON_ROOT_DIR} SYSTEM) target_include_directories(${kameleon_module} SYSTEM PUBLIC ${KAMELEON_INCLUDES}) target_link_libraries(${kameleon_module} PRIVATE ccmc) mark_as_advanced(CDF_BUILD_ZLIB CDF_INCLUDES CDF_LIBRARY CDF_USE_STATIC_LIBS CDF_USE_ZLIB HDF5_DIR HDF5_USE_STATIC_LIBRARIES KAMELEON_LIBRARY_ONLY KAMELEON_USE_HDF5 ) -disable_external_warnings(ccmc) -set_folder_location(ccmc "External") +set_target_properties(ccmc PROPERTIES FOLDER "External") if (TARGET cdf) - disable_external_warnings(cdf) - set_folder_location(cdf "External") + if (MSVC) + target_compile_options(cdf PRIVATE "/W0") + target_compile_definitions(cdf PRIVATE "_SCL_SECURE_NO_WARNINGS") + else () + target_compile_options(cdf PRIVATE "-w") + endif () + + set_target_properties(cdf PROPERTIES FOLDER "External") endif () target_precompile_headers(cdf PRIVATE @@ -84,10 +84,3 @@ target_precompile_headers(ccmc PRIVATE "$<$:vector>" "$<$:boost/unordered_map.hpp>" ) - -if (WIN32) - target_compile_options(ccmc PRIVATE /MP) - if (TARGET cdf) - target_compile_options(cdf PRIVATE /MP) - endif () -endif () diff --git a/modules/kameleonvolume/CMakeLists.txt b/modules/kameleonvolume/CMakeLists.txt index b90b6cf4d2..7d475fb2a4 100644 --- a/modules/kameleonvolume/CMakeLists.txt +++ b/modules/kameleonvolume/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES kameleonvolumereader.h diff --git a/modules/multiresvolume/CMakeLists.txt b/modules/multiresvolume/CMakeLists.txt index 493d45d72c..33414e7b08 100644 --- a/modules/multiresvolume/CMakeLists.txt +++ b/modules/multiresvolume/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES rendering/atlasmanager.h diff --git a/modules/server/CMakeLists.txt b/modules/server/CMakeLists.txt index b0db73d896..f4ce6e93ed 100644 --- a/modules/server/CMakeLists.txt +++ b/modules/server/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) set(HEADER_FILES diff --git a/modules/server/servermodule.cpp b/modules/server/servermodule.cpp index 1ecde412c6..86fa11a7f2 100644 --- a/modules/server/servermodule.cpp +++ b/modules/server/servermodule.cpp @@ -56,7 +56,7 @@ ServerModule::ServerModule() // Trigger callbacks using K = CallbackHandle; using V = CallbackFunction; - for (const std::pair& it : _preSyncCallbacks) { + for (const std::pair& it : _preSyncCallbacks) { it.second(); // call function } }); @@ -113,10 +113,7 @@ void ServerModule::internalInitialize(const ghoul::Dictionary& configuration) { std::unique_ptr serverInterface = ServerInterface::createFromDictionary(interfaceDictionary); - - if (global::windowDelegate->isMaster()) { - serverInterface->initialize(); - } + serverInterface->initialize(); _interfaceOwner.addPropertySubOwner(serverInterface.get()); @@ -132,10 +129,6 @@ void ServerModule::internalInitialize(const ghoul::Dictionary& configuration) { } void ServerModule::preSync() { - if (!global::windowDelegate->isMaster()) { - return; - } - // Set up new connections. for (std::unique_ptr& serverInterface : _interfaces) { if (!serverInterface->isEnabled()) { @@ -204,9 +197,7 @@ void ServerModule::disconnectAll() { ZoneScoped for (std::unique_ptr& serverInterface : _interfaces) { - if (global::windowDelegate->isMaster()) { - serverInterface->deinitialize(); - } + serverInterface->deinitialize(); } for (ConnectionData& connectionData : _connections) { diff --git a/modules/server/src/topics/cameratopic.cpp b/modules/server/src/topics/cameratopic.cpp index 82c4950f69..2dc5b6a01e 100644 --- a/modules/server/src/topics/cameratopic.cpp +++ b/modules/server/src/topics/cameratopic.cpp @@ -37,7 +37,6 @@ namespace { constexpr std::string_view SubscribeEvent = "start_subscription"; - constexpr std::string_view UnsubscribeEvent = "stop_subscription"; } // namespace using nlohmann::json; diff --git a/modules/server/src/topics/shortcuttopic.cpp b/modules/server/src/topics/shortcuttopic.cpp index e6dd498704..db2eab047a 100644 --- a/modules/server/src/topics/shortcuttopic.cpp +++ b/modules/server/src/topics/shortcuttopic.cpp @@ -28,6 +28,7 @@ #include #include #include +#include using nlohmann::json; @@ -69,6 +70,13 @@ std::vector ShortcutTopic::shortcutsJson() const { global::keybindingManager->keyBindings(); for (const std::pair& keyBinding : keyBindings) { + if (!global::actionManager->hasAction(keyBinding.second)) { + // We don't warn here as we don't know if the user didn't expect the action + // to be there or not. They might have defined a keybind to do multiple things + // only one of which is actually defined + continue; + } + const KeyWithModifier& k = keyBinding.first; // @TODO (abock, 2021-08-05) Probably this should be rewritten to better account // for the new action mechanism diff --git a/modules/skybrowser/CMakeLists.txt b/modules/skybrowser/CMakeLists.txt index 7ea6ef0161..7673e2f661 100644 --- a/modules/skybrowser/CMakeLists.txt +++ b/modules/skybrowser/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES skybrowsermodule.h @@ -33,7 +33,6 @@ set(HEADER_FILES include/wwtcommunicator.h include/browser.h include/screenspaceskybrowser.h - ext/tinyxml2/tinyxml2.h ) source_group("Header Files" FILES ${HEADER_FILES}) @@ -47,7 +46,6 @@ set(SOURCE_FILES src/wwtcommunicator.cpp src/browser.cpp src/screenspaceskybrowser.cpp - ext/tinyxml2/tinyxml2.cpp ) source_group("Source Files" FILES ${SOURCE_FILES}) @@ -67,3 +65,8 @@ target_precompile_headers(${skybrowser_module} PRIVATE [["include/cef_accessibility_handler.h"]] [["include/cef_render_handler.h"]] ) + +# This introduces a dependency into SGCT, but the way it is handled is not great right now +# This will break when we remove tinyxml2 from SGCT and then we can move the submodule +# over into this ext folder and fix it well +target_link_libraries(${skybrowser_module} PRIVATE tinyxml2) diff --git a/modules/skybrowser/ext/tinyxml2/tinyxml2.cpp b/modules/skybrowser/ext/tinyxml2/tinyxml2.cpp deleted file mode 100644 index cb04585ff2..0000000000 --- a/modules/skybrowser/ext/tinyxml2/tinyxml2.cpp +++ /dev/null @@ -1,3008 +0,0 @@ -/* -Original code by Lee Thomason (www.grinninglizard.com) - -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. -*/ - -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wold-style-cast" -#pragma GCC diagnostic ignored "-Wsuggest-override" -#pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" -#endif - -#if defined(__clang__) -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wold-style-cast" -#pragma clang diagnostic ignored "-Wsuggest-override" -#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" -#endif - -#include "tinyxml2.h" - -#include // yes, this one new style header, is in the Android SDK. -#if defined(ANDROID_NDK) || defined(__BORLANDC__) || defined(__QNXNTO__) -# include -# include -#else -# include -# include -#endif - -#if defined(_MSC_VER) && (_MSC_VER >= 1400 ) && (!defined WINCE) - // Microsoft Visual Studio, version 2005 and higher. Not WinCE. - /*int _snprintf_s( - char *buffer, - size_t sizeOfBuffer, - size_t count, - const char *format [, - argument] ... - );*/ - static inline int TIXML_SNPRINTF( char* buffer, size_t size, const char* format, ... ) - { - va_list va; - va_start( va, format ); - const int result = vsnprintf_s( buffer, size, _TRUNCATE, format, va ); - va_end( va ); - return result; - } - - static inline int TIXML_VSNPRINTF( char* buffer, size_t size, const char* format, va_list va ) - { - const int result = vsnprintf_s( buffer, size, _TRUNCATE, format, va ); - return result; - } - - #define TIXML_VSCPRINTF _vscprintf - #define TIXML_SSCANF sscanf_s -#elif defined _MSC_VER - // Microsoft Visual Studio 2003 and earlier or WinCE - #define TIXML_SNPRINTF _snprintf - #define TIXML_VSNPRINTF _vsnprintf - #define TIXML_SSCANF sscanf - #if (_MSC_VER < 1400 ) && (!defined WINCE) - // Microsoft Visual Studio 2003 and not WinCE. - #define TIXML_VSCPRINTF _vscprintf // VS2003's C runtime has this, but VC6 C runtime or WinCE SDK doesn't have. - #else - // Microsoft Visual Studio 2003 and earlier or WinCE. - static inline int TIXML_VSCPRINTF( const char* format, va_list va ) - { - int len = 512; - for (;;) { - len = len*2; - char* str = new char[len](); - const int required = _vsnprintf(str, len, format, va); - delete[] str; - if ( required != -1 ) { - TIXMLASSERT( required >= 0 ); - len = required; - break; - } - } - TIXMLASSERT( len >= 0 ); - return len; - } - #endif -#else - // GCC version 3 and higher - //#warning( "Using sn* functions." ) - #define TIXML_SNPRINTF snprintf - #define TIXML_VSNPRINTF vsnprintf - static inline int TIXML_VSCPRINTF( const char* format, va_list va ) - { - int len = vsnprintf( 0, 0, format, va ); - TIXMLASSERT( len >= 0 ); - return len; - } - #define TIXML_SSCANF sscanf -#endif - -#if defined(_WIN64) - #define TIXML_FSEEK _fseeki64 - #define TIXML_FTELL _ftelli64 -#elif defined(__APPLE__) || defined(__FreeBSD__) - #define TIXML_FSEEK fseeko - #define TIXML_FTELL ftello -#elif defined(__unix__) && defined(__x86_64__) - #define TIXML_FSEEK fseeko64 - #define TIXML_FTELL ftello64 -#else - #define TIXML_FSEEK fseek - #define TIXML_FTELL ftell -#endif - - -static const char LINE_FEED = static_cast(0x0a); // all line endings are normalized to LF -static const char LF = LINE_FEED; -static const char CARRIAGE_RETURN = static_cast(0x0d); // CR gets filtered out -static const char CR = CARRIAGE_RETURN; -static const char SINGLE_QUOTE = '\''; -static const char DOUBLE_QUOTE = '\"'; - -// Bunch of unicode info at: -// http://www.unicode.org/faq/utf_bom.html -// ef bb bf (Microsoft "lead bytes") - designates UTF-8 - -static const unsigned char TIXML_UTF_LEAD_0 = 0xefU; -static const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; -static const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; - -namespace tinyxml2 -{ - -struct Entity { - const char* pattern; - int length; - char value; -}; - -static const int NUM_ENTITIES = 5; -static const Entity entities[NUM_ENTITIES] = { - { "quot", 4, DOUBLE_QUOTE }, - { "amp", 3, '&' }, - { "apos", 4, SINGLE_QUOTE }, - { "lt", 2, '<' }, - { "gt", 2, '>' } -}; - - -StrPair::~StrPair() -{ - Reset(); -} - - -void StrPair::TransferTo( StrPair* other ) -{ - if ( this == other ) { - return; - } - // This in effect implements the assignment operator by "moving" - // ownership (as in auto_ptr). - - TIXMLASSERT( other != 0 ); - TIXMLASSERT( other->_flags == 0 ); - TIXMLASSERT( other->_start == 0 ); - TIXMLASSERT( other->_end == 0 ); - - other->Reset(); - - other->_flags = _flags; - other->_start = _start; - other->_end = _end; - - _flags = 0; - _start = 0; - _end = 0; -} - - -void StrPair::Reset() -{ - if ( _flags & NEEDS_DELETE ) { - delete [] _start; - } - _flags = 0; - _start = 0; - _end = 0; -} - - -void StrPair::SetStr( const char* str, int flags ) -{ - TIXMLASSERT( str ); - Reset(); - size_t len = strlen( str ); - TIXMLASSERT( _start == 0 ); - _start = new char[ len+1 ]; - memcpy( _start, str, len+1 ); - _end = _start + len; - _flags = flags | NEEDS_DELETE; -} - - -char* StrPair::ParseText( char* p, const char* endTag, int strFlags, int* curLineNumPtr ) -{ - TIXMLASSERT( p ); - TIXMLASSERT( endTag && *endTag ); - TIXMLASSERT(curLineNumPtr); - - char* start = p; - const char endChar = *endTag; - size_t length = strlen( endTag ); - - // Inner loop of text parsing. - while ( *p ) { - if ( *p == endChar && strncmp( p, endTag, length ) == 0 ) { - Set( start, p, strFlags ); - return p + length; - } else if (*p == '\n') { - ++(*curLineNumPtr); - } - ++p; - TIXMLASSERT( p ); - } - return 0; -} - - -char* StrPair::ParseName( char* p ) -{ - if ( !p || !(*p) ) { - return 0; - } - if ( !XMLUtil::IsNameStartChar( (unsigned char) *p ) ) { - return 0; - } - - char* const start = p; - ++p; - while ( *p && XMLUtil::IsNameChar( (unsigned char) *p ) ) { - ++p; - } - - Set( start, p, 0 ); - return p; -} - - -void StrPair::CollapseWhitespace() -{ - // Adjusting _start would cause undefined behavior on delete[] - TIXMLASSERT( ( _flags & NEEDS_DELETE ) == 0 ); - // Trim leading space. - _start = XMLUtil::SkipWhiteSpace( _start, 0 ); - - if ( *_start ) { - const char* p = _start; // the read pointer - char* q = _start; // the write pointer - - while( *p ) { - if ( XMLUtil::IsWhiteSpace( *p )) { - p = XMLUtil::SkipWhiteSpace( p, 0 ); - if ( *p == 0 ) { - break; // don't write to q; this trims the trailing space. - } - *q = ' '; - ++q; - } - *q = *p; - ++q; - ++p; - } - *q = 0; - } -} - - -const char* StrPair::GetStr() -{ - TIXMLASSERT( _start ); - TIXMLASSERT( _end ); - if ( _flags & NEEDS_FLUSH ) { - *_end = 0; - _flags ^= NEEDS_FLUSH; - - if ( _flags ) { - const char* p = _start; // the read pointer - char* q = _start; // the write pointer - - while( p < _end ) { - if ( (_flags & NEEDS_NEWLINE_NORMALIZATION) && *p == CR ) { - // CR-LF pair becomes LF - // CR alone becomes LF - // LF-CR becomes LF - if ( *(p+1) == LF ) { - p += 2; - } - else { - ++p; - } - *q = LF; - ++q; - } - else if ( (_flags & NEEDS_NEWLINE_NORMALIZATION) && *p == LF ) { - if ( *(p+1) == CR ) { - p += 2; - } - else { - ++p; - } - *q = LF; - ++q; - } - else if ( (_flags & NEEDS_ENTITY_PROCESSING) && *p == '&' ) { - // Entities handled by tinyXML2: - // - special entities in the entity table [in/out] - // - numeric character reference [in] - // 中 or 中 - - if ( *(p+1) == '#' ) { - const int buflen = 10; - char buf[buflen] = { 0 }; - int len = 0; - const char* adjusted = const_cast( XMLUtil::GetCharacterRef( p, buf, &len ) ); - if ( adjusted == 0 ) { - *q = *p; - ++p; - ++q; - } - else { - TIXMLASSERT( 0 <= len && len <= buflen ); - TIXMLASSERT( q + len <= adjusted ); - p = adjusted; - memcpy( q, buf, len ); - q += len; - } - } - else { - bool entityFound = false; - for( int i = 0; i < NUM_ENTITIES; ++i ) { - const Entity& entity = entities[i]; - if ( strncmp( p + 1, entity.pattern, entity.length ) == 0 - && *( p + entity.length + 1 ) == ';' ) { - // Found an entity - convert. - *q = entity.value; - ++q; - p += entity.length + 2; - entityFound = true; - break; - } - } - if ( !entityFound ) { - // fixme: treat as error? - ++p; - ++q; - } - } - } - else { - *q = *p; - ++p; - ++q; - } - } - *q = 0; - } - // The loop below has plenty going on, and this - // is a less useful mode. Break it out. - if ( _flags & NEEDS_WHITESPACE_COLLAPSING ) { - CollapseWhitespace(); - } - _flags = (_flags & NEEDS_DELETE); - } - TIXMLASSERT( _start ); - return _start; -} - - - - -// --------- XMLUtil ----------- // - -const char* XMLUtil::writeBoolTrue = "true"; -const char* XMLUtil::writeBoolFalse = "false"; - -void XMLUtil::SetBoolSerialization(const char* writeTrue, const char* writeFalse) -{ - static const char* defTrue = "true"; - static const char* defFalse = "false"; - - writeBoolTrue = (writeTrue) ? writeTrue : defTrue; - writeBoolFalse = (writeFalse) ? writeFalse : defFalse; -} - - -const char* XMLUtil::ReadBOM( const char* p, bool* bom ) -{ - TIXMLASSERT( p ); - TIXMLASSERT( bom ); - *bom = false; - const unsigned char* pu = reinterpret_cast(p); - // Check for BOM: - if ( *(pu+0) == TIXML_UTF_LEAD_0 - && *(pu+1) == TIXML_UTF_LEAD_1 - && *(pu+2) == TIXML_UTF_LEAD_2 ) { - *bom = true; - p += 3; - } - TIXMLASSERT( p ); - return p; -} - - -void XMLUtil::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) -{ - const unsigned long BYTE_MASK = 0xBF; - const unsigned long BYTE_MARK = 0x80; - const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; - - if (input < 0x80) { - *length = 1; - } - else if ( input < 0x800 ) { - *length = 2; - } - else if ( input < 0x10000 ) { - *length = 3; - } - else if ( input < 0x200000 ) { - *length = 4; - } - else { - *length = 0; // This code won't convert this correctly anyway. - return; - } - - output += *length; - - // Scary scary fall throughs are annotated with carefully designed comments - // to suppress compiler warnings such as -Wimplicit-fallthrough in gcc - switch (*length) { - case 4: - --output; - *output = static_cast((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - //fall through - case 3: - --output; - *output = static_cast((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - //fall through - case 2: - --output; - *output = static_cast((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - //fall through - case 1: - --output; - *output = static_cast(input | FIRST_BYTE_MARK[*length]); - break; - default: - TIXMLASSERT( false ); - } -} - - -const char* XMLUtil::GetCharacterRef( const char* p, char* value, int* length ) -{ - // Presume an entity, and pull it out. - *length = 0; - - if ( *(p+1) == '#' && *(p+2) ) { - unsigned long ucs = 0; - TIXMLASSERT( sizeof( ucs ) >= 4 ); - ptrdiff_t delta = 0; - unsigned mult = 1; - static const char SEMICOLON = ';'; - - if ( *(p+2) == 'x' ) { - // Hexadecimal. - const char* q = p+3; - if ( !(*q) ) { - return 0; - } - - q = strchr( q, SEMICOLON ); - - if ( !q ) { - return 0; - } - TIXMLASSERT( *q == SEMICOLON ); - - delta = q-p; - --q; - - while ( *q != 'x' ) { - unsigned int digit = 0; - - if ( *q >= '0' && *q <= '9' ) { - digit = *q - '0'; - } - else if ( *q >= 'a' && *q <= 'f' ) { - digit = *q - 'a' + 10; - } - else if ( *q >= 'A' && *q <= 'F' ) { - digit = *q - 'A' + 10; - } - else { - return 0; - } - TIXMLASSERT( digit < 16 ); - TIXMLASSERT( digit == 0 || mult <= UINT_MAX / digit ); - const unsigned int digitScaled = mult * digit; - TIXMLASSERT( ucs <= ULONG_MAX - digitScaled ); - ucs += digitScaled; - TIXMLASSERT( mult <= UINT_MAX / 16 ); - mult *= 16; - --q; - } - } - else { - // Decimal. - const char* q = p+2; - if ( !(*q) ) { - return 0; - } - - q = strchr( q, SEMICOLON ); - - if ( !q ) { - return 0; - } - TIXMLASSERT( *q == SEMICOLON ); - - delta = q-p; - --q; - - while ( *q != '#' ) { - if ( *q >= '0' && *q <= '9' ) { - const unsigned int digit = *q - '0'; - TIXMLASSERT( digit < 10 ); - TIXMLASSERT( digit == 0 || mult <= UINT_MAX / digit ); - const unsigned int digitScaled = mult * digit; - TIXMLASSERT( ucs <= ULONG_MAX - digitScaled ); - ucs += digitScaled; - } - else { - return 0; - } - TIXMLASSERT( mult <= UINT_MAX / 10 ); - mult *= 10; - --q; - } - } - // convert the UCS to UTF-8 - ConvertUTF32ToUTF8( ucs, value, length ); - return p + delta + 1; - } - return p+1; -} - - -void XMLUtil::ToStr( int v, char* buffer, int bufferSize ) -{ - TIXML_SNPRINTF( buffer, bufferSize, "%d", v ); -} - - -void XMLUtil::ToStr( unsigned v, char* buffer, int bufferSize ) -{ - TIXML_SNPRINTF( buffer, bufferSize, "%u", v ); -} - - -void XMLUtil::ToStr( bool v, char* buffer, int bufferSize ) -{ - TIXML_SNPRINTF( buffer, bufferSize, "%s", v ? writeBoolTrue : writeBoolFalse); -} - -/* - ToStr() of a number is a very tricky topic. - https://github.com/leethomason/tinyxml2/issues/106 -*/ -void XMLUtil::ToStr( float v, char* buffer, int bufferSize ) -{ - TIXML_SNPRINTF( buffer, bufferSize, "%.8g", v ); -} - - -void XMLUtil::ToStr( double v, char* buffer, int bufferSize ) -{ - TIXML_SNPRINTF( buffer, bufferSize, "%.17g", v ); -} - - -void XMLUtil::ToStr( int64_t v, char* buffer, int bufferSize ) -{ - // horrible syntax trick to make the compiler happy about %lld - TIXML_SNPRINTF(buffer, bufferSize, "%lld", static_cast(v)); -} - -void XMLUtil::ToStr( uint64_t v, char* buffer, int bufferSize ) -{ - // horrible syntax trick to make the compiler happy about %llu - TIXML_SNPRINTF(buffer, bufferSize, "%llu", (long long)v); -} - -bool XMLUtil::ToInt(const char* str, int* value) -{ - if (IsPrefixHex(str)) { - unsigned v; - if (TIXML_SSCANF(str, "%x", &v) == 1) { - *value = static_cast(v); - return true; - } - } - else { - if (TIXML_SSCANF(str, "%d", value) == 1) { - return true; - } - } - return false; -} - -bool XMLUtil::ToUnsigned(const char* str, unsigned* value) -{ - if (TIXML_SSCANF(str, IsPrefixHex(str) ? "%x" : "%u", value) == 1) { - return true; - } - return false; -} - -bool XMLUtil::ToBool( const char* str, bool* value ) -{ - int ival = 0; - if ( ToInt( str, &ival )) { - *value = (ival==0) ? false : true; - return true; - } - static const char* TRUE_VALS[] = { "true", "True", "TRUE", 0 }; - static const char* FALSE_VALS[] = { "false", "False", "FALSE", 0 }; - - for (int i = 0; TRUE_VALS[i]; ++i) { - if (StringEqual(str, TRUE_VALS[i])) { - *value = true; - return true; - } - } - for (int i = 0; FALSE_VALS[i]; ++i) { - if (StringEqual(str, FALSE_VALS[i])) { - *value = false; - return true; - } - } - return false; -} - - -bool XMLUtil::ToFloat( const char* str, float* value ) -{ - if ( TIXML_SSCANF( str, "%f", value ) == 1 ) { - return true; - } - return false; -} - - -bool XMLUtil::ToDouble( const char* str, double* value ) -{ - if ( TIXML_SSCANF( str, "%lf", value ) == 1 ) { - return true; - } - return false; -} - - -bool XMLUtil::ToInt64(const char* str, int64_t* value) -{ - if (IsPrefixHex(str)) { - unsigned long long v = 0; // horrible syntax trick to make the compiler happy about %llx - if (TIXML_SSCANF(str, "%llx", &v) == 1) { - *value = static_cast(v); - return true; - } - } - else { - long long v = 0; // horrible syntax trick to make the compiler happy about %lld - if (TIXML_SSCANF(str, "%lld", &v) == 1) { - *value = static_cast(v); - return true; - } - } - return false; -} - - -bool XMLUtil::ToUnsigned64(const char* str, uint64_t* value) { - unsigned long long v = 0; // horrible syntax trick to make the compiler happy about %llu - if(TIXML_SSCANF(str, IsPrefixHex(str) ? "%llx" : "%llu", &v) == 1) { - *value = (uint64_t)v; - return true; - } - return false; -} - - -char* XMLDocument::Identify( char* p, XMLNode** node ) -{ - TIXMLASSERT( node ); - TIXMLASSERT( p ); - char* const start = p; - int const startLine = _parseCurLineNum; - p = XMLUtil::SkipWhiteSpace( p, &_parseCurLineNum ); - if( !*p ) { - *node = 0; - TIXMLASSERT( p ); - return p; - } - - // These strings define the matching patterns: - static const char* xmlHeader = { "( _commentPool ); - returnNode->_parseLineNum = _parseCurLineNum; - p += xmlHeaderLen; - } - else if ( XMLUtil::StringEqual( p, commentHeader, commentHeaderLen ) ) { - returnNode = CreateUnlinkedNode( _commentPool ); - returnNode->_parseLineNum = _parseCurLineNum; - p += commentHeaderLen; - } - else if ( XMLUtil::StringEqual( p, cdataHeader, cdataHeaderLen ) ) { - XMLText* text = CreateUnlinkedNode( _textPool ); - returnNode = text; - returnNode->_parseLineNum = _parseCurLineNum; - p += cdataHeaderLen; - text->SetCData( true ); - } - else if ( XMLUtil::StringEqual( p, dtdHeader, dtdHeaderLen ) ) { - returnNode = CreateUnlinkedNode( _commentPool ); - returnNode->_parseLineNum = _parseCurLineNum; - p += dtdHeaderLen; - } - else if ( XMLUtil::StringEqual( p, elementHeader, elementHeaderLen ) ) { - returnNode = CreateUnlinkedNode( _elementPool ); - returnNode->_parseLineNum = _parseCurLineNum; - p += elementHeaderLen; - } - else { - returnNode = CreateUnlinkedNode( _textPool ); - returnNode->_parseLineNum = _parseCurLineNum; // Report line of first non-whitespace character - p = start; // Back it up, all the text counts. - _parseCurLineNum = startLine; - } - - TIXMLASSERT( returnNode ); - TIXMLASSERT( p ); - *node = returnNode; - return p; -} - - -bool XMLDocument::Accept( XMLVisitor* visitor ) const -{ - TIXMLASSERT( visitor ); - if ( visitor->VisitEnter( *this ) ) { - for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() ) { - if ( !node->Accept( visitor ) ) { - break; - } - } - } - return visitor->VisitExit( *this ); -} - - -// --------- XMLNode ----------- // - -XMLNode::XMLNode( XMLDocument* doc ) : - _document( doc ), - _parent( 0 ), - _value(), - _parseLineNum( 0 ), - _firstChild( 0 ), _lastChild( 0 ), - _prev( 0 ), _next( 0 ), - _userData( 0 ), - _memPool( 0 ) -{ -} - - -XMLNode::~XMLNode() -{ - DeleteChildren(); - if ( _parent ) { - _parent->Unlink( this ); - } -} - -const char* XMLNode::Value() const -{ - // Edge case: XMLDocuments don't have a Value. Return null. - if ( this->ToDocument() ) - return 0; - return _value.GetStr(); -} - -void XMLNode::SetValue( const char* str, bool staticMem ) -{ - if ( staticMem ) { - _value.SetInternedStr( str ); - } - else { - _value.SetStr( str ); - } -} - -XMLNode* XMLNode::DeepClone(XMLDocument* target) const -{ - XMLNode* clone = this->ShallowClone(target); - if (!clone) return 0; - - for (const XMLNode* child = this->FirstChild(); child; child = child->NextSibling()) { - XMLNode* childClone = child->DeepClone(target); - TIXMLASSERT(childClone); - clone->InsertEndChild(childClone); - } - return clone; -} - -void XMLNode::DeleteChildren() -{ - while( _firstChild ) { - TIXMLASSERT( _lastChild ); - DeleteChild( _firstChild ); - } - _firstChild = _lastChild = 0; -} - - -void XMLNode::Unlink( XMLNode* child ) -{ - TIXMLASSERT( child ); - TIXMLASSERT( child->_document == _document ); - TIXMLASSERT( child->_parent == this ); - if ( child == _firstChild ) { - _firstChild = _firstChild->_next; - } - if ( child == _lastChild ) { - _lastChild = _lastChild->_prev; - } - - if ( child->_prev ) { - child->_prev->_next = child->_next; - } - if ( child->_next ) { - child->_next->_prev = child->_prev; - } - child->_next = 0; - child->_prev = 0; - child->_parent = 0; -} - - -void XMLNode::DeleteChild( XMLNode* node ) -{ - TIXMLASSERT( node ); - TIXMLASSERT( node->_document == _document ); - TIXMLASSERT( node->_parent == this ); - Unlink( node ); - TIXMLASSERT(node->_prev == 0); - TIXMLASSERT(node->_next == 0); - TIXMLASSERT(node->_parent == 0); - DeleteNode( node ); -} - - -XMLNode* XMLNode::InsertEndChild( XMLNode* addThis ) -{ - TIXMLASSERT( addThis ); - if ( addThis->_document != _document ) { - TIXMLASSERT( false ); - return 0; - } - InsertChildPreamble( addThis ); - - if ( _lastChild ) { - TIXMLASSERT( _firstChild ); - TIXMLASSERT( _lastChild->_next == 0 ); - _lastChild->_next = addThis; - addThis->_prev = _lastChild; - _lastChild = addThis; - - addThis->_next = 0; - } - else { - TIXMLASSERT( _firstChild == 0 ); - _firstChild = _lastChild = addThis; - - addThis->_prev = 0; - addThis->_next = 0; - } - addThis->_parent = this; - return addThis; -} - - -XMLNode* XMLNode::InsertFirstChild( XMLNode* addThis ) -{ - TIXMLASSERT( addThis ); - if ( addThis->_document != _document ) { - TIXMLASSERT( false ); - return 0; - } - InsertChildPreamble( addThis ); - - if ( _firstChild ) { - TIXMLASSERT( _lastChild ); - TIXMLASSERT( _firstChild->_prev == 0 ); - - _firstChild->_prev = addThis; - addThis->_next = _firstChild; - _firstChild = addThis; - - addThis->_prev = 0; - } - else { - TIXMLASSERT( _lastChild == 0 ); - _firstChild = _lastChild = addThis; - - addThis->_prev = 0; - addThis->_next = 0; - } - addThis->_parent = this; - return addThis; -} - - -XMLNode* XMLNode::InsertAfterChild( XMLNode* afterThis, XMLNode* addThis ) -{ - TIXMLASSERT( addThis ); - if ( addThis->_document != _document ) { - TIXMLASSERT( false ); - return 0; - } - - TIXMLASSERT( afterThis ); - - if ( afterThis->_parent != this ) { - TIXMLASSERT( false ); - return 0; - } - if ( afterThis == addThis ) { - // Current state: BeforeThis -> AddThis -> OneAfterAddThis - // Now AddThis must disappear from it's location and then - // reappear between BeforeThis and OneAfterAddThis. - // So just leave it where it is. - return addThis; - } - - if ( afterThis->_next == 0 ) { - // The last node or the only node. - return InsertEndChild( addThis ); - } - InsertChildPreamble( addThis ); - addThis->_prev = afterThis; - addThis->_next = afterThis->_next; - afterThis->_next->_prev = addThis; - afterThis->_next = addThis; - addThis->_parent = this; - return addThis; -} - - - - -const XMLElement* XMLNode::FirstChildElement( const char* name ) const -{ - for( const XMLNode* node = _firstChild; node; node = node->_next ) { - const XMLElement* element = node->ToElementWithName( name ); - if ( element ) { - return element; - } - } - return 0; -} - - -const XMLElement* XMLNode::LastChildElement( const char* name ) const -{ - for( const XMLNode* node = _lastChild; node; node = node->_prev ) { - const XMLElement* element = node->ToElementWithName( name ); - if ( element ) { - return element; - } - } - return 0; -} - - -const XMLElement* XMLNode::NextSiblingElement( const char* name ) const -{ - for( const XMLNode* node = _next; node; node = node->_next ) { - const XMLElement* element = node->ToElementWithName( name ); - if ( element ) { - return element; - } - } - return 0; -} - - -const XMLElement* XMLNode::PreviousSiblingElement( const char* name ) const -{ - for( const XMLNode* node = _prev; node; node = node->_prev ) { - const XMLElement* element = node->ToElementWithName( name ); - if ( element ) { - return element; - } - } - return 0; -} - - -char* XMLNode::ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr ) -{ - // This is a recursive method, but thinking about it "at the current level" - // it is a pretty simple flat list: - // - // - // - // With a special case: - // - // - // - // - // Where the closing element (/foo) *must* be the next thing after the opening - // element, and the names must match. BUT the tricky bit is that the closing - // element will be read by the child. - // - // 'endTag' is the end tag for this node, it is returned by a call to a child. - // 'parentEnd' is the end tag for the parent, which is filled in and returned. - - XMLDocument::DepthTracker tracker(_document); - if (_document->Error()) - return 0; - - while( p && *p ) { - XMLNode* node = 0; - - p = _document->Identify( p, &node ); - TIXMLASSERT( p ); - if ( node == 0 ) { - break; - } - - const int initialLineNum = node->_parseLineNum; - - StrPair endTag; - p = node->ParseDeep( p, &endTag, curLineNumPtr ); - if ( !p ) { - DeleteNode( node ); - if ( !_document->Error() ) { - _document->SetError( XML_ERROR_PARSING, initialLineNum, 0); - } - break; - } - - const XMLDeclaration* const decl = node->ToDeclaration(); - if ( decl ) { - // Declarations are only allowed at document level - // - // Multiple declarations are allowed but all declarations - // must occur before anything else. - // - // Optimized due to a security test case. If the first node is - // a declaration, and the last node is a declaration, then only - // declarations have so far been added. - bool wellLocated = false; - - if (ToDocument()) { - if (FirstChild()) { - wellLocated = - FirstChild() && - FirstChild()->ToDeclaration() && - LastChild() && - LastChild()->ToDeclaration(); - } - else { - wellLocated = true; - } - } - if ( !wellLocated ) { - _document->SetError( XML_ERROR_PARSING_DECLARATION, initialLineNum, "XMLDeclaration value=%s", decl->Value()); - DeleteNode( node ); - break; - } - } - - XMLElement* ele = node->ToElement(); - if ( ele ) { - // We read the end tag. Return it to the parent. - if ( ele->ClosingType() == XMLElement::CLOSING ) { - if ( parentEndTag ) { - ele->_value.TransferTo( parentEndTag ); - } - node->_memPool->SetTracked(); // created and then immediately deleted. - DeleteNode( node ); - return p; - } - - // Handle an end tag returned to this level. - // And handle a bunch of annoying errors. - bool mismatch = false; - if ( endTag.Empty() ) { - if ( ele->ClosingType() == XMLElement::OPEN ) { - mismatch = true; - } - } - else { - if ( ele->ClosingType() != XMLElement::OPEN ) { - mismatch = true; - } - else if ( !XMLUtil::StringEqual( endTag.GetStr(), ele->Name() ) ) { - mismatch = true; - } - } - if ( mismatch ) { - _document->SetError( XML_ERROR_MISMATCHED_ELEMENT, initialLineNum, "XMLElement name=%s", ele->Name()); - DeleteNode( node ); - break; - } - } - InsertEndChild( node ); - } - return 0; -} - -/*static*/ void XMLNode::DeleteNode( XMLNode* node ) -{ - if ( node == 0 ) { - return; - } - TIXMLASSERT(node->_document); - if (!node->ToDocument()) { - node->_document->MarkInUse(node); - } - - MemPool* pool = node->_memPool; - node->~XMLNode(); - pool->Free( node ); -} - -void XMLNode::InsertChildPreamble( XMLNode* insertThis ) const -{ - TIXMLASSERT( insertThis ); - TIXMLASSERT( insertThis->_document == _document ); - - if (insertThis->_parent) { - insertThis->_parent->Unlink( insertThis ); - } - else { - insertThis->_document->MarkInUse(insertThis); - insertThis->_memPool->SetTracked(); - } -} - -const XMLElement* XMLNode::ToElementWithName( const char* name ) const -{ - const XMLElement* element = this->ToElement(); - if ( element == 0 ) { - return 0; - } - if ( name == 0 ) { - return element; - } - if ( XMLUtil::StringEqual( element->Name(), name ) ) { - return element; - } - return 0; -} - -// --------- XMLText ---------- // -char* XMLText::ParseDeep( char* p, StrPair*, int* curLineNumPtr ) -{ - if ( this->CData() ) { - p = _value.ParseText( p, "]]>", StrPair::NEEDS_NEWLINE_NORMALIZATION, curLineNumPtr ); - if ( !p ) { - _document->SetError( XML_ERROR_PARSING_CDATA, _parseLineNum, 0 ); - } - return p; - } - else { - int flags = _document->ProcessEntities() ? StrPair::TEXT_ELEMENT : StrPair::TEXT_ELEMENT_LEAVE_ENTITIES; - if ( _document->WhitespaceMode() == COLLAPSE_WHITESPACE ) { - flags |= StrPair::NEEDS_WHITESPACE_COLLAPSING; - } - - p = _value.ParseText( p, "<", flags, curLineNumPtr ); - if ( p && *p ) { - return p-1; - } - if ( !p ) { - _document->SetError( XML_ERROR_PARSING_TEXT, _parseLineNum, 0 ); - } - } - return 0; -} - - -XMLNode* XMLText::ShallowClone( XMLDocument* doc ) const -{ - if ( !doc ) { - doc = _document; - } - XMLText* text = doc->NewText( Value() ); // fixme: this will always allocate memory. Intern? - text->SetCData( this->CData() ); - return text; -} - - -bool XMLText::ShallowEqual( const XMLNode* compare ) const -{ - TIXMLASSERT( compare ); - const XMLText* text = compare->ToText(); - return ( text && XMLUtil::StringEqual( text->Value(), Value() ) ); -} - - -bool XMLText::Accept( XMLVisitor* visitor ) const -{ - TIXMLASSERT( visitor ); - return visitor->Visit( *this ); -} - - -// --------- XMLComment ---------- // - -XMLComment::XMLComment( XMLDocument* doc ) : XMLNode( doc ) -{ -} - - -XMLComment::~XMLComment() -{ -} - - -char* XMLComment::ParseDeep( char* p, StrPair*, int* curLineNumPtr ) -{ - // Comment parses as text. - p = _value.ParseText( p, "-->", StrPair::COMMENT, curLineNumPtr ); - if ( p == 0 ) { - _document->SetError( XML_ERROR_PARSING_COMMENT, _parseLineNum, 0 ); - } - return p; -} - - -XMLNode* XMLComment::ShallowClone( XMLDocument* doc ) const -{ - if ( !doc ) { - doc = _document; - } - XMLComment* comment = doc->NewComment( Value() ); // fixme: this will always allocate memory. Intern? - return comment; -} - - -bool XMLComment::ShallowEqual( const XMLNode* compare ) const -{ - TIXMLASSERT( compare ); - const XMLComment* comment = compare->ToComment(); - return ( comment && XMLUtil::StringEqual( comment->Value(), Value() )); -} - - -bool XMLComment::Accept( XMLVisitor* visitor ) const -{ - TIXMLASSERT( visitor ); - return visitor->Visit( *this ); -} - - -// --------- XMLDeclaration ---------- // - -XMLDeclaration::XMLDeclaration( XMLDocument* doc ) : XMLNode( doc ) -{ -} - - -XMLDeclaration::~XMLDeclaration() -{ - //printf( "~XMLDeclaration\n" ); -} - - -char* XMLDeclaration::ParseDeep( char* p, StrPair*, int* curLineNumPtr ) -{ - // Declaration parses as text. - p = _value.ParseText( p, "?>", StrPair::NEEDS_NEWLINE_NORMALIZATION, curLineNumPtr ); - if ( p == 0 ) { - _document->SetError( XML_ERROR_PARSING_DECLARATION, _parseLineNum, 0 ); - } - return p; -} - - -XMLNode* XMLDeclaration::ShallowClone( XMLDocument* doc ) const -{ - if ( !doc ) { - doc = _document; - } - XMLDeclaration* dec = doc->NewDeclaration( Value() ); // fixme: this will always allocate memory. Intern? - return dec; -} - - -bool XMLDeclaration::ShallowEqual( const XMLNode* compare ) const -{ - TIXMLASSERT( compare ); - const XMLDeclaration* declaration = compare->ToDeclaration(); - return ( declaration && XMLUtil::StringEqual( declaration->Value(), Value() )); -} - - - -bool XMLDeclaration::Accept( XMLVisitor* visitor ) const -{ - TIXMLASSERT( visitor ); - return visitor->Visit( *this ); -} - -// --------- XMLUnknown ---------- // - -XMLUnknown::XMLUnknown( XMLDocument* doc ) : XMLNode( doc ) -{ -} - - -XMLUnknown::~XMLUnknown() -{ -} - - -char* XMLUnknown::ParseDeep( char* p, StrPair*, int* curLineNumPtr ) -{ - // Unknown parses as text. - p = _value.ParseText( p, ">", StrPair::NEEDS_NEWLINE_NORMALIZATION, curLineNumPtr ); - if ( !p ) { - _document->SetError( XML_ERROR_PARSING_UNKNOWN, _parseLineNum, 0 ); - } - return p; -} - - -XMLNode* XMLUnknown::ShallowClone( XMLDocument* doc ) const -{ - if ( !doc ) { - doc = _document; - } - XMLUnknown* text = doc->NewUnknown( Value() ); // fixme: this will always allocate memory. Intern? - return text; -} - - -bool XMLUnknown::ShallowEqual( const XMLNode* compare ) const -{ - TIXMLASSERT( compare ); - const XMLUnknown* unknown = compare->ToUnknown(); - return ( unknown && XMLUtil::StringEqual( unknown->Value(), Value() )); -} - - -bool XMLUnknown::Accept( XMLVisitor* visitor ) const -{ - TIXMLASSERT( visitor ); - return visitor->Visit( *this ); -} - -// --------- XMLAttribute ---------- // - -const char* XMLAttribute::Name() const -{ - return _name.GetStr(); -} - -const char* XMLAttribute::Value() const -{ - return _value.GetStr(); -} - -char* XMLAttribute::ParseDeep( char* p, bool processEntities, int* curLineNumPtr ) -{ - // Parse using the name rules: bug fix, was using ParseText before - p = _name.ParseName( p ); - if ( !p || !*p ) { - return 0; - } - - // Skip white space before = - p = XMLUtil::SkipWhiteSpace( p, curLineNumPtr ); - if ( *p != '=' ) { - return 0; - } - - ++p; // move up to opening quote - p = XMLUtil::SkipWhiteSpace( p, curLineNumPtr ); - if ( *p != '\"' && *p != '\'' ) { - return 0; - } - - const char endTag[2] = { *p, 0 }; - ++p; // move past opening quote - - p = _value.ParseText( p, endTag, processEntities ? StrPair::ATTRIBUTE_VALUE : StrPair::ATTRIBUTE_VALUE_LEAVE_ENTITIES, curLineNumPtr ); - return p; -} - - -void XMLAttribute::SetName( const char* n ) -{ - _name.SetStr( n ); -} - - -XMLError XMLAttribute::QueryIntValue( int* value ) const -{ - if ( XMLUtil::ToInt( Value(), value )) { - return XML_SUCCESS; - } - return XML_WRONG_ATTRIBUTE_TYPE; -} - - -XMLError XMLAttribute::QueryUnsignedValue( unsigned int* value ) const -{ - if ( XMLUtil::ToUnsigned( Value(), value )) { - return XML_SUCCESS; - } - return XML_WRONG_ATTRIBUTE_TYPE; -} - - -XMLError XMLAttribute::QueryInt64Value(int64_t* value) const -{ - if (XMLUtil::ToInt64(Value(), value)) { - return XML_SUCCESS; - } - return XML_WRONG_ATTRIBUTE_TYPE; -} - - -XMLError XMLAttribute::QueryUnsigned64Value(uint64_t* value) const -{ - if(XMLUtil::ToUnsigned64(Value(), value)) { - return XML_SUCCESS; - } - return XML_WRONG_ATTRIBUTE_TYPE; -} - - -XMLError XMLAttribute::QueryBoolValue( bool* value ) const -{ - if ( XMLUtil::ToBool( Value(), value )) { - return XML_SUCCESS; - } - return XML_WRONG_ATTRIBUTE_TYPE; -} - - -XMLError XMLAttribute::QueryFloatValue( float* value ) const -{ - if ( XMLUtil::ToFloat( Value(), value )) { - return XML_SUCCESS; - } - return XML_WRONG_ATTRIBUTE_TYPE; -} - - -XMLError XMLAttribute::QueryDoubleValue( double* value ) const -{ - if ( XMLUtil::ToDouble( Value(), value )) { - return XML_SUCCESS; - } - return XML_WRONG_ATTRIBUTE_TYPE; -} - - -void XMLAttribute::SetAttribute( const char* v ) -{ - _value.SetStr( v ); -} - - -void XMLAttribute::SetAttribute( int v ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( v, buf, BUF_SIZE ); - _value.SetStr( buf ); -} - - -void XMLAttribute::SetAttribute( unsigned v ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( v, buf, BUF_SIZE ); - _value.SetStr( buf ); -} - - -void XMLAttribute::SetAttribute(int64_t v) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr(v, buf, BUF_SIZE); - _value.SetStr(buf); -} - -void XMLAttribute::SetAttribute(uint64_t v) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr(v, buf, BUF_SIZE); - _value.SetStr(buf); -} - - -void XMLAttribute::SetAttribute( bool v ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( v, buf, BUF_SIZE ); - _value.SetStr( buf ); -} - -void XMLAttribute::SetAttribute( double v ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( v, buf, BUF_SIZE ); - _value.SetStr( buf ); -} - -void XMLAttribute::SetAttribute( float v ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( v, buf, BUF_SIZE ); - _value.SetStr( buf ); -} - - -// --------- XMLElement ---------- // -XMLElement::XMLElement( XMLDocument* doc ) : XMLNode( doc ), - _closingType( OPEN ), - _rootAttribute( 0 ) -{ -} - - -XMLElement::~XMLElement() -{ - while( _rootAttribute ) { - XMLAttribute* next = _rootAttribute->_next; - DeleteAttribute( _rootAttribute ); - _rootAttribute = next; - } -} - - -const XMLAttribute* XMLElement::FindAttribute( const char* name ) const -{ - for( XMLAttribute* a = _rootAttribute; a; a = a->_next ) { - if ( XMLUtil::StringEqual( a->Name(), name ) ) { - return a; - } - } - return 0; -} - - -const char* XMLElement::Attribute( const char* name, const char* value ) const -{ - const XMLAttribute* a = FindAttribute( name ); - if ( !a ) { - return 0; - } - if ( !value || XMLUtil::StringEqual( a->Value(), value )) { - return a->Value(); - } - return 0; -} - -int XMLElement::IntAttribute(const char* name, int defaultValue) const -{ - int i = defaultValue; - QueryIntAttribute(name, &i); - return i; -} - -unsigned XMLElement::UnsignedAttribute(const char* name, unsigned defaultValue) const -{ - unsigned i = defaultValue; - QueryUnsignedAttribute(name, &i); - return i; -} - -int64_t XMLElement::Int64Attribute(const char* name, int64_t defaultValue) const -{ - int64_t i = defaultValue; - QueryInt64Attribute(name, &i); - return i; -} - -uint64_t XMLElement::Unsigned64Attribute(const char* name, uint64_t defaultValue) const -{ - uint64_t i = defaultValue; - QueryUnsigned64Attribute(name, &i); - return i; -} - -bool XMLElement::BoolAttribute(const char* name, bool defaultValue) const -{ - bool b = defaultValue; - QueryBoolAttribute(name, &b); - return b; -} - -double XMLElement::DoubleAttribute(const char* name, double defaultValue) const -{ - double d = defaultValue; - QueryDoubleAttribute(name, &d); - return d; -} - -float XMLElement::FloatAttribute(const char* name, float defaultValue) const -{ - float f = defaultValue; - QueryFloatAttribute(name, &f); - return f; -} - -const char* XMLElement::GetText() const -{ - /* skip comment node */ - const XMLNode* node = FirstChild(); - while (node) { - if (node->ToComment()) { - node = node->NextSibling(); - continue; - } - break; - } - - if ( node && node->ToText() ) { - return node->Value(); - } - return 0; -} - - -void XMLElement::SetText( const char* inText ) -{ - if ( FirstChild() && FirstChild()->ToText() ) - FirstChild()->SetValue( inText ); - else { - XMLText* theText = GetDocument()->NewText( inText ); - InsertFirstChild( theText ); - } -} - - -void XMLElement::SetText( int v ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( v, buf, BUF_SIZE ); - SetText( buf ); -} - - -void XMLElement::SetText( unsigned v ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( v, buf, BUF_SIZE ); - SetText( buf ); -} - - -void XMLElement::SetText(int64_t v) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr(v, buf, BUF_SIZE); - SetText(buf); -} - -void XMLElement::SetText(uint64_t v) { - char buf[BUF_SIZE]; - XMLUtil::ToStr(v, buf, BUF_SIZE); - SetText(buf); -} - - -void XMLElement::SetText( bool v ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( v, buf, BUF_SIZE ); - SetText( buf ); -} - - -void XMLElement::SetText( float v ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( v, buf, BUF_SIZE ); - SetText( buf ); -} - - -void XMLElement::SetText( double v ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( v, buf, BUF_SIZE ); - SetText( buf ); -} - - -XMLError XMLElement::QueryIntText( int* ival ) const -{ - if ( FirstChild() && FirstChild()->ToText() ) { - const char* t = FirstChild()->Value(); - if ( XMLUtil::ToInt( t, ival ) ) { - return XML_SUCCESS; - } - return XML_CAN_NOT_CONVERT_TEXT; - } - return XML_NO_TEXT_NODE; -} - - -XMLError XMLElement::QueryUnsignedText( unsigned* uval ) const -{ - if ( FirstChild() && FirstChild()->ToText() ) { - const char* t = FirstChild()->Value(); - if ( XMLUtil::ToUnsigned( t, uval ) ) { - return XML_SUCCESS; - } - return XML_CAN_NOT_CONVERT_TEXT; - } - return XML_NO_TEXT_NODE; -} - - -XMLError XMLElement::QueryInt64Text(int64_t* ival) const -{ - if (FirstChild() && FirstChild()->ToText()) { - const char* t = FirstChild()->Value(); - if (XMLUtil::ToInt64(t, ival)) { - return XML_SUCCESS; - } - return XML_CAN_NOT_CONVERT_TEXT; - } - return XML_NO_TEXT_NODE; -} - - -XMLError XMLElement::QueryUnsigned64Text(uint64_t* ival) const -{ - if(FirstChild() && FirstChild()->ToText()) { - const char* t = FirstChild()->Value(); - if(XMLUtil::ToUnsigned64(t, ival)) { - return XML_SUCCESS; - } - return XML_CAN_NOT_CONVERT_TEXT; - } - return XML_NO_TEXT_NODE; -} - - -XMLError XMLElement::QueryBoolText( bool* bval ) const -{ - if ( FirstChild() && FirstChild()->ToText() ) { - const char* t = FirstChild()->Value(); - if ( XMLUtil::ToBool( t, bval ) ) { - return XML_SUCCESS; - } - return XML_CAN_NOT_CONVERT_TEXT; - } - return XML_NO_TEXT_NODE; -} - - -XMLError XMLElement::QueryDoubleText( double* dval ) const -{ - if ( FirstChild() && FirstChild()->ToText() ) { - const char* t = FirstChild()->Value(); - if ( XMLUtil::ToDouble( t, dval ) ) { - return XML_SUCCESS; - } - return XML_CAN_NOT_CONVERT_TEXT; - } - return XML_NO_TEXT_NODE; -} - - -XMLError XMLElement::QueryFloatText( float* fval ) const -{ - if ( FirstChild() && FirstChild()->ToText() ) { - const char* t = FirstChild()->Value(); - if ( XMLUtil::ToFloat( t, fval ) ) { - return XML_SUCCESS; - } - return XML_CAN_NOT_CONVERT_TEXT; - } - return XML_NO_TEXT_NODE; -} - -int XMLElement::IntText(int defaultValue) const -{ - int i = defaultValue; - QueryIntText(&i); - return i; -} - -unsigned XMLElement::UnsignedText(unsigned defaultValue) const -{ - unsigned i = defaultValue; - QueryUnsignedText(&i); - return i; -} - -int64_t XMLElement::Int64Text(int64_t defaultValue) const -{ - int64_t i = defaultValue; - QueryInt64Text(&i); - return i; -} - -uint64_t XMLElement::Unsigned64Text(uint64_t defaultValue) const -{ - uint64_t i = defaultValue; - QueryUnsigned64Text(&i); - return i; -} - -bool XMLElement::BoolText(bool defaultValue) const -{ - bool b = defaultValue; - QueryBoolText(&b); - return b; -} - -double XMLElement::DoubleText(double defaultValue) const -{ - double d = defaultValue; - QueryDoubleText(&d); - return d; -} - -float XMLElement::FloatText(float defaultValue) const -{ - float f = defaultValue; - QueryFloatText(&f); - return f; -} - - -XMLAttribute* XMLElement::FindOrCreateAttribute( const char* name ) -{ - XMLAttribute* last = 0; - XMLAttribute* attrib = 0; - for( attrib = _rootAttribute; - attrib; - last = attrib, attrib = attrib->_next ) { - if ( XMLUtil::StringEqual( attrib->Name(), name ) ) { - break; - } - } - if ( !attrib ) { - attrib = CreateAttribute(); - TIXMLASSERT( attrib ); - if ( last ) { - TIXMLASSERT( last->_next == 0 ); - last->_next = attrib; - } - else { - TIXMLASSERT( _rootAttribute == 0 ); - _rootAttribute = attrib; - } - attrib->SetName( name ); - } - return attrib; -} - - -void XMLElement::DeleteAttribute( const char* name ) -{ - XMLAttribute* prev = 0; - for( XMLAttribute* a=_rootAttribute; a; a=a->_next ) { - if ( XMLUtil::StringEqual( name, a->Name() ) ) { - if ( prev ) { - prev->_next = a->_next; - } - else { - _rootAttribute = a->_next; - } - DeleteAttribute( a ); - break; - } - prev = a; - } -} - - -char* XMLElement::ParseAttributes( char* p, int* curLineNumPtr ) -{ - XMLAttribute* prevAttribute = 0; - - // Read the attributes. - while( p ) { - p = XMLUtil::SkipWhiteSpace( p, curLineNumPtr ); - if ( !(*p) ) { - _document->SetError( XML_ERROR_PARSING_ELEMENT, _parseLineNum, "XMLElement name=%s", Name() ); - return 0; - } - - // attribute. - if (XMLUtil::IsNameStartChar( (unsigned char) *p ) ) { - XMLAttribute* attrib = CreateAttribute(); - TIXMLASSERT( attrib ); - attrib->_parseLineNum = _document->_parseCurLineNum; - - const int attrLineNum = attrib->_parseLineNum; - - p = attrib->ParseDeep( p, _document->ProcessEntities(), curLineNumPtr ); - if ( !p || Attribute( attrib->Name() ) ) { - DeleteAttribute( attrib ); - _document->SetError( XML_ERROR_PARSING_ATTRIBUTE, attrLineNum, "XMLElement name=%s", Name() ); - return 0; - } - // There is a minor bug here: if the attribute in the source xml - // document is duplicated, it will not be detected and the - // attribute will be doubly added. However, tracking the 'prevAttribute' - // avoids re-scanning the attribute list. Preferring performance for - // now, may reconsider in the future. - if ( prevAttribute ) { - TIXMLASSERT( prevAttribute->_next == 0 ); - prevAttribute->_next = attrib; - } - else { - TIXMLASSERT( _rootAttribute == 0 ); - _rootAttribute = attrib; - } - prevAttribute = attrib; - } - // end of the tag - else if ( *p == '>' ) { - ++p; - break; - } - // end of the tag - else if ( *p == '/' && *(p+1) == '>' ) { - _closingType = CLOSED; - return p+2; // done; sealed element. - } - else { - _document->SetError( XML_ERROR_PARSING_ELEMENT, _parseLineNum, 0 ); - return 0; - } - } - return p; -} - -void XMLElement::DeleteAttribute( XMLAttribute* attribute ) -{ - if ( attribute == 0 ) { - return; - } - MemPool* pool = attribute->_memPool; - attribute->~XMLAttribute(); - pool->Free( attribute ); -} - -XMLAttribute* XMLElement::CreateAttribute() -{ - TIXMLASSERT( sizeof( XMLAttribute ) == _document->_attributePool.ItemSize() ); - XMLAttribute* attrib = new (_document->_attributePool.Alloc() ) XMLAttribute(); - TIXMLASSERT( attrib ); - attrib->_memPool = &_document->_attributePool; - attrib->_memPool->SetTracked(); - return attrib; -} - - -XMLElement* XMLElement::InsertNewChildElement(const char* name) -{ - XMLElement* node = _document->NewElement(name); - return InsertEndChild(node) ? node : 0; -} - -XMLComment* XMLElement::InsertNewComment(const char* comment) -{ - XMLComment* node = _document->NewComment(comment); - return InsertEndChild(node) ? node : 0; -} - -XMLText* XMLElement::InsertNewText(const char* text) -{ - XMLText* node = _document->NewText(text); - return InsertEndChild(node) ? node : 0; -} - -XMLDeclaration* XMLElement::InsertNewDeclaration(const char* text) -{ - XMLDeclaration* node = _document->NewDeclaration(text); - return InsertEndChild(node) ? node : 0; -} - -XMLUnknown* XMLElement::InsertNewUnknown(const char* text) -{ - XMLUnknown* node = _document->NewUnknown(text); - return InsertEndChild(node) ? node : 0; -} - - - -// -// -// foobar -// -char* XMLElement::ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr ) -{ - // Read the element name. - p = XMLUtil::SkipWhiteSpace( p, curLineNumPtr ); - - // The closing element is the form. It is - // parsed just like a regular element then deleted from - // the DOM. - if ( *p == '/' ) { - _closingType = CLOSING; - ++p; - } - - p = _value.ParseName( p ); - if ( _value.Empty() ) { - return 0; - } - - p = ParseAttributes( p, curLineNumPtr ); - if ( !p || !*p || _closingType != OPEN ) { - return p; - } - - p = XMLNode::ParseDeep( p, parentEndTag, curLineNumPtr ); - return p; -} - - - -XMLNode* XMLElement::ShallowClone( XMLDocument* doc ) const -{ - if ( !doc ) { - doc = _document; - } - XMLElement* element = doc->NewElement( Value() ); // fixme: this will always allocate memory. Intern? - for( const XMLAttribute* a=FirstAttribute(); a; a=a->Next() ) { - element->SetAttribute( a->Name(), a->Value() ); // fixme: this will always allocate memory. Intern? - } - return element; -} - - -bool XMLElement::ShallowEqual( const XMLNode* compare ) const -{ - TIXMLASSERT( compare ); - const XMLElement* other = compare->ToElement(); - if ( other && XMLUtil::StringEqual( other->Name(), Name() )) { - - const XMLAttribute* a=FirstAttribute(); - const XMLAttribute* b=other->FirstAttribute(); - - while ( a && b ) { - if ( !XMLUtil::StringEqual( a->Value(), b->Value() ) ) { - return false; - } - a = a->Next(); - b = b->Next(); - } - if ( a || b ) { - // different count - return false; - } - return true; - } - return false; -} - - -bool XMLElement::Accept( XMLVisitor* visitor ) const -{ - TIXMLASSERT( visitor ); - if ( visitor->VisitEnter( *this, _rootAttribute ) ) { - for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() ) { - if ( !node->Accept( visitor ) ) { - break; - } - } - } - return visitor->VisitExit( *this ); -} - - -// --------- XMLDocument ----------- // - -// Warning: List must match 'enum XMLError' -const char* XMLDocument::_errorNames[XML_ERROR_COUNT] = { - "XML_SUCCESS", - "XML_NO_ATTRIBUTE", - "XML_WRONG_ATTRIBUTE_TYPE", - "XML_ERROR_FILE_NOT_FOUND", - "XML_ERROR_FILE_COULD_NOT_BE_OPENED", - "XML_ERROR_FILE_READ_ERROR", - "XML_ERROR_PARSING_ELEMENT", - "XML_ERROR_PARSING_ATTRIBUTE", - "XML_ERROR_PARSING_TEXT", - "XML_ERROR_PARSING_CDATA", - "XML_ERROR_PARSING_COMMENT", - "XML_ERROR_PARSING_DECLARATION", - "XML_ERROR_PARSING_UNKNOWN", - "XML_ERROR_EMPTY_DOCUMENT", - "XML_ERROR_MISMATCHED_ELEMENT", - "XML_ERROR_PARSING", - "XML_CAN_NOT_CONVERT_TEXT", - "XML_NO_TEXT_NODE", - "XML_ELEMENT_DEPTH_EXCEEDED" -}; - - -XMLDocument::XMLDocument( bool processEntities, Whitespace whitespaceMode ) : - XMLNode( 0 ), - _writeBOM( false ), - _processEntities( processEntities ), - _errorID(XML_SUCCESS), - _whitespaceMode( whitespaceMode ), - _errorStr(), - _errorLineNum( 0 ), - _charBuffer( 0 ), - _parseCurLineNum( 0 ), - _parsingDepth(0), - _unlinked(), - _elementPool(), - _attributePool(), - _textPool(), - _commentPool() -{ - // avoid VC++ C4355 warning about 'this' in initializer list (C4355 is off by default in VS2012+) - _document = this; -} - - -XMLDocument::~XMLDocument() -{ - Clear(); -} - - -void XMLDocument::MarkInUse(const XMLNode* const node) -{ - TIXMLASSERT(node); - TIXMLASSERT(node->_parent == 0); - - for (int i = 0; i < _unlinked.Size(); ++i) { - if (node == _unlinked[i]) { - _unlinked.SwapRemove(i); - break; - } - } -} - -void XMLDocument::Clear() -{ - DeleteChildren(); - while( _unlinked.Size()) { - DeleteNode(_unlinked[0]); // Will remove from _unlinked as part of delete. - } - -#ifdef TINYXML2_DEBUG - const bool hadError = Error(); -#endif - ClearError(); - - delete [] _charBuffer; - _charBuffer = 0; - _parsingDepth = 0; - -#if 0 - _textPool.Trace( "text" ); - _elementPool.Trace( "element" ); - _commentPool.Trace( "comment" ); - _attributePool.Trace( "attribute" ); -#endif - -#ifdef TINYXML2_DEBUG - if ( !hadError ) { - TIXMLASSERT( _elementPool.CurrentAllocs() == _elementPool.Untracked() ); - TIXMLASSERT( _attributePool.CurrentAllocs() == _attributePool.Untracked() ); - TIXMLASSERT( _textPool.CurrentAllocs() == _textPool.Untracked() ); - TIXMLASSERT( _commentPool.CurrentAllocs() == _commentPool.Untracked() ); - } -#endif -} - - -void XMLDocument::DeepCopy(XMLDocument* target) const -{ - TIXMLASSERT(target); - if (target == this) { - return; // technically success - a no-op. - } - - target->Clear(); - for (const XMLNode* node = this->FirstChild(); node; node = node->NextSibling()) { - target->InsertEndChild(node->DeepClone(target)); - } -} - -XMLElement* XMLDocument::NewElement( const char* name ) -{ - XMLElement* ele = CreateUnlinkedNode( _elementPool ); - ele->SetName( name ); - return ele; -} - - -XMLComment* XMLDocument::NewComment( const char* str ) -{ - XMLComment* comment = CreateUnlinkedNode( _commentPool ); - comment->SetValue( str ); - return comment; -} - - -XMLText* XMLDocument::NewText( const char* str ) -{ - XMLText* text = CreateUnlinkedNode( _textPool ); - text->SetValue( str ); - return text; -} - - -XMLDeclaration* XMLDocument::NewDeclaration( const char* str ) -{ - XMLDeclaration* dec = CreateUnlinkedNode( _commentPool ); - dec->SetValue( str ? str : "xml version=\"1.0\" encoding=\"UTF-8\"" ); - return dec; -} - - -XMLUnknown* XMLDocument::NewUnknown( const char* str ) -{ - XMLUnknown* unk = CreateUnlinkedNode( _commentPool ); - unk->SetValue( str ); - return unk; -} - -static FILE* callfopen( const char* filepath, const char* mode ) -{ - TIXMLASSERT( filepath ); - TIXMLASSERT( mode ); -#if defined(_MSC_VER) && (_MSC_VER >= 1400 ) && (!defined WINCE) - FILE* fp = 0; - const errno_t err = fopen_s( &fp, filepath, mode ); - if ( err ) { - return 0; - } -#else - FILE* fp = fopen( filepath, mode ); -#endif - return fp; -} - -void XMLDocument::DeleteNode( XMLNode* node ) { - TIXMLASSERT( node ); - TIXMLASSERT(node->_document == this ); - if (node->_parent) { - node->_parent->DeleteChild( node ); - } - else { - // Isn't in the tree. - // Use the parent delete. - // Also, we need to mark it tracked: we 'know' - // it was never used. - node->_memPool->SetTracked(); - // Call the static XMLNode version: - XMLNode::DeleteNode(node); - } -} - - -XMLError XMLDocument::LoadFile( const char* filename ) -{ - if ( !filename ) { - TIXMLASSERT( false ); - SetError( XML_ERROR_FILE_COULD_NOT_BE_OPENED, 0, "filename=" ); - return _errorID; - } - - Clear(); - FILE* fp = callfopen( filename, "rb" ); - if ( !fp ) { - SetError( XML_ERROR_FILE_NOT_FOUND, 0, "filename=%s", filename ); - return _errorID; - } - LoadFile( fp ); - fclose( fp ); - return _errorID; -} - -XMLError XMLDocument::LoadFile( FILE* fp ) -{ - Clear(); - - TIXML_FSEEK( fp, 0, SEEK_SET ); - if ( fgetc( fp ) == EOF && ferror( fp ) != 0 ) { - SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 ); - return _errorID; - } - - TIXML_FSEEK( fp, 0, SEEK_END ); - - unsigned long long filelength; - { - const long long fileLengthSigned = TIXML_FTELL( fp ); - TIXML_FSEEK( fp, 0, SEEK_SET ); - if ( fileLengthSigned == -1L ) { - SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 ); - return _errorID; - } - TIXMLASSERT( fileLengthSigned >= 0 ); - filelength = static_cast(fileLengthSigned); - } - - const size_t maxSizeT = static_cast(-1); - // We'll do the comparison as an unsigned long long, because that's guaranteed to be at - // least 8 bytes, even on a 32-bit platform. - if ( filelength >= static_cast(maxSizeT) ) { - // Cannot handle files which won't fit in buffer together with null terminator - SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 ); - return _errorID; - } - - if ( filelength == 0 ) { - SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); - return _errorID; - } - - const size_t size = static_cast(filelength); - TIXMLASSERT( _charBuffer == 0 ); - _charBuffer = new char[size+1]; - const size_t read = fread( _charBuffer, 1, size, fp ); - if ( read != size ) { - SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 ); - return _errorID; - } - - _charBuffer[size] = 0; - - Parse(); - return _errorID; -} - - -XMLError XMLDocument::SaveFile( const char* filename, bool compact ) -{ - if ( !filename ) { - TIXMLASSERT( false ); - SetError( XML_ERROR_FILE_COULD_NOT_BE_OPENED, 0, "filename=" ); - return _errorID; - } - - FILE* fp = callfopen( filename, "w" ); - if ( !fp ) { - SetError( XML_ERROR_FILE_COULD_NOT_BE_OPENED, 0, "filename=%s", filename ); - return _errorID; - } - SaveFile(fp, compact); - fclose( fp ); - return _errorID; -} - - -XMLError XMLDocument::SaveFile( FILE* fp, bool compact ) -{ - // Clear any error from the last save, otherwise it will get reported - // for *this* call. - ClearError(); - XMLPrinter stream( fp, compact ); - Print( &stream ); - return _errorID; -} - - -XMLError XMLDocument::Parse( const char* p, size_t len ) -{ - Clear(); - - if ( len == 0 || !p || !*p ) { - SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); - return _errorID; - } - if ( len == static_cast(-1) ) { - len = strlen( p ); - } - TIXMLASSERT( _charBuffer == 0 ); - _charBuffer = new char[ len+1 ]; - memcpy( _charBuffer, p, len ); - _charBuffer[len] = 0; - - Parse(); - if ( Error() ) { - // clean up now essentially dangling memory. - // and the parse fail can put objects in the - // pools that are dead and inaccessible. - DeleteChildren(); - _elementPool.Clear(); - _attributePool.Clear(); - _textPool.Clear(); - _commentPool.Clear(); - } - return _errorID; -} - - -void XMLDocument::Print( XMLPrinter* streamer ) const -{ - if ( streamer ) { - Accept( streamer ); - } - else { - XMLPrinter stdoutStreamer( stdout ); - Accept( &stdoutStreamer ); - } -} - - -void XMLDocument::ClearError() { - _errorID = XML_SUCCESS; - _errorLineNum = 0; - _errorStr.Reset(); -} - - -void XMLDocument::SetError( XMLError error, int lineNum, const char* format, ... ) -{ - TIXMLASSERT( error >= 0 && error < XML_ERROR_COUNT ); - _errorID = error; - _errorLineNum = lineNum; - _errorStr.Reset(); - - const size_t BUFFER_SIZE = 1000; - char* buffer = new char[BUFFER_SIZE]; - - TIXMLASSERT(sizeof(error) <= sizeof(int)); - TIXML_SNPRINTF(buffer, BUFFER_SIZE, "Error=%s ErrorID=%d (0x%x) Line number=%d", ErrorIDToName(error), int(error), int(error), lineNum); - - if (format) { - size_t len = strlen(buffer); - TIXML_SNPRINTF(buffer + len, BUFFER_SIZE - len, ": "); - len = strlen(buffer); - - va_list va; - va_start(va, format); - TIXML_VSNPRINTF(buffer + len, BUFFER_SIZE - len, format, va); - va_end(va); - } - _errorStr.SetStr(buffer); - delete[] buffer; -} - - -/*static*/ const char* XMLDocument::ErrorIDToName(XMLError errorID) -{ - TIXMLASSERT( errorID >= 0 && errorID < XML_ERROR_COUNT ); - const char* errorName = _errorNames[errorID]; - TIXMLASSERT( errorName && errorName[0] ); - return errorName; -} - -const char* XMLDocument::ErrorStr() const -{ - return _errorStr.Empty() ? "" : _errorStr.GetStr(); -} - - -void XMLDocument::PrintError() const -{ - printf("%s\n", ErrorStr()); -} - -const char* XMLDocument::ErrorName() const -{ - return ErrorIDToName(_errorID); -} - -void XMLDocument::Parse() -{ - TIXMLASSERT( NoChildren() ); // Clear() must have been called previously - TIXMLASSERT( _charBuffer ); - _parseCurLineNum = 1; - _parseLineNum = 1; - char* p = _charBuffer; - p = XMLUtil::SkipWhiteSpace( p, &_parseCurLineNum ); - p = const_cast( XMLUtil::ReadBOM( p, &_writeBOM ) ); - if ( !*p ) { - SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); - return; - } - ParseDeep(p, 0, &_parseCurLineNum ); -} - -void XMLDocument::PushDepth() -{ - _parsingDepth++; - if (_parsingDepth == TINYXML2_MAX_ELEMENT_DEPTH) { - SetError(XML_ELEMENT_DEPTH_EXCEEDED, _parseCurLineNum, "Element nesting is too deep." ); - } -} - -void XMLDocument::PopDepth() -{ - TIXMLASSERT(_parsingDepth > 0); - --_parsingDepth; -} - -XMLPrinter::XMLPrinter( FILE* file, bool compact, int depth ) : - _elementJustOpened( false ), - _stack(), - _firstElement( true ), - _fp( file ), - _depth( depth ), - _textDepth( -1 ), - _processEntities( true ), - _compactMode( compact ), - _buffer() -{ - for( int i=0; i(entityValue); - TIXMLASSERT( flagIndex < ENTITY_RANGE ); - _entityFlag[flagIndex] = true; - } - _restrictedEntityFlag[static_cast('&')] = true; - _restrictedEntityFlag[static_cast('<')] = true; - _restrictedEntityFlag[static_cast('>')] = true; // not required, but consistency is nice - _buffer.Push( 0 ); -} - - -void XMLPrinter::Print( const char* format, ... ) -{ - va_list va; - va_start( va, format ); - - if ( _fp ) { - vfprintf( _fp, format, va ); - } - else { - const int len = TIXML_VSCPRINTF( format, va ); - // Close out and re-start the va-args - va_end( va ); - TIXMLASSERT( len >= 0 ); - va_start( va, format ); - TIXMLASSERT( _buffer.Size() > 0 && _buffer[_buffer.Size() - 1] == 0 ); - char* p = _buffer.PushArr( len ) - 1; // back up over the null terminator. - TIXML_VSNPRINTF( p, len+1, format, va ); - } - va_end( va ); -} - - -void XMLPrinter::Write( const char* data, size_t size ) -{ - if ( _fp ) { - fwrite ( data , sizeof(char), size, _fp); - } - else { - char* p = _buffer.PushArr( static_cast(size) ) - 1; // back up over the null terminator. - memcpy( p, data, size ); - p[size] = 0; - } -} - - -void XMLPrinter::Putc( char ch ) -{ - if ( _fp ) { - fputc ( ch, _fp); - } - else { - char* p = _buffer.PushArr( sizeof(char) ) - 1; // back up over the null terminator. - p[0] = ch; - p[1] = 0; - } -} - - -void XMLPrinter::PrintSpace( int depth ) -{ - for( int i=0; i 0 && *q < ENTITY_RANGE ) { - // Check for entities. If one is found, flush - // the stream up until the entity, write the - // entity, and keep looking. - if ( flag[static_cast(*q)] ) { - while ( p < q ) { - const size_t delta = q - p; - const int toPrint = ( INT_MAX < delta ) ? INT_MAX : static_cast(delta); - Write( p, toPrint ); - p += toPrint; - } - bool entityPatternPrinted = false; - for( int i=0; i(delta); - Write( p, toPrint ); - } - } - else { - Write( p ); - } -} - - -void XMLPrinter::PushHeader( bool writeBOM, bool writeDec ) -{ - if ( writeBOM ) { - static const unsigned char bom[] = { TIXML_UTF_LEAD_0, TIXML_UTF_LEAD_1, TIXML_UTF_LEAD_2, 0 }; - Write( reinterpret_cast< const char* >( bom ) ); - } - if ( writeDec ) { - PushDeclaration( "xml version=\"1.0\"" ); - } -} - -void XMLPrinter::PrepareForNewNode( bool compactMode ) -{ - SealElementIfJustOpened(); - - if ( compactMode ) { - return; - } - - if ( _firstElement ) { - PrintSpace (_depth); - } else if ( _textDepth < 0) { - Putc( '\n' ); - PrintSpace( _depth ); - } - - _firstElement = false; -} - -void XMLPrinter::OpenElement( const char* name, bool compactMode ) -{ - PrepareForNewNode( compactMode ); - _stack.Push( name ); - - Write ( "<" ); - Write ( name ); - - _elementJustOpened = true; - ++_depth; -} - - -void XMLPrinter::PushAttribute( const char* name, const char* value ) -{ - TIXMLASSERT( _elementJustOpened ); - Putc ( ' ' ); - Write( name ); - Write( "=\"" ); - PrintString( value, false ); - Putc ( '\"' ); -} - - -void XMLPrinter::PushAttribute( const char* name, int v ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( v, buf, BUF_SIZE ); - PushAttribute( name, buf ); -} - - -void XMLPrinter::PushAttribute( const char* name, unsigned v ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( v, buf, BUF_SIZE ); - PushAttribute( name, buf ); -} - - -void XMLPrinter::PushAttribute(const char* name, int64_t v) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr(v, buf, BUF_SIZE); - PushAttribute(name, buf); -} - - -void XMLPrinter::PushAttribute(const char* name, uint64_t v) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr(v, buf, BUF_SIZE); - PushAttribute(name, buf); -} - - -void XMLPrinter::PushAttribute( const char* name, bool v ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( v, buf, BUF_SIZE ); - PushAttribute( name, buf ); -} - - -void XMLPrinter::PushAttribute( const char* name, double v ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( v, buf, BUF_SIZE ); - PushAttribute( name, buf ); -} - - -void XMLPrinter::CloseElement( bool compactMode ) -{ - --_depth; - const char* name = _stack.Pop(); - - if ( _elementJustOpened ) { - Write( "/>" ); - } - else { - if ( _textDepth < 0 && !compactMode) { - Putc( '\n' ); - PrintSpace( _depth ); - } - Write ( "" ); - } - - if ( _textDepth == _depth ) { - _textDepth = -1; - } - if ( _depth == 0 && !compactMode) { - Putc( '\n' ); - } - _elementJustOpened = false; -} - - -void XMLPrinter::SealElementIfJustOpened() -{ - if ( !_elementJustOpened ) { - return; - } - _elementJustOpened = false; - Putc( '>' ); -} - - -void XMLPrinter::PushText( const char* text, bool cdata ) -{ - _textDepth = _depth-1; - - SealElementIfJustOpened(); - if ( cdata ) { - Write( "" ); - } - else { - PrintString( text, true ); - } -} - - -void XMLPrinter::PushText( int64_t value ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( value, buf, BUF_SIZE ); - PushText( buf, false ); -} - - -void XMLPrinter::PushText( uint64_t value ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr(value, buf, BUF_SIZE); - PushText(buf, false); -} - - -void XMLPrinter::PushText( int value ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( value, buf, BUF_SIZE ); - PushText( buf, false ); -} - - -void XMLPrinter::PushText( unsigned value ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( value, buf, BUF_SIZE ); - PushText( buf, false ); -} - - -void XMLPrinter::PushText( bool value ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( value, buf, BUF_SIZE ); - PushText( buf, false ); -} - - -void XMLPrinter::PushText( float value ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( value, buf, BUF_SIZE ); - PushText( buf, false ); -} - - -void XMLPrinter::PushText( double value ) -{ - char buf[BUF_SIZE]; - XMLUtil::ToStr( value, buf, BUF_SIZE ); - PushText( buf, false ); -} - - -void XMLPrinter::PushComment( const char* comment ) -{ - PrepareForNewNode( _compactMode ); - - Write( "" ); -} - - -void XMLPrinter::PushDeclaration( const char* value ) -{ - PrepareForNewNode( _compactMode ); - - Write( "" ); -} - - -void XMLPrinter::PushUnknown( const char* value ) -{ - PrepareForNewNode( _compactMode ); - - Write( "' ); -} - - -bool XMLPrinter::VisitEnter( const XMLDocument& doc ) -{ - _processEntities = doc.ProcessEntities(); - if ( doc.HasBOM() ) { - PushHeader( true, false ); - } - return true; -} - - -bool XMLPrinter::VisitEnter( const XMLElement& element, const XMLAttribute* attribute ) -{ - const XMLElement* parentElem = 0; - if ( element.Parent() ) { - parentElem = element.Parent()->ToElement(); - } - const bool compactMode = parentElem ? CompactMode( *parentElem ) : _compactMode; - OpenElement( element.Name(), compactMode ); - while ( attribute ) { - PushAttribute( attribute->Name(), attribute->Value() ); - attribute = attribute->Next(); - } - return true; -} - - -bool XMLPrinter::VisitExit( const XMLElement& element ) -{ - CloseElement( CompactMode(element) ); - return true; -} - - -bool XMLPrinter::Visit( const XMLText& text ) -{ - PushText( text.Value(), text.CData() ); - return true; -} - - -bool XMLPrinter::Visit( const XMLComment& comment ) -{ - PushComment( comment.Value() ); - return true; -} - -bool XMLPrinter::Visit( const XMLDeclaration& declaration ) -{ - PushDeclaration( declaration.Value() ); - return true; -} - - -bool XMLPrinter::Visit( const XMLUnknown& unknown ) -{ - PushUnknown( unknown.Value() ); - return true; -} - -} // namespace tinyxml2 - -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic pop -#endif - -#if defined(__clang__) -#pragma clang diagnostic pop -#endif diff --git a/modules/skybrowser/ext/tinyxml2/tinyxml2.h b/modules/skybrowser/ext/tinyxml2/tinyxml2.h deleted file mode 100644 index d257966c97..0000000000 --- a/modules/skybrowser/ext/tinyxml2/tinyxml2.h +++ /dev/null @@ -1,2380 +0,0 @@ -/* -Original code by Lee Thomason (www.grinninglizard.com) - -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. -*/ - -#ifndef TINYXML2_INCLUDED -#define TINYXML2_INCLUDED - -#if defined(ANDROID_NDK) || defined(__BORLANDC__) || defined(__QNXNTO__) -# include -# include -# include -# include -# include -# if defined(__PS3__) -# include -# endif -#else -# include -# include -# include -# include -# include -#endif -#include - -/* - TODO: intern strings instead of allocation. -*/ -/* - gcc: - g++ -Wall -DTINYXML2_DEBUG tinyxml2.cpp xmltest.cpp -o gccxmltest.exe - - Formatting, Artistic Style: - AStyle.exe --style=1tbs --indent-switches --break-closing-brackets --indent-preprocessor tinyxml2.cpp tinyxml2.h -*/ - -#if defined( _DEBUG ) || defined (__DEBUG__) -# ifndef TINYXML2_DEBUG -# define TINYXML2_DEBUG -# endif -#endif - -#ifdef _MSC_VER -# pragma warning(push) -# pragma warning(disable: 4251) -#endif - -#ifdef _WIN32 -# ifdef TINYXML2_EXPORT -# define TINYXML2_LIB __declspec(dllexport) -# elif defined(TINYXML2_IMPORT) -# define TINYXML2_LIB __declspec(dllimport) -# else -# define TINYXML2_LIB -# endif -#elif __GNUC__ >= 4 -# define TINYXML2_LIB __attribute__((visibility("default"))) -#else -# define TINYXML2_LIB -#endif - - -#if !defined(TIXMLASSERT) -#if defined(TINYXML2_DEBUG) -# if defined(_MSC_VER) -# // "(void)0," is for suppressing C4127 warning in "assert(false)", "assert(true)" and the like -# define TIXMLASSERT( x ) if ( !((void)0,(x))) { __debugbreak(); } -# elif defined (ANDROID_NDK) -# include -# define TIXMLASSERT( x ) if ( !(x)) { __android_log_assert( "assert", "grinliz", "ASSERT in '%s' at %d.", __FILE__, __LINE__ ); } -# else -# include -# define TIXMLASSERT assert -# endif -#else -# define TIXMLASSERT( x ) {} -#endif -#endif - -/* Versioning, past 1.0.14: - http://semver.org/ -*/ -static const int TIXML2_MAJOR_VERSION = 8; -static const int TIXML2_MINOR_VERSION = 0; -static const int TIXML2_PATCH_VERSION = 0; - -#define TINYXML2_MAJOR_VERSION 8 -#define TINYXML2_MINOR_VERSION 0 -#define TINYXML2_PATCH_VERSION 0 - -// A fixed element depth limit is problematic. There needs to be a -// limit to avoid a stack overflow. However, that limit varies per -// system, and the capacity of the stack. On the other hand, it's a trivial -// attack that can result from ill, malicious, or even correctly formed XML, -// so there needs to be a limit in place. -static const int TINYXML2_MAX_ELEMENT_DEPTH = 100; - -namespace tinyxml2 -{ -class XMLDocument; -class XMLElement; -class XMLAttribute; -class XMLComment; -class XMLText; -class XMLDeclaration; -class XMLUnknown; -class XMLPrinter; - -/* - A class that wraps strings. Normally stores the start and end - pointers into the XML file itself, and will apply normalization - and entity translation if actually read. Can also store (and memory - manage) a traditional char[] - - Isn't clear why TINYXML2_LIB is needed; but seems to fix #719 -*/ -class TINYXML2_LIB StrPair -{ -public: - enum Mode { - NEEDS_ENTITY_PROCESSING = 0x01, - NEEDS_NEWLINE_NORMALIZATION = 0x02, - NEEDS_WHITESPACE_COLLAPSING = 0x04, - - TEXT_ELEMENT = NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION, - TEXT_ELEMENT_LEAVE_ENTITIES = NEEDS_NEWLINE_NORMALIZATION, - ATTRIBUTE_NAME = 0, - ATTRIBUTE_VALUE = NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION, - ATTRIBUTE_VALUE_LEAVE_ENTITIES = NEEDS_NEWLINE_NORMALIZATION, - COMMENT = NEEDS_NEWLINE_NORMALIZATION - }; - - StrPair() : _flags( 0 ), _start( 0 ), _end( 0 ) {} - ~StrPair(); - - void Set( char* start, char* end, int flags ) { - TIXMLASSERT( start ); - TIXMLASSERT( end ); - Reset(); - _start = start; - _end = end; - _flags = flags | NEEDS_FLUSH; - } - - const char* GetStr(); - - bool Empty() const { - return _start == _end; - } - - void SetInternedStr( const char* str ) { - Reset(); - _start = const_cast(str); - } - - void SetStr( const char* str, int flags=0 ); - - char* ParseText( char* in, const char* endTag, int strFlags, int* curLineNumPtr ); - char* ParseName( char* in ); - - void TransferTo( StrPair* other ); - void Reset(); - -private: - void CollapseWhitespace(); - - enum { - NEEDS_FLUSH = 0x100, - NEEDS_DELETE = 0x200 - }; - - int _flags; - char* _start; - char* _end; - - StrPair( const StrPair& other ); // not supported - void operator=( const StrPair& other ); // not supported, use TransferTo() -}; - - -/* - A dynamic array of Plain Old Data. Doesn't support constructors, etc. - Has a small initial memory pool, so that low or no usage will not - cause a call to new/delete -*/ -template -class DynArray -{ -public: - DynArray() : - _mem( _pool ), - _allocated( INITIAL_SIZE ), - _size( 0 ) - { - } - - ~DynArray() { - if ( _mem != _pool ) { - delete [] _mem; - } - } - - void Clear() { - _size = 0; - } - - void Push( T t ) { - TIXMLASSERT( _size < INT_MAX ); - EnsureCapacity( _size+1 ); - _mem[_size] = t; - ++_size; - } - - T* PushArr( int count ) { - TIXMLASSERT( count >= 0 ); - TIXMLASSERT( _size <= INT_MAX - count ); - EnsureCapacity( _size+count ); - T* ret = &_mem[_size]; - _size += count; - return ret; - } - - T Pop() { - TIXMLASSERT( _size > 0 ); - --_size; - return _mem[_size]; - } - - void PopArr( int count ) { - TIXMLASSERT( _size >= count ); - _size -= count; - } - - bool Empty() const { - return _size == 0; - } - - T& operator[](int i) { - TIXMLASSERT( i>= 0 && i < _size ); - return _mem[i]; - } - - const T& operator[](int i) const { - TIXMLASSERT( i>= 0 && i < _size ); - return _mem[i]; - } - - const T& PeekTop() const { - TIXMLASSERT( _size > 0 ); - return _mem[ _size - 1]; - } - - int Size() const { - TIXMLASSERT( _size >= 0 ); - return _size; - } - - int Capacity() const { - TIXMLASSERT( _allocated >= INITIAL_SIZE ); - return _allocated; - } - - void SwapRemove(int i) { - TIXMLASSERT(i >= 0 && i < _size); - TIXMLASSERT(_size > 0); - _mem[i] = _mem[_size - 1]; - --_size; - } - - const T* Mem() const { - TIXMLASSERT( _mem ); - return _mem; - } - - T* Mem() { - TIXMLASSERT( _mem ); - return _mem; - } - -private: - DynArray( const DynArray& ); // not supported - void operator=( const DynArray& ); // not supported - - void EnsureCapacity( int cap ) { - TIXMLASSERT( cap > 0 ); - if ( cap > _allocated ) { - TIXMLASSERT( cap <= INT_MAX / 2 ); - const int newAllocated = cap * 2; - T* newMem = new T[newAllocated]; - TIXMLASSERT( newAllocated >= _size ); - memcpy( newMem, _mem, sizeof(T)*_size ); // warning: not using constructors, only works for PODs - if ( _mem != _pool ) { - delete [] _mem; - } - _mem = newMem; - _allocated = newAllocated; - } - } - - T* _mem; - T _pool[INITIAL_SIZE]; - int _allocated; // objects allocated - int _size; // number objects in use -}; - - -/* - Parent virtual class of a pool for fast allocation - and deallocation of objects. -*/ -class MemPool -{ -public: - MemPool() {} - virtual ~MemPool() {} - - virtual int ItemSize() const = 0; - virtual void* Alloc() = 0; - virtual void Free( void* ) = 0; - virtual void SetTracked() = 0; -}; - - -/* - Template child class to create pools of the correct type. -*/ -template< int ITEM_SIZE > -class MemPoolT : public MemPool -{ -public: - MemPoolT() : _blockPtrs(), _root(0), _currentAllocs(0), _nAllocs(0), _maxAllocs(0), _nUntracked(0) {} - ~MemPoolT() { - MemPoolT< ITEM_SIZE >::Clear(); - } - - void Clear() { - // Delete the blocks. - while( !_blockPtrs.Empty()) { - Block* lastBlock = _blockPtrs.Pop(); - delete lastBlock; - } - _root = 0; - _currentAllocs = 0; - _nAllocs = 0; - _maxAllocs = 0; - _nUntracked = 0; - } - - virtual int ItemSize() const { - return ITEM_SIZE; - } - int CurrentAllocs() const { - return _currentAllocs; - } - - virtual void* Alloc() { - if ( !_root ) { - // Need a new block. - Block* block = new Block(); - _blockPtrs.Push( block ); - - Item* blockItems = block->items; - for( int i = 0; i < ITEMS_PER_BLOCK - 1; ++i ) { - blockItems[i].next = &(blockItems[i + 1]); - } - blockItems[ITEMS_PER_BLOCK - 1].next = 0; - _root = blockItems; - } - Item* const result = _root; - TIXMLASSERT( result != 0 ); - _root = _root->next; - - ++_currentAllocs; - if ( _currentAllocs > _maxAllocs ) { - _maxAllocs = _currentAllocs; - } - ++_nAllocs; - ++_nUntracked; - return result; - } - - virtual void Free( void* mem ) { - if ( !mem ) { - return; - } - --_currentAllocs; - Item* item = static_cast( mem ); -#ifdef TINYXML2_DEBUG - memset( item, 0xfe, sizeof( *item ) ); -#endif - item->next = _root; - _root = item; - } - void Trace( const char* name ) { - printf( "Mempool %s watermark=%d [%dk] current=%d size=%d nAlloc=%d blocks=%d\n", - name, _maxAllocs, _maxAllocs * ITEM_SIZE / 1024, _currentAllocs, - ITEM_SIZE, _nAllocs, _blockPtrs.Size() ); - } - - void SetTracked() { - --_nUntracked; - } - - int Untracked() const { - return _nUntracked; - } - - // This number is perf sensitive. 4k seems like a good tradeoff on my machine. - // The test file is large, 170k. - // Release: VS2010 gcc(no opt) - // 1k: 4000 - // 2k: 4000 - // 4k: 3900 21000 - // 16k: 5200 - // 32k: 4300 - // 64k: 4000 21000 - // Declared public because some compilers do not accept to use ITEMS_PER_BLOCK - // in private part if ITEMS_PER_BLOCK is private - enum { ITEMS_PER_BLOCK = (4 * 1024) / ITEM_SIZE }; - -private: - MemPoolT( const MemPoolT& ); // not supported - void operator=( const MemPoolT& ); // not supported - - union Item { - Item* next; - char itemData[ITEM_SIZE]; - }; - struct Block { - Item items[ITEMS_PER_BLOCK]; - }; - DynArray< Block*, 10 > _blockPtrs; - Item* _root; - - int _currentAllocs; - int _nAllocs; - int _maxAllocs; - int _nUntracked; -}; - - - -/** - Implements the interface to the "Visitor pattern" (see the Accept() method.) - If you call the Accept() method, it requires being passed a XMLVisitor - class to handle callbacks. For nodes that contain other nodes (Document, Element) - you will get called with a VisitEnter/VisitExit pair. Nodes that are always leafs - are simply called with Visit(). - - If you return 'true' from a Visit method, recursive parsing will continue. If you return - false, no children of this node or its siblings will be visited. - - All flavors of Visit methods have a default implementation that returns 'true' (continue - visiting). You need to only override methods that are interesting to you. - - Generally Accept() is called on the XMLDocument, although all nodes support visiting. - - You should never change the document from a callback. - - @sa XMLNode::Accept() -*/ -class TINYXML2_LIB XMLVisitor -{ -public: - virtual ~XMLVisitor() {} - - /// Visit a document. - virtual bool VisitEnter( const XMLDocument& /*doc*/ ) { - return true; - } - /// Visit a document. - virtual bool VisitExit( const XMLDocument& /*doc*/ ) { - return true; - } - - /// Visit an element. - virtual bool VisitEnter( const XMLElement& /*element*/, const XMLAttribute* /*firstAttribute*/ ) { - return true; - } - /// Visit an element. - virtual bool VisitExit( const XMLElement& /*element*/ ) { - return true; - } - - /// Visit a declaration. - virtual bool Visit( const XMLDeclaration& /*declaration*/ ) { - return true; - } - /// Visit a text node. - virtual bool Visit( const XMLText& /*text*/ ) { - return true; - } - /// Visit a comment node. - virtual bool Visit( const XMLComment& /*comment*/ ) { - return true; - } - /// Visit an unknown node. - virtual bool Visit( const XMLUnknown& /*unknown*/ ) { - return true; - } -}; - -// WARNING: must match XMLDocument::_errorNames[] -enum XMLError { - XML_SUCCESS = 0, - XML_NO_ATTRIBUTE, - XML_WRONG_ATTRIBUTE_TYPE, - XML_ERROR_FILE_NOT_FOUND, - XML_ERROR_FILE_COULD_NOT_BE_OPENED, - XML_ERROR_FILE_READ_ERROR, - XML_ERROR_PARSING_ELEMENT, - XML_ERROR_PARSING_ATTRIBUTE, - XML_ERROR_PARSING_TEXT, - XML_ERROR_PARSING_CDATA, - XML_ERROR_PARSING_COMMENT, - XML_ERROR_PARSING_DECLARATION, - XML_ERROR_PARSING_UNKNOWN, - XML_ERROR_EMPTY_DOCUMENT, - XML_ERROR_MISMATCHED_ELEMENT, - XML_ERROR_PARSING, - XML_CAN_NOT_CONVERT_TEXT, - XML_NO_TEXT_NODE, - XML_ELEMENT_DEPTH_EXCEEDED, - - XML_ERROR_COUNT -}; - - -/* - Utility functionality. -*/ -class TINYXML2_LIB XMLUtil -{ -public: - static const char* SkipWhiteSpace( const char* p, int* curLineNumPtr ) { - TIXMLASSERT( p ); - - while( IsWhiteSpace(*p) ) { - if (curLineNumPtr && *p == '\n') { - ++(*curLineNumPtr); - } - ++p; - } - TIXMLASSERT( p ); - return p; - } - static char* SkipWhiteSpace( char* const p, int* curLineNumPtr ) { - return const_cast( SkipWhiteSpace( const_cast(p), curLineNumPtr ) ); - } - - // Anything in the high order range of UTF-8 is assumed to not be whitespace. This isn't - // correct, but simple, and usually works. - static bool IsWhiteSpace( char p ) { - return !IsUTF8Continuation(p) && isspace( static_cast(p) ); - } - - inline static bool IsNameStartChar( unsigned char ch ) { - if ( ch >= 128 ) { - // This is a heuristic guess in attempt to not implement Unicode-aware isalpha() - return true; - } - if ( isalpha( ch ) ) { - return true; - } - return ch == ':' || ch == '_'; - } - - inline static bool IsNameChar( unsigned char ch ) { - return IsNameStartChar( ch ) - || isdigit( ch ) - || ch == '.' - || ch == '-'; - } - - inline static bool IsPrefixHex( const char* p) { - p = SkipWhiteSpace(p, 0); - return p && *p == '0' && ( *(p + 1) == 'x' || *(p + 1) == 'X'); - } - - inline static bool StringEqual( const char* p, const char* q, int nChar=INT_MAX ) { - if ( p == q ) { - return true; - } - TIXMLASSERT( p ); - TIXMLASSERT( q ); - TIXMLASSERT( nChar >= 0 ); - return strncmp( p, q, nChar ) == 0; - } - - inline static bool IsUTF8Continuation( const char p ) { - return ( p & 0x80 ) != 0; - } - - static const char* ReadBOM( const char* p, bool* hasBOM ); - // p is the starting location, - // the UTF-8 value of the entity will be placed in value, and length filled in. - static const char* GetCharacterRef( const char* p, char* value, int* length ); - static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); - - // converts primitive types to strings - static void ToStr( int v, char* buffer, int bufferSize ); - static void ToStr( unsigned v, char* buffer, int bufferSize ); - static void ToStr( bool v, char* buffer, int bufferSize ); - static void ToStr( float v, char* buffer, int bufferSize ); - static void ToStr( double v, char* buffer, int bufferSize ); - static void ToStr(int64_t v, char* buffer, int bufferSize); - static void ToStr(uint64_t v, char* buffer, int bufferSize); - - // converts strings to primitive types - static bool ToInt( const char* str, int* value ); - static bool ToUnsigned( const char* str, unsigned* value ); - static bool ToBool( const char* str, bool* value ); - static bool ToFloat( const char* str, float* value ); - static bool ToDouble( const char* str, double* value ); - static bool ToInt64(const char* str, int64_t* value); - static bool ToUnsigned64(const char* str, uint64_t* value); - // Changes what is serialized for a boolean value. - // Default to "true" and "false". Shouldn't be changed - // unless you have a special testing or compatibility need. - // Be careful: static, global, & not thread safe. - // Be sure to set static const memory as parameters. - static void SetBoolSerialization(const char* writeTrue, const char* writeFalse); - -private: - static const char* writeBoolTrue; - static const char* writeBoolFalse; -}; - - -/** XMLNode is a base class for every object that is in the - XML Document Object Model (DOM), except XMLAttributes. - Nodes have siblings, a parent, and children which can - be navigated. A node is always in a XMLDocument. - The type of a XMLNode can be queried, and it can - be cast to its more defined type. - - A XMLDocument allocates memory for all its Nodes. - When the XMLDocument gets deleted, all its Nodes - will also be deleted. - - @verbatim - A Document can contain: Element (container or leaf) - Comment (leaf) - Unknown (leaf) - Declaration( leaf ) - - An Element can contain: Element (container or leaf) - Text (leaf) - Attributes (not on tree) - Comment (leaf) - Unknown (leaf) - - @endverbatim -*/ -class TINYXML2_LIB XMLNode -{ - friend class XMLDocument; - friend class XMLElement; -public: - - /// Get the XMLDocument that owns this XMLNode. - const XMLDocument* GetDocument() const { - TIXMLASSERT( _document ); - return _document; - } - /// Get the XMLDocument that owns this XMLNode. - XMLDocument* GetDocument() { - TIXMLASSERT( _document ); - return _document; - } - - /// Safely cast to an Element, or null. - virtual XMLElement* ToElement() { - return 0; - } - /// Safely cast to Text, or null. - virtual XMLText* ToText() { - return 0; - } - /// Safely cast to a Comment, or null. - virtual XMLComment* ToComment() { - return 0; - } - /// Safely cast to a Document, or null. - virtual XMLDocument* ToDocument() { - return 0; - } - /// Safely cast to a Declaration, or null. - virtual XMLDeclaration* ToDeclaration() { - return 0; - } - /// Safely cast to an Unknown, or null. - virtual XMLUnknown* ToUnknown() { - return 0; - } - - virtual const XMLElement* ToElement() const { - return 0; - } - virtual const XMLText* ToText() const { - return 0; - } - virtual const XMLComment* ToComment() const { - return 0; - } - virtual const XMLDocument* ToDocument() const { - return 0; - } - virtual const XMLDeclaration* ToDeclaration() const { - return 0; - } - virtual const XMLUnknown* ToUnknown() const { - return 0; - } - - /** The meaning of 'value' changes for the specific type. - @verbatim - Document: empty (NULL is returned, not an empty string) - Element: name of the element - Comment: the comment text - Unknown: the tag contents - Text: the text string - @endverbatim - */ - const char* Value() const; - - /** Set the Value of an XML node. - @sa Value() - */ - void SetValue( const char* val, bool staticMem=false ); - - /// Gets the line number the node is in, if the document was parsed from a file. - int GetLineNum() const { return _parseLineNum; } - - /// Get the parent of this node on the DOM. - const XMLNode* Parent() const { - return _parent; - } - - XMLNode* Parent() { - return _parent; - } - - /// Returns true if this node has no children. - bool NoChildren() const { - return !_firstChild; - } - - /// Get the first child node, or null if none exists. - const XMLNode* FirstChild() const { - return _firstChild; - } - - XMLNode* FirstChild() { - return _firstChild; - } - - /** Get the first child element, or optionally the first child - element with the specified name. - */ - const XMLElement* FirstChildElement( const char* name = 0 ) const; - - XMLElement* FirstChildElement( const char* name = 0 ) { - return const_cast(const_cast(this)->FirstChildElement( name )); - } - - /// Get the last child node, or null if none exists. - const XMLNode* LastChild() const { - return _lastChild; - } - - XMLNode* LastChild() { - return _lastChild; - } - - /** Get the last child element or optionally the last child - element with the specified name. - */ - const XMLElement* LastChildElement( const char* name = 0 ) const; - - XMLElement* LastChildElement( const char* name = 0 ) { - return const_cast(const_cast(this)->LastChildElement(name) ); - } - - /// Get the previous (left) sibling node of this node. - const XMLNode* PreviousSibling() const { - return _prev; - } - - XMLNode* PreviousSibling() { - return _prev; - } - - /// Get the previous (left) sibling element of this node, with an optionally supplied name. - const XMLElement* PreviousSiblingElement( const char* name = 0 ) const ; - - XMLElement* PreviousSiblingElement( const char* name = 0 ) { - return const_cast(const_cast(this)->PreviousSiblingElement( name ) ); - } - - /// Get the next (right) sibling node of this node. - const XMLNode* NextSibling() const { - return _next; - } - - XMLNode* NextSibling() { - return _next; - } - - /// Get the next (right) sibling element of this node, with an optionally supplied name. - const XMLElement* NextSiblingElement( const char* name = 0 ) const; - - XMLElement* NextSiblingElement( const char* name = 0 ) { - return const_cast(const_cast(this)->NextSiblingElement( name ) ); - } - - /** - Add a child node as the last (right) child. - If the child node is already part of the document, - it is moved from its old location to the new location. - Returns the addThis argument or 0 if the node does not - belong to the same document. - */ - XMLNode* InsertEndChild( XMLNode* addThis ); - - XMLNode* LinkEndChild( XMLNode* addThis ) { - return InsertEndChild( addThis ); - } - /** - Add a child node as the first (left) child. - If the child node is already part of the document, - it is moved from its old location to the new location. - Returns the addThis argument or 0 if the node does not - belong to the same document. - */ - XMLNode* InsertFirstChild( XMLNode* addThis ); - /** - Add a node after the specified child node. - If the child node is already part of the document, - it is moved from its old location to the new location. - Returns the addThis argument or 0 if the afterThis node - is not a child of this node, or if the node does not - belong to the same document. - */ - XMLNode* InsertAfterChild( XMLNode* afterThis, XMLNode* addThis ); - - /** - Delete all the children of this node. - */ - void DeleteChildren(); - - /** - Delete a child of this node. - */ - void DeleteChild( XMLNode* node ); - - /** - Make a copy of this node, but not its children. - You may pass in a Document pointer that will be - the owner of the new Node. If the 'document' is - null, then the node returned will be allocated - from the current Document. (this->GetDocument()) - - Note: if called on a XMLDocument, this will return null. - */ - virtual XMLNode* ShallowClone( XMLDocument* document ) const = 0; - - /** - Make a copy of this node and all its children. - - If the 'target' is null, then the nodes will - be allocated in the current document. If 'target' - is specified, the memory will be allocated is the - specified XMLDocument. - - NOTE: This is probably not the correct tool to - copy a document, since XMLDocuments can have multiple - top level XMLNodes. You probably want to use - XMLDocument::DeepCopy() - */ - XMLNode* DeepClone( XMLDocument* target ) const; - - /** - Test if 2 nodes are the same, but don't test children. - The 2 nodes do not need to be in the same Document. - - Note: if called on a XMLDocument, this will return false. - */ - virtual bool ShallowEqual( const XMLNode* compare ) const = 0; - - /** Accept a hierarchical visit of the nodes in the TinyXML-2 DOM. Every node in the - XML tree will be conditionally visited and the host will be called back - via the XMLVisitor interface. - - This is essentially a SAX interface for TinyXML-2. (Note however it doesn't re-parse - the XML for the callbacks, so the performance of TinyXML-2 is unchanged by using this - interface versus any other.) - - The interface has been based on ideas from: - - - http://www.saxproject.org/ - - http://c2.com/cgi/wiki?HierarchicalVisitorPattern - - Which are both good references for "visiting". - - An example of using Accept(): - @verbatim - XMLPrinter printer; - tinyxmlDoc.Accept( &printer ); - const char* xmlcstr = printer.CStr(); - @endverbatim - */ - virtual bool Accept( XMLVisitor* visitor ) const = 0; - - /** - Set user data into the XMLNode. TinyXML-2 in - no way processes or interprets user data. - It is initially 0. - */ - void SetUserData(void* userData) { _userData = userData; } - - /** - Get user data set into the XMLNode. TinyXML-2 in - no way processes or interprets user data. - It is initially 0. - */ - void* GetUserData() const { return _userData; } - -protected: - explicit XMLNode( XMLDocument* ); - virtual ~XMLNode(); - - virtual char* ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr); - - XMLDocument* _document; - XMLNode* _parent; - mutable StrPair _value; - int _parseLineNum; - - XMLNode* _firstChild; - XMLNode* _lastChild; - - XMLNode* _prev; - XMLNode* _next; - - void* _userData; - -private: - MemPool* _memPool; - void Unlink( XMLNode* child ); - static void DeleteNode( XMLNode* node ); - void InsertChildPreamble( XMLNode* insertThis ) const; - const XMLElement* ToElementWithName( const char* name ) const; - - XMLNode( const XMLNode& ); // not supported - XMLNode& operator=( const XMLNode& ); // not supported -}; - - -/** XML text. - - Note that a text node can have child element nodes, for example: - @verbatim - This is bold - @endverbatim - - A text node can have 2 ways to output the next. "normal" output - and CDATA. It will default to the mode it was parsed from the XML file and - you generally want to leave it alone, but you can change the output mode with - SetCData() and query it with CData(). -*/ -class TINYXML2_LIB XMLText : public XMLNode -{ - friend class XMLDocument; -public: - virtual bool Accept( XMLVisitor* visitor ) const; - - virtual XMLText* ToText() { - return this; - } - virtual const XMLText* ToText() const { - return this; - } - - /// Declare whether this should be CDATA or standard text. - void SetCData( bool isCData ) { - _isCData = isCData; - } - /// Returns true if this is a CDATA text element. - bool CData() const { - return _isCData; - } - - virtual XMLNode* ShallowClone( XMLDocument* document ) const; - virtual bool ShallowEqual( const XMLNode* compare ) const; - -protected: - explicit XMLText( XMLDocument* doc ) : XMLNode( doc ), _isCData( false ) {} - virtual ~XMLText() {} - - char* ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr ); - -private: - bool _isCData; - - XMLText( const XMLText& ); // not supported - XMLText& operator=( const XMLText& ); // not supported -}; - - -/** An XML Comment. */ -class TINYXML2_LIB XMLComment : public XMLNode -{ - friend class XMLDocument; -public: - virtual XMLComment* ToComment() { - return this; - } - virtual const XMLComment* ToComment() const { - return this; - } - - virtual bool Accept( XMLVisitor* visitor ) const; - - virtual XMLNode* ShallowClone( XMLDocument* document ) const; - virtual bool ShallowEqual( const XMLNode* compare ) const; - -protected: - explicit XMLComment( XMLDocument* doc ); - virtual ~XMLComment(); - - char* ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr); - -private: - XMLComment( const XMLComment& ); // not supported - XMLComment& operator=( const XMLComment& ); // not supported -}; - - -/** In correct XML the declaration is the first entry in the file. - @verbatim - - @endverbatim - - TinyXML-2 will happily read or write files without a declaration, - however. - - The text of the declaration isn't interpreted. It is parsed - and written as a string. -*/ -class TINYXML2_LIB XMLDeclaration : public XMLNode -{ - friend class XMLDocument; -public: - virtual XMLDeclaration* ToDeclaration() { - return this; - } - virtual const XMLDeclaration* ToDeclaration() const { - return this; - } - - virtual bool Accept( XMLVisitor* visitor ) const; - - virtual XMLNode* ShallowClone( XMLDocument* document ) const; - virtual bool ShallowEqual( const XMLNode* compare ) const; - -protected: - explicit XMLDeclaration( XMLDocument* doc ); - virtual ~XMLDeclaration(); - - char* ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr ); - -private: - XMLDeclaration( const XMLDeclaration& ); // not supported - XMLDeclaration& operator=( const XMLDeclaration& ); // not supported -}; - - -/** Any tag that TinyXML-2 doesn't recognize is saved as an - unknown. It is a tag of text, but should not be modified. - It will be written back to the XML, unchanged, when the file - is saved. - - DTD tags get thrown into XMLUnknowns. -*/ -class TINYXML2_LIB XMLUnknown : public XMLNode -{ - friend class XMLDocument; -public: - virtual XMLUnknown* ToUnknown() { - return this; - } - virtual const XMLUnknown* ToUnknown() const { - return this; - } - - virtual bool Accept( XMLVisitor* visitor ) const; - - virtual XMLNode* ShallowClone( XMLDocument* document ) const; - virtual bool ShallowEqual( const XMLNode* compare ) const; - -protected: - explicit XMLUnknown( XMLDocument* doc ); - virtual ~XMLUnknown(); - - char* ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr ); - -private: - XMLUnknown( const XMLUnknown& ); // not supported - XMLUnknown& operator=( const XMLUnknown& ); // not supported -}; - - - -/** An attribute is a name-value pair. Elements have an arbitrary - number of attributes, each with a unique name. - - @note The attributes are not XMLNodes. You may only query the - Next() attribute in a list. -*/ -class TINYXML2_LIB XMLAttribute -{ - friend class XMLElement; -public: - /// The name of the attribute. - const char* Name() const; - - /// The value of the attribute. - const char* Value() const; - - /// Gets the line number the attribute is in, if the document was parsed from a file. - int GetLineNum() const { return _parseLineNum; } - - /// The next attribute in the list. - const XMLAttribute* Next() const { - return _next; - } - - /** IntValue interprets the attribute as an integer, and returns the value. - If the value isn't an integer, 0 will be returned. There is no error checking; - use QueryIntValue() if you need error checking. - */ - int IntValue() const { - int i = 0; - QueryIntValue(&i); - return i; - } - - int64_t Int64Value() const { - int64_t i = 0; - QueryInt64Value(&i); - return i; - } - - uint64_t Unsigned64Value() const { - uint64_t i = 0; - QueryUnsigned64Value(&i); - return i; - } - - /// Query as an unsigned integer. See IntValue() - unsigned UnsignedValue() const { - unsigned i=0; - QueryUnsignedValue( &i ); - return i; - } - /// Query as a boolean. See IntValue() - bool BoolValue() const { - bool b=false; - QueryBoolValue( &b ); - return b; - } - /// Query as a double. See IntValue() - double DoubleValue() const { - double d=0; - QueryDoubleValue( &d ); - return d; - } - /// Query as a float. See IntValue() - float FloatValue() const { - float f=0; - QueryFloatValue( &f ); - return f; - } - - /** QueryIntValue interprets the attribute as an integer, and returns the value - in the provided parameter. The function will return XML_SUCCESS on success, - and XML_WRONG_ATTRIBUTE_TYPE if the conversion is not successful. - */ - XMLError QueryIntValue( int* value ) const; - /// See QueryIntValue - XMLError QueryUnsignedValue( unsigned int* value ) const; - /// See QueryIntValue - XMLError QueryInt64Value(int64_t* value) const; - /// See QueryIntValue - XMLError QueryUnsigned64Value(uint64_t* value) const; - /// See QueryIntValue - XMLError QueryBoolValue( bool* value ) const; - /// See QueryIntValue - XMLError QueryDoubleValue( double* value ) const; - /// See QueryIntValue - XMLError QueryFloatValue( float* value ) const; - - /// Set the attribute to a string value. - void SetAttribute( const char* value ); - /// Set the attribute to value. - void SetAttribute( int value ); - /// Set the attribute to value. - void SetAttribute( unsigned value ); - /// Set the attribute to value. - void SetAttribute(int64_t value); - /// Set the attribute to value. - void SetAttribute(uint64_t value); - /// Set the attribute to value. - void SetAttribute( bool value ); - /// Set the attribute to value. - void SetAttribute( double value ); - /// Set the attribute to value. - void SetAttribute( float value ); - -private: - enum { BUF_SIZE = 200 }; - - XMLAttribute() : _name(), _value(),_parseLineNum( 0 ), _next( 0 ), _memPool( 0 ) {} - virtual ~XMLAttribute() {} - - XMLAttribute( const XMLAttribute& ); // not supported - void operator=( const XMLAttribute& ); // not supported - void SetName( const char* name ); - - char* ParseDeep( char* p, bool processEntities, int* curLineNumPtr ); - - mutable StrPair _name; - mutable StrPair _value; - int _parseLineNum; - XMLAttribute* _next; - MemPool* _memPool; -}; - - -/** The element is a container class. It has a value, the element name, - and can contain other elements, text, comments, and unknowns. - Elements also contain an arbitrary number of attributes. -*/ -class TINYXML2_LIB XMLElement : public XMLNode -{ - friend class XMLDocument; -public: - /// Get the name of an element (which is the Value() of the node.) - const char* Name() const { - return Value(); - } - /// Set the name of the element. - void SetName( const char* str, bool staticMem=false ) { - SetValue( str, staticMem ); - } - - virtual XMLElement* ToElement() { - return this; - } - virtual const XMLElement* ToElement() const { - return this; - } - virtual bool Accept( XMLVisitor* visitor ) const; - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none - exists. For example: - - @verbatim - const char* value = ele->Attribute( "foo" ); - @endverbatim - - The 'value' parameter is normally null. However, if specified, - the attribute will only be returned if the 'name' and 'value' - match. This allow you to write code: - - @verbatim - if ( ele->Attribute( "foo", "bar" ) ) callFooIsBar(); - @endverbatim - - rather than: - @verbatim - if ( ele->Attribute( "foo" ) ) { - if ( strcmp( ele->Attribute( "foo" ), "bar" ) == 0 ) callFooIsBar(); - } - @endverbatim - */ - const char* Attribute( const char* name, const char* value=0 ) const; - - /** Given an attribute name, IntAttribute() returns the value - of the attribute interpreted as an integer. The default - value will be returned if the attribute isn't present, - or if there is an error. (For a method with error - checking, see QueryIntAttribute()). - */ - int IntAttribute(const char* name, int defaultValue = 0) const; - /// See IntAttribute() - unsigned UnsignedAttribute(const char* name, unsigned defaultValue = 0) const; - /// See IntAttribute() - int64_t Int64Attribute(const char* name, int64_t defaultValue = 0) const; - /// See IntAttribute() - uint64_t Unsigned64Attribute(const char* name, uint64_t defaultValue = 0) const; - /// See IntAttribute() - bool BoolAttribute(const char* name, bool defaultValue = false) const; - /// See IntAttribute() - double DoubleAttribute(const char* name, double defaultValue = 0) const; - /// See IntAttribute() - float FloatAttribute(const char* name, float defaultValue = 0) const; - - /** Given an attribute name, QueryIntAttribute() returns - XML_SUCCESS, XML_WRONG_ATTRIBUTE_TYPE if the conversion - can't be performed, or XML_NO_ATTRIBUTE if the attribute - doesn't exist. If successful, the result of the conversion - will be written to 'value'. If not successful, nothing will - be written to 'value'. This allows you to provide default - value: - - @verbatim - int value = 10; - QueryIntAttribute( "foo", &value ); // if "foo" isn't found, value will still be 10 - @endverbatim - */ - XMLError QueryIntAttribute( const char* name, int* value ) const { - const XMLAttribute* a = FindAttribute( name ); - if ( !a ) { - return XML_NO_ATTRIBUTE; - } - return a->QueryIntValue( value ); - } - - /// See QueryIntAttribute() - XMLError QueryUnsignedAttribute( const char* name, unsigned int* value ) const { - const XMLAttribute* a = FindAttribute( name ); - if ( !a ) { - return XML_NO_ATTRIBUTE; - } - return a->QueryUnsignedValue( value ); - } - - /// See QueryIntAttribute() - XMLError QueryInt64Attribute(const char* name, int64_t* value) const { - const XMLAttribute* a = FindAttribute(name); - if (!a) { - return XML_NO_ATTRIBUTE; - } - return a->QueryInt64Value(value); - } - - /// See QueryIntAttribute() - XMLError QueryUnsigned64Attribute(const char* name, uint64_t* value) const { - const XMLAttribute* a = FindAttribute(name); - if(!a) { - return XML_NO_ATTRIBUTE; - } - return a->QueryUnsigned64Value(value); - } - - /// See QueryIntAttribute() - XMLError QueryBoolAttribute( const char* name, bool* value ) const { - const XMLAttribute* a = FindAttribute( name ); - if ( !a ) { - return XML_NO_ATTRIBUTE; - } - return a->QueryBoolValue( value ); - } - /// See QueryIntAttribute() - XMLError QueryDoubleAttribute( const char* name, double* value ) const { - const XMLAttribute* a = FindAttribute( name ); - if ( !a ) { - return XML_NO_ATTRIBUTE; - } - return a->QueryDoubleValue( value ); - } - /// See QueryIntAttribute() - XMLError QueryFloatAttribute( const char* name, float* value ) const { - const XMLAttribute* a = FindAttribute( name ); - if ( !a ) { - return XML_NO_ATTRIBUTE; - } - return a->QueryFloatValue( value ); - } - - /// See QueryIntAttribute() - XMLError QueryStringAttribute(const char* name, const char** value) const { - const XMLAttribute* a = FindAttribute(name); - if (!a) { - return XML_NO_ATTRIBUTE; - } - *value = a->Value(); - return XML_SUCCESS; - } - - - - /** Given an attribute name, QueryAttribute() returns - XML_SUCCESS, XML_WRONG_ATTRIBUTE_TYPE if the conversion - can't be performed, or XML_NO_ATTRIBUTE if the attribute - doesn't exist. It is overloaded for the primitive types, - and is a generally more convenient replacement of - QueryIntAttribute() and related functions. - - If successful, the result of the conversion - will be written to 'value'. If not successful, nothing will - be written to 'value'. This allows you to provide default - value: - - @verbatim - int value = 10; - QueryAttribute( "foo", &value ); // if "foo" isn't found, value will still be 10 - @endverbatim - */ - XMLError QueryAttribute( const char* name, int* value ) const { - return QueryIntAttribute( name, value ); - } - - XMLError QueryAttribute( const char* name, unsigned int* value ) const { - return QueryUnsignedAttribute( name, value ); - } - - XMLError QueryAttribute(const char* name, int64_t* value) const { - return QueryInt64Attribute(name, value); - } - - XMLError QueryAttribute(const char* name, uint64_t* value) const { - return QueryUnsigned64Attribute(name, value); - } - - XMLError QueryAttribute( const char* name, bool* value ) const { - return QueryBoolAttribute( name, value ); - } - - XMLError QueryAttribute( const char* name, double* value ) const { - return QueryDoubleAttribute( name, value ); - } - - XMLError QueryAttribute( const char* name, float* value ) const { - return QueryFloatAttribute( name, value ); - } - - XMLError QueryAttribute(const char* name, const char** value) const { - return QueryStringAttribute(name, value); - } - - /// Sets the named attribute to value. - void SetAttribute( const char* name, const char* value ) { - XMLAttribute* a = FindOrCreateAttribute( name ); - a->SetAttribute( value ); - } - /// Sets the named attribute to value. - void SetAttribute( const char* name, int value ) { - XMLAttribute* a = FindOrCreateAttribute( name ); - a->SetAttribute( value ); - } - /// Sets the named attribute to value. - void SetAttribute( const char* name, unsigned value ) { - XMLAttribute* a = FindOrCreateAttribute( name ); - a->SetAttribute( value ); - } - - /// Sets the named attribute to value. - void SetAttribute(const char* name, int64_t value) { - XMLAttribute* a = FindOrCreateAttribute(name); - a->SetAttribute(value); - } - - /// Sets the named attribute to value. - void SetAttribute(const char* name, uint64_t value) { - XMLAttribute* a = FindOrCreateAttribute(name); - a->SetAttribute(value); - } - - /// Sets the named attribute to value. - void SetAttribute( const char* name, bool value ) { - XMLAttribute* a = FindOrCreateAttribute( name ); - a->SetAttribute( value ); - } - /// Sets the named attribute to value. - void SetAttribute( const char* name, double value ) { - XMLAttribute* a = FindOrCreateAttribute( name ); - a->SetAttribute( value ); - } - /// Sets the named attribute to value. - void SetAttribute( const char* name, float value ) { - XMLAttribute* a = FindOrCreateAttribute( name ); - a->SetAttribute( value ); - } - - /** - Delete an attribute. - */ - void DeleteAttribute( const char* name ); - - /// Return the first attribute in the list. - const XMLAttribute* FirstAttribute() const { - return _rootAttribute; - } - /// Query a specific attribute in the list. - const XMLAttribute* FindAttribute( const char* name ) const; - - /** Convenience function for easy access to the text inside an element. Although easy - and concise, GetText() is limited compared to getting the XMLText child - and accessing it directly. - - If the first child of 'this' is a XMLText, the GetText() - returns the character string of the Text node, else null is returned. - - This is a convenient method for getting the text of simple contained text: - @verbatim - This is text - const char* str = fooElement->GetText(); - @endverbatim - - 'str' will be a pointer to "This is text". - - Note that this function can be misleading. If the element foo was created from - this XML: - @verbatim - This is text - @endverbatim - - then the value of str would be null. The first child node isn't a text node, it is - another element. From this XML: - @verbatim - This is text - @endverbatim - GetText() will return "This is ". - */ - const char* GetText() const; - - /** Convenience function for easy access to the text inside an element. Although easy - and concise, SetText() is limited compared to creating an XMLText child - and mutating it directly. - - If the first child of 'this' is a XMLText, SetText() sets its value to - the given string, otherwise it will create a first child that is an XMLText. - - This is a convenient method for setting the text of simple contained text: - @verbatim - This is text - fooElement->SetText( "Hullaballoo!" ); - Hullaballoo! - @endverbatim - - Note that this function can be misleading. If the element foo was created from - this XML: - @verbatim - This is text - @endverbatim - - then it will not change "This is text", but rather prefix it with a text element: - @verbatim - Hullaballoo!This is text - @endverbatim - - For this XML: - @verbatim - - @endverbatim - SetText() will generate - @verbatim - Hullaballoo! - @endverbatim - */ - void SetText( const char* inText ); - /// Convenience method for setting text inside an element. See SetText() for important limitations. - void SetText( int value ); - /// Convenience method for setting text inside an element. See SetText() for important limitations. - void SetText( unsigned value ); - /// Convenience method for setting text inside an element. See SetText() for important limitations. - void SetText(int64_t value); - /// Convenience method for setting text inside an element. See SetText() for important limitations. - void SetText(uint64_t value); - /// Convenience method for setting text inside an element. See SetText() for important limitations. - void SetText( bool value ); - /// Convenience method for setting text inside an element. See SetText() for important limitations. - void SetText( double value ); - /// Convenience method for setting text inside an element. See SetText() for important limitations. - void SetText( float value ); - - /** - Convenience method to query the value of a child text node. This is probably best - shown by example. Given you have a document is this form: - @verbatim - - 1 - 1.4 - - @endverbatim - - The QueryIntText() and similar functions provide a safe and easier way to get to the - "value" of x and y. - - @verbatim - int x = 0; - float y = 0; // types of x and y are contrived for example - const XMLElement* xElement = pointElement->FirstChildElement( "x" ); - const XMLElement* yElement = pointElement->FirstChildElement( "y" ); - xElement->QueryIntText( &x ); - yElement->QueryFloatText( &y ); - @endverbatim - - @returns XML_SUCCESS (0) on success, XML_CAN_NOT_CONVERT_TEXT if the text cannot be converted - to the requested type, and XML_NO_TEXT_NODE if there is no child text to query. - - */ - XMLError QueryIntText( int* ival ) const; - /// See QueryIntText() - XMLError QueryUnsignedText( unsigned* uval ) const; - /// See QueryIntText() - XMLError QueryInt64Text(int64_t* uval) const; - /// See QueryIntText() - XMLError QueryUnsigned64Text(uint64_t* uval) const; - /// See QueryIntText() - XMLError QueryBoolText( bool* bval ) const; - /// See QueryIntText() - XMLError QueryDoubleText( double* dval ) const; - /// See QueryIntText() - XMLError QueryFloatText( float* fval ) const; - - int IntText(int defaultValue = 0) const; - - /// See QueryIntText() - unsigned UnsignedText(unsigned defaultValue = 0) const; - /// See QueryIntText() - int64_t Int64Text(int64_t defaultValue = 0) const; - /// See QueryIntText() - uint64_t Unsigned64Text(uint64_t defaultValue = 0) const; - /// See QueryIntText() - bool BoolText(bool defaultValue = false) const; - /// See QueryIntText() - double DoubleText(double defaultValue = 0) const; - /// See QueryIntText() - float FloatText(float defaultValue = 0) const; - - /** - Convenience method to create a new XMLElement and add it as last (right) - child of this node. Returns the created and inserted element. - */ - XMLElement* InsertNewChildElement(const char* name); - /// See InsertNewChildElement() - XMLComment* InsertNewComment(const char* comment); - /// See InsertNewChildElement() - XMLText* InsertNewText(const char* text); - /// See InsertNewChildElement() - XMLDeclaration* InsertNewDeclaration(const char* text); - /// See InsertNewChildElement() - XMLUnknown* InsertNewUnknown(const char* text); - - - // internal: - enum ElementClosingType { - OPEN, // - CLOSED, // - CLOSING // - }; - ElementClosingType ClosingType() const { - return _closingType; - } - virtual XMLNode* ShallowClone( XMLDocument* document ) const; - virtual bool ShallowEqual( const XMLNode* compare ) const; - -protected: - char* ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr ); - -private: - XMLElement( XMLDocument* doc ); - virtual ~XMLElement(); - XMLElement( const XMLElement& ); // not supported - void operator=( const XMLElement& ); // not supported - - XMLAttribute* FindOrCreateAttribute( const char* name ); - char* ParseAttributes( char* p, int* curLineNumPtr ); - static void DeleteAttribute( XMLAttribute* attribute ); - XMLAttribute* CreateAttribute(); - - enum { BUF_SIZE = 200 }; - ElementClosingType _closingType; - // The attribute list is ordered; there is no 'lastAttribute' - // because the list needs to be scanned for dupes before adding - // a new attribute. - XMLAttribute* _rootAttribute; -}; - - -enum Whitespace { - PRESERVE_WHITESPACE, - COLLAPSE_WHITESPACE -}; - - -/** A Document binds together all the functionality. - It can be saved, loaded, and printed to the screen. - All Nodes are connected and allocated to a Document. - If the Document is deleted, all its Nodes are also deleted. -*/ -class TINYXML2_LIB XMLDocument : public XMLNode -{ - friend class XMLElement; - // Gives access to SetError and Push/PopDepth, but over-access for everything else. - // Wishing C++ had "internal" scope. - friend class XMLNode; - friend class XMLText; - friend class XMLComment; - friend class XMLDeclaration; - friend class XMLUnknown; -public: - /// constructor - XMLDocument( bool processEntities = true, Whitespace whitespaceMode = PRESERVE_WHITESPACE ); - ~XMLDocument(); - - virtual XMLDocument* ToDocument() { - TIXMLASSERT( this == _document ); - return this; - } - virtual const XMLDocument* ToDocument() const { - TIXMLASSERT( this == _document ); - return this; - } - - /** - Parse an XML file from a character string. - Returns XML_SUCCESS (0) on success, or - an errorID. - - You may optionally pass in the 'nBytes', which is - the number of bytes which will be parsed. If not - specified, TinyXML-2 will assume 'xml' points to a - null terminated string. - */ - XMLError Parse( const char* xml, size_t nBytes=static_cast(-1) ); - - /** - Load an XML file from disk. - Returns XML_SUCCESS (0) on success, or - an errorID. - */ - XMLError LoadFile( const char* filename ); - - /** - Load an XML file from disk. You are responsible - for providing and closing the FILE*. - - NOTE: The file should be opened as binary ("rb") - not text in order for TinyXML-2 to correctly - do newline normalization. - - Returns XML_SUCCESS (0) on success, or - an errorID. - */ - XMLError LoadFile( FILE* ); - - /** - Save the XML file to disk. - Returns XML_SUCCESS (0) on success, or - an errorID. - */ - XMLError SaveFile( const char* filename, bool compact = false ); - - /** - Save the XML file to disk. You are responsible - for providing and closing the FILE*. - - Returns XML_SUCCESS (0) on success, or - an errorID. - */ - XMLError SaveFile( FILE* fp, bool compact = false ); - - bool ProcessEntities() const { - return _processEntities; - } - Whitespace WhitespaceMode() const { - return _whitespaceMode; - } - - /** - Returns true if this document has a leading Byte Order Mark of UTF8. - */ - bool HasBOM() const { - return _writeBOM; - } - /** Sets whether to write the BOM when writing the file. - */ - void SetBOM( bool useBOM ) { - _writeBOM = useBOM; - } - - /** Return the root element of DOM. Equivalent to FirstChildElement(). - To get the first node, use FirstChild(). - */ - XMLElement* RootElement() { - return FirstChildElement(); - } - const XMLElement* RootElement() const { - return FirstChildElement(); - } - - /** Print the Document. If the Printer is not provided, it will - print to stdout. If you provide Printer, this can print to a file: - @verbatim - XMLPrinter printer( fp ); - doc.Print( &printer ); - @endverbatim - - Or you can use a printer to print to memory: - @verbatim - XMLPrinter printer; - doc.Print( &printer ); - // printer.CStr() has a const char* to the XML - @endverbatim - */ - void Print( XMLPrinter* streamer=0 ) const; - virtual bool Accept( XMLVisitor* visitor ) const; - - /** - Create a new Element associated with - this Document. The memory for the Element - is managed by the Document. - */ - XMLElement* NewElement( const char* name ); - /** - Create a new Comment associated with - this Document. The memory for the Comment - is managed by the Document. - */ - XMLComment* NewComment( const char* comment ); - /** - Create a new Text associated with - this Document. The memory for the Text - is managed by the Document. - */ - XMLText* NewText( const char* text ); - /** - Create a new Declaration associated with - this Document. The memory for the object - is managed by the Document. - - If the 'text' param is null, the standard - declaration is used.: - @verbatim - - @endverbatim - */ - XMLDeclaration* NewDeclaration( const char* text=0 ); - /** - Create a new Unknown associated with - this Document. The memory for the object - is managed by the Document. - */ - XMLUnknown* NewUnknown( const char* text ); - - /** - Delete a node associated with this document. - It will be unlinked from the DOM. - */ - void DeleteNode( XMLNode* node ); - - /// Clears the error flags. - void ClearError(); - - /// Return true if there was an error parsing the document. - bool Error() const { - return _errorID != XML_SUCCESS; - } - /// Return the errorID. - XMLError ErrorID() const { - return _errorID; - } - const char* ErrorName() const; - static const char* ErrorIDToName(XMLError errorID); - - /** Returns a "long form" error description. A hopefully helpful - diagnostic with location, line number, and/or additional info. - */ - const char* ErrorStr() const; - - /// A (trivial) utility function that prints the ErrorStr() to stdout. - void PrintError() const; - - /// Return the line where the error occurred, or zero if unknown. - int ErrorLineNum() const - { - return _errorLineNum; - } - - /// Clear the document, resetting it to the initial state. - void Clear(); - - /** - Copies this document to a target document. - The target will be completely cleared before the copy. - If you want to copy a sub-tree, see XMLNode::DeepClone(). - - NOTE: that the 'target' must be non-null. - */ - void DeepCopy(XMLDocument* target) const; - - // internal - char* Identify( char* p, XMLNode** node ); - - // internal - void MarkInUse(const XMLNode* const); - - virtual XMLNode* ShallowClone( XMLDocument* /*document*/ ) const { - return 0; - } - virtual bool ShallowEqual( const XMLNode* /*compare*/ ) const { - return false; - } - -private: - XMLDocument( const XMLDocument& ); // not supported - void operator=( const XMLDocument& ); // not supported - - bool _writeBOM; - bool _processEntities; - XMLError _errorID; - Whitespace _whitespaceMode; - mutable StrPair _errorStr; - int _errorLineNum; - char* _charBuffer; - int _parseCurLineNum; - int _parsingDepth; - // Memory tracking does add some overhead. - // However, the code assumes that you don't - // have a bunch of unlinked nodes around. - // Therefore it takes less memory to track - // in the document vs. a linked list in the XMLNode, - // and the performance is the same. - DynArray _unlinked; - - MemPoolT< sizeof(XMLElement) > _elementPool; - MemPoolT< sizeof(XMLAttribute) > _attributePool; - MemPoolT< sizeof(XMLText) > _textPool; - MemPoolT< sizeof(XMLComment) > _commentPool; - - static const char* _errorNames[XML_ERROR_COUNT]; - - void Parse(); - - void SetError( XMLError error, int lineNum, const char* format, ... ); - - // Something of an obvious security hole, once it was discovered. - // Either an ill-formed XML or an excessively deep one can overflow - // the stack. Track stack depth, and error out if needed. - class DepthTracker { - public: - explicit DepthTracker(XMLDocument * document) { - this->_document = document; - document->PushDepth(); - } - ~DepthTracker() { - _document->PopDepth(); - } - private: - XMLDocument * _document; - }; - void PushDepth(); - void PopDepth(); - - template - NodeType* CreateUnlinkedNode( MemPoolT& pool ); -}; - -template -inline NodeType* XMLDocument::CreateUnlinkedNode( MemPoolT& pool ) -{ - TIXMLASSERT( sizeof( NodeType ) == PoolElementSize ); - TIXMLASSERT( sizeof( NodeType ) == pool.ItemSize() ); - NodeType* returnNode = new (pool.Alloc()) NodeType( this ); - TIXMLASSERT( returnNode ); - returnNode->_memPool = &pool; - - _unlinked.Push(returnNode); - return returnNode; -} - -/** - A XMLHandle is a class that wraps a node pointer with null checks; this is - an incredibly useful thing. Note that XMLHandle is not part of the TinyXML-2 - DOM structure. It is a separate utility class. - - Take an example: - @verbatim - - - - - - - @endverbatim - - Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very - easy to write a *lot* of code that looks like: - - @verbatim - XMLElement* root = document.FirstChildElement( "Document" ); - if ( root ) - { - XMLElement* element = root->FirstChildElement( "Element" ); - if ( element ) - { - XMLElement* child = element->FirstChildElement( "Child" ); - if ( child ) - { - XMLElement* child2 = child->NextSiblingElement( "Child" ); - if ( child2 ) - { - // Finally do something useful. - @endverbatim - - And that doesn't even cover "else" cases. XMLHandle addresses the verbosity - of such code. A XMLHandle checks for null pointers so it is perfectly safe - and correct to use: - - @verbatim - XMLHandle docHandle( &document ); - XMLElement* child2 = docHandle.FirstChildElement( "Document" ).FirstChildElement( "Element" ).FirstChildElement().NextSiblingElement(); - if ( child2 ) - { - // do something useful - @endverbatim - - Which is MUCH more concise and useful. - - It is also safe to copy handles - internally they are nothing more than node pointers. - @verbatim - XMLHandle handleCopy = handle; - @endverbatim - - See also XMLConstHandle, which is the same as XMLHandle, but operates on const objects. -*/ -class TINYXML2_LIB XMLHandle -{ -public: - /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. - explicit XMLHandle( XMLNode* node ) : _node( node ) { - } - /// Create a handle from a node. - explicit XMLHandle( XMLNode& node ) : _node( &node ) { - } - /// Copy constructor - XMLHandle( const XMLHandle& ref ) : _node( ref._node ) { - } - /// Assignment - XMLHandle& operator=( const XMLHandle& ref ) { - _node = ref._node; - return *this; - } - - /// Get the first child of this handle. - XMLHandle FirstChild() { - return XMLHandle( _node ? _node->FirstChild() : 0 ); - } - /// Get the first child element of this handle. - XMLHandle FirstChildElement( const char* name = 0 ) { - return XMLHandle( _node ? _node->FirstChildElement( name ) : 0 ); - } - /// Get the last child of this handle. - XMLHandle LastChild() { - return XMLHandle( _node ? _node->LastChild() : 0 ); - } - /// Get the last child element of this handle. - XMLHandle LastChildElement( const char* name = 0 ) { - return XMLHandle( _node ? _node->LastChildElement( name ) : 0 ); - } - /// Get the previous sibling of this handle. - XMLHandle PreviousSibling() { - return XMLHandle( _node ? _node->PreviousSibling() : 0 ); - } - /// Get the previous sibling element of this handle. - XMLHandle PreviousSiblingElement( const char* name = 0 ) { - return XMLHandle( _node ? _node->PreviousSiblingElement( name ) : 0 ); - } - /// Get the next sibling of this handle. - XMLHandle NextSibling() { - return XMLHandle( _node ? _node->NextSibling() : 0 ); - } - /// Get the next sibling element of this handle. - XMLHandle NextSiblingElement( const char* name = 0 ) { - return XMLHandle( _node ? _node->NextSiblingElement( name ) : 0 ); - } - - /// Safe cast to XMLNode. This can return null. - XMLNode* ToNode() { - return _node; - } - /// Safe cast to XMLElement. This can return null. - XMLElement* ToElement() { - return ( _node ? _node->ToElement() : 0 ); - } - /// Safe cast to XMLText. This can return null. - XMLText* ToText() { - return ( _node ? _node->ToText() : 0 ); - } - /// Safe cast to XMLUnknown. This can return null. - XMLUnknown* ToUnknown() { - return ( _node ? _node->ToUnknown() : 0 ); - } - /// Safe cast to XMLDeclaration. This can return null. - XMLDeclaration* ToDeclaration() { - return ( _node ? _node->ToDeclaration() : 0 ); - } - -private: - XMLNode* _node; -}; - - -/** - A variant of the XMLHandle class for working with const XMLNodes and Documents. It is the - same in all regards, except for the 'const' qualifiers. See XMLHandle for API. -*/ -class TINYXML2_LIB XMLConstHandle -{ -public: - explicit XMLConstHandle( const XMLNode* node ) : _node( node ) { - } - explicit XMLConstHandle( const XMLNode& node ) : _node( &node ) { - } - XMLConstHandle( const XMLConstHandle& ref ) : _node( ref._node ) { - } - - XMLConstHandle& operator=( const XMLConstHandle& ref ) { - _node = ref._node; - return *this; - } - - const XMLConstHandle FirstChild() const { - return XMLConstHandle( _node ? _node->FirstChild() : 0 ); - } - const XMLConstHandle FirstChildElement( const char* name = 0 ) const { - return XMLConstHandle( _node ? _node->FirstChildElement( name ) : 0 ); - } - const XMLConstHandle LastChild() const { - return XMLConstHandle( _node ? _node->LastChild() : 0 ); - } - const XMLConstHandle LastChildElement( const char* name = 0 ) const { - return XMLConstHandle( _node ? _node->LastChildElement( name ) : 0 ); - } - const XMLConstHandle PreviousSibling() const { - return XMLConstHandle( _node ? _node->PreviousSibling() : 0 ); - } - const XMLConstHandle PreviousSiblingElement( const char* name = 0 ) const { - return XMLConstHandle( _node ? _node->PreviousSiblingElement( name ) : 0 ); - } - const XMLConstHandle NextSibling() const { - return XMLConstHandle( _node ? _node->NextSibling() : 0 ); - } - const XMLConstHandle NextSiblingElement( const char* name = 0 ) const { - return XMLConstHandle( _node ? _node->NextSiblingElement( name ) : 0 ); - } - - - const XMLNode* ToNode() const { - return _node; - } - const XMLElement* ToElement() const { - return ( _node ? _node->ToElement() : 0 ); - } - const XMLText* ToText() const { - return ( _node ? _node->ToText() : 0 ); - } - const XMLUnknown* ToUnknown() const { - return ( _node ? _node->ToUnknown() : 0 ); - } - const XMLDeclaration* ToDeclaration() const { - return ( _node ? _node->ToDeclaration() : 0 ); - } - -private: - const XMLNode* _node; -}; - - -/** - Printing functionality. The XMLPrinter gives you more - options than the XMLDocument::Print() method. - - It can: - -# Print to memory. - -# Print to a file you provide. - -# Print XML without a XMLDocument. - - Print to Memory - - @verbatim - XMLPrinter printer; - doc.Print( &printer ); - SomeFunction( printer.CStr() ); - @endverbatim - - Print to a File - - You provide the file pointer. - @verbatim - XMLPrinter printer( fp ); - doc.Print( &printer ); - @endverbatim - - Print without a XMLDocument - - When loading, an XML parser is very useful. However, sometimes - when saving, it just gets in the way. The code is often set up - for streaming, and constructing the DOM is just overhead. - - The Printer supports the streaming case. The following code - prints out a trivially simple XML file without ever creating - an XML document. - - @verbatim - XMLPrinter printer( fp ); - printer.OpenElement( "foo" ); - printer.PushAttribute( "foo", "bar" ); - printer.CloseElement(); - @endverbatim -*/ -class TINYXML2_LIB XMLPrinter : public XMLVisitor -{ -public: - /** Construct the printer. If the FILE* is specified, - this will print to the FILE. Else it will print - to memory, and the result is available in CStr(). - If 'compact' is set to true, then output is created - with only required whitespace and newlines. - */ - XMLPrinter( FILE* file=0, bool compact = false, int depth = 0 ); - virtual ~XMLPrinter() {} - - /** If streaming, write the BOM and declaration. */ - void PushHeader( bool writeBOM, bool writeDeclaration ); - /** If streaming, start writing an element. - The element must be closed with CloseElement() - */ - void OpenElement( const char* name, bool compactMode=false ); - /// If streaming, add an attribute to an open element. - void PushAttribute( const char* name, const char* value ); - void PushAttribute( const char* name, int value ); - void PushAttribute( const char* name, unsigned value ); - void PushAttribute( const char* name, int64_t value ); - void PushAttribute( const char* name, uint64_t value ); - void PushAttribute( const char* name, bool value ); - void PushAttribute( const char* name, double value ); - /// If streaming, close the Element. - virtual void CloseElement( bool compactMode=false ); - - /// Add a text node. - void PushText( const char* text, bool cdata=false ); - /// Add a text node from an integer. - void PushText( int value ); - /// Add a text node from an unsigned. - void PushText( unsigned value ); - /// Add a text node from a signed 64bit integer. - void PushText( int64_t value ); - /// Add a text node from an unsigned 64bit integer. - void PushText( uint64_t value ); - /// Add a text node from a bool. - void PushText( bool value ); - /// Add a text node from a float. - void PushText( float value ); - /// Add a text node from a double. - void PushText( double value ); - - /// Add a comment - void PushComment( const char* comment ); - - void PushDeclaration( const char* value ); - void PushUnknown( const char* value ); - - virtual bool VisitEnter( const XMLDocument& /*doc*/ ); - virtual bool VisitExit( const XMLDocument& /*doc*/ ) { - return true; - } - - virtual bool VisitEnter( const XMLElement& element, const XMLAttribute* attribute ); - virtual bool VisitExit( const XMLElement& element ); - - virtual bool Visit( const XMLText& text ); - virtual bool Visit( const XMLComment& comment ); - virtual bool Visit( const XMLDeclaration& declaration ); - virtual bool Visit( const XMLUnknown& unknown ); - - /** - If in print to memory mode, return a pointer to - the XML file in memory. - */ - const char* CStr() const { - return _buffer.Mem(); - } - /** - If in print to memory mode, return the size - of the XML file in memory. (Note the size returned - includes the terminating null.) - */ - int CStrSize() const { - return _buffer.Size(); - } - /** - If in print to memory mode, reset the buffer to the - beginning. - */ - void ClearBuffer( bool resetToFirstElement = true ) { - _buffer.Clear(); - _buffer.Push(0); - _firstElement = resetToFirstElement; - } - -protected: - virtual bool CompactMode( const XMLElement& ) { return _compactMode; } - - /** Prints out the space before an element. You may override to change - the space and tabs used. A PrintSpace() override should call Print(). - */ - virtual void PrintSpace( int depth ); - virtual void Print( const char* format, ... ); - virtual void Write( const char* data, size_t size ); - virtual void Putc( char ch ); - - inline void Write(const char* data) { Write(data, strlen(data)); } - - void SealElementIfJustOpened(); - bool _elementJustOpened; - DynArray< const char*, 10 > _stack; - -private: - /** - Prepares to write a new node. This includes sealing an element that was - just opened, and writing any whitespace necessary if not in compact mode. - */ - void PrepareForNewNode( bool compactMode ); - void PrintString( const char*, bool restrictedEntitySet ); // prints out, after detecting entities. - - bool _firstElement; - FILE* _fp; - int _depth; - int _textDepth; - bool _processEntities; - bool _compactMode; - - enum { - ENTITY_RANGE = 64, - BUF_SIZE = 200 - }; - bool _entityFlag[ENTITY_RANGE]; - bool _restrictedEntityFlag[ENTITY_RANGE]; - - DynArray< char, 20 > _buffer; - - // Prohibit cloning, intentionally not implemented - XMLPrinter( const XMLPrinter& ); - XMLPrinter& operator=( const XMLPrinter& ); -}; - - -} // tinyxml2 - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // TINYXML2_INCLUDED diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index 2c96e2574f..dd0a7ed772 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -49,11 +49,13 @@ public: float opacity() const; glm::dvec2 fineTuneVector(const glm::dvec2& drag); bool isInitialized() const; + bool isPointingSpacecraft() const; double setVerticalFovWithScroll(float scroll); void setOpacity(float opacity); void setIdInBrowser() const; void setIsInitialized(bool isInitialized); + void setPointSpaceCraft(bool shouldPoint); void updateTextureResolution(); @@ -69,13 +71,13 @@ private: static constexpr int RadiusTimeOut = 25; properties::FloatProperty _textureQuality; properties::BoolProperty _isHidden; + properties::BoolProperty _isPointingSpacecraft; std::vector> _displayCopies; std::vector> _showDisplayCopies; void bindTexture() override; // Flags - bool _isSyncedWithWwt = false; bool _isInitialized = false; bool _radiusIsDirty = false; int _borderRadiusTimer = -1; diff --git a/modules/skybrowser/include/targetbrowserpair.h b/modules/skybrowser/include/targetbrowserpair.h index 5168567617..aa1d5c0ddd 100644 --- a/modules/skybrowser/include/targetbrowserpair.h +++ b/modules/skybrowser/include/targetbrowserpair.h @@ -75,6 +75,7 @@ public: void setBrowserRatio(float ratio); void setVerticalFovWithScroll(float scroll); void setImageCollectionIsLoaded(bool isLoaded); + void setPointSpaceCraft(bool shouldPoint); void applyRoll(); double verticalFov() const; @@ -85,19 +86,20 @@ public: std::string browserId() const; std::string targetRenderableId() const; std::string targetNodeId() const; + bool pointSpaceCraft() const; ScreenSpaceSkyBrowser* browser() const; - std::vector selectedImages() const; + std::vector selectedImages() const; ghoul::Dictionary dataAsDictionary() const; // WorldWide Telescope image handling - void setImageOrder(int i, int order); - void selectImage(const ImageData& image, int i); - void addImageLayerToWwt(const std::string& url, int i); - void removeSelectedImage(int i); + void setImageOrder(const std::string& imageUrl, int order); + void selectImage(const ImageData& image); + void addImageLayerToWwt(const std::string& imageUrl); + void removeSelectedImage(const std::string& imageUrl); void loadImageCollection(const std::string& collection); - void setImageOpacity(int i, float opacity); + void setImageOpacity(const std::string& imageUrl, float opacity); void hideChromeInterface(); private: @@ -111,6 +113,7 @@ private: skybrowser::Animation _targetAnimation = skybrowser::Animation(glm::dvec3(0.0), glm::dvec3(0.0), 0.0); bool _targetIsAnimating = false; + bool _fovIsAnimating = false; // Dragging glm::dvec3 _startTargetPosition = glm::dvec3(0.0); diff --git a/modules/skybrowser/include/wwtcommunicator.h b/modules/skybrowser/include/wwtcommunicator.h index 2ab394f598..61f3e2ac65 100644 --- a/modules/skybrowser/include/wwtcommunicator.h +++ b/modules/skybrowser/include/wwtcommunicator.h @@ -31,6 +31,7 @@ #include namespace openspace { +using SelectedImageDeque = std::deque>; class WwtCommunicator : public Browser { public: @@ -40,12 +41,12 @@ public: void update(); // WorldWide Telescope communication - void selectImage(const std::string& url, int i); - void addImageLayerToWwt(const std::string& url, int i); - void removeSelectedImage(int i); - void setImageOrder(int i, int order); + void selectImage(const std::string& imageUrl); + void addImageLayerToWwt(const std::string& imageUrl); + void removeSelectedImage(const std::string& imageUrl); + void setImageOrder(const std::string& imageUrl, int order); void loadImageCollection(const std::string& collection); - void setImageOpacity(int i, float opacity); + void setImageOpacity(const std::string& imageUrl, float opacity); void hideChromeInterface() const; bool isImageCollectionLoaded() const; @@ -54,7 +55,7 @@ public: glm::ivec3 borderColor() const; glm::dvec2 equatorialAim() const; glm::dvec2 fieldsOfView() const; - std::vector selectedImages() const; + std::vector selectedImages() const; std::vector opacities() const; double borderRadius() const; @@ -70,7 +71,7 @@ public: protected: void setIdInBrowser(const std::string& id) const; - std::deque>::iterator findSelectedImage(int i); + SelectedImageDeque::iterator findSelectedImage(const std::string& id); properties::DoubleProperty _verticalFov; @@ -79,7 +80,7 @@ protected: glm::dvec2 _equatorialAim = glm::dvec2(0.0); double _targetRoll = 0.0; bool _isImageCollectionLoaded = false; - std::deque> _selectedImages; + SelectedImageDeque _selectedImages; private: void sendMessageToWwt(const ghoul::Dictionary& msg) const; diff --git a/modules/skybrowser/include/wwtdatahandler.h b/modules/skybrowser/include/wwtdatahandler.h index 206f0baf9f..c6b1df682d 100644 --- a/modules/skybrowser/include/wwtdatahandler.h +++ b/modules/skybrowser/include/wwtdatahandler.h @@ -27,6 +27,7 @@ #include #include +#include namespace tinyxml2 { class XMLElement; } @@ -45,19 +46,21 @@ struct ImageData { float fov = 0.f; glm::dvec2 equatorialSpherical = glm::dvec2(0.0); glm::dvec3 equatorialCartesian = glm::dvec3(0.0); + std::string identifier; }; class WwtDataHandler { public: void loadImages(const std::string& root, const std::filesystem::path& directory); int nLoadedImages() const; - const ImageData& image(int i) const; + std::optional image(const std::string& imageUrl) const; + const std::map& images() const; private: void saveImagesFromXml(const tinyxml2::XMLElement* root, std::string collection); // Images - std::vector _images; + std::map _images; }; } // namespace openspace diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 273c8e54c6..ee6cea0fa9 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -182,7 +182,7 @@ SkyBrowserModule::SkyBrowserModule() // Set callback functions global::callback::mouseButton->emplace( global::callback::mouseButton->begin(), - [&](MouseButton button, MouseAction action, KeyModifier, IsGuiWindow) -> bool { + [&](MouseButton, MouseAction action, KeyModifier, IsGuiWindow) -> bool { if (action == MouseAction::Press) { _cameraRotation.stop(); } @@ -237,7 +237,7 @@ SkyBrowserModule::SkyBrowserModule() void SkyBrowserModule::internalInitialize(const ghoul::Dictionary& dict) { const Parameters p = codegen::bake(dict); - _enabled = p.enabled.value_or(true); + _enabled = p.enabled.value_or(_enabled); _allowCameraRotation = p.allowCameraRotation.value_or(_allowCameraRotation); _cameraRotationSpeed = p.cameraRotSpeed.value_or(_cameraRotationSpeed); _targetAnimationSpeed = p.targetSpeed.value_or(_targetAnimationSpeed); @@ -318,9 +318,12 @@ void SkyBrowserModule::setHoverCircle(SceneGraphNode* circle) { disableHoverCircle(); } -void SkyBrowserModule::moveHoverCircle(int i, bool useScript) { - const ImageData& image = _dataHandler.image(i); - +void SkyBrowserModule::moveHoverCircle(const std::string& imageUrl, bool useScript) { + std::optional found = _dataHandler.image(imageUrl); + if (!found.has_value()) { + return; + } + const ImageData image = *found; // Only move and show circle if the image has coordinates if (!(_hoverCircle && image.hasCelestialCoords && _isCameraInSolarSystem)) { return; @@ -537,7 +540,6 @@ scripting::LuaLibrary SkyBrowserModule::luaLibrary() const { codegen::lua::ScrollOverBrowser, codegen::lua::LoadingImageCollectionComplete, codegen::lua::ShowAllTargetsAndBrowsers, - codegen::lua::PointSpaceCraft, codegen::lua::GetWwtImageCollectionUrl, codegen::lua::StopAnimations, codegen::lua::SetBorderRadius, diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index d29f073136..822b613b9c 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -76,7 +76,7 @@ public: void addTargetBrowserPair(const std::string& targetId, const std::string& browserId); // Hover circle - void moveHoverCircle(int i, bool useScript = true); + void moveHoverCircle(const std::string& imageUrl, bool useScript = true); void disableHoverCircle(bool useScript = true); // Image collection handling diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index c72f16b93d..5387c3a146 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -35,10 +35,34 @@ #include #include #include +#include namespace { - constexpr std::string_view _loggerCat = "SkyBrowserModule"; +constexpr std::string_view _loggerCat = "SkyBrowserModule"; +bool browserBelongsToCurrentNode(std::string identifier) { + size_t found = identifier.find('_'); + std::string errorMessage = "The Sky Browser encountered a problem when it tried to " + "initialize the browser"; + if (found == std::string::npos) { + throw ghoul::RuntimeError(errorMessage); + } + else { + std::string res = identifier.substr(found + 1, identifier.size()); + if (res.empty()) { + throw ghoul::RuntimeError(errorMessage); + } + // Convert the last char to an int + int nodeId = std::stoi(res); + return nodeId == openspace::global::windowDelegate->currentNode(); + } +} + +std::string prunedIdentifier(std::string identifier) { + // Removes the node number at the end of the identifier + std::string res = identifier.substr(0, identifier.find('_')); + return res; +} /** * Reloads the sky browser display copy for the node index that is sent in. @@ -74,7 +98,7 @@ namespace { * Takes an index to an image and selects that image in the currently * selected sky browser. */ -[[codegen::luawrap]] void selectImage(int imageIndex) { +[[codegen::luawrap]] void selectImage(std::string imageUrl) { using namespace openspace; // Load image @@ -83,8 +107,17 @@ namespace { if (module->isCameraInSolarSystem()) { TargetBrowserPair* selected = module->pair(module->selectedBrowserId()); if (selected) { - const ImageData& image = module->wwtDataHandler().image(imageIndex); + std::optional found = module->wwtDataHandler().image( + imageUrl + ); + if (!found.has_value()) { + LINFO(fmt::format( + "No image with identifier {} was found in the collection.", imageUrl + )); + return; + } // Load image into browser + const ImageData& image = found.value(); std::string str = image.name; // Check if character is ASCII - if it isn't, remove str.erase( @@ -97,7 +130,7 @@ namespace { str.end() ); LINFO("Loading image " + str); - selected->selectImage(image, imageIndex); + selected->selectImage(image); bool isInView = skybrowser::isCoordinateInView(image.equatorialCartesian); // If the coordinate is not in view, rotate camera @@ -107,6 +140,14 @@ namespace { ); module->startRotatingCamera(dir); } + + if (selected->pointSpaceCraft()) { + global::eventEngine->publishEvent( + image.equatorialSpherical.x, + image.equatorialSpherical.y, + module->spaceCraftAnimationTime() + ); + } } } } @@ -130,10 +171,10 @@ namespace { /** * Moves the hover circle to the coordinate specified by the image index. */ -[[codegen::luawrap]] void moveCircleToHoverImage(int imageIndex) { +[[codegen::luawrap]] void moveCircleToHoverImage(std::string imageUrl) { using namespace openspace; - global::moduleEngine->module()->moveHoverCircle(imageIndex, false); + global::moduleEngine->module()->moveHoverCircle(imageUrl, false); } /** @@ -150,7 +191,7 @@ namespace { * which it should have in the selected image list. The image is then changed to have this * order. */ -[[codegen::luawrap]] void setImageLayerOrder(std::string identifier, int imageIndex, +[[codegen::luawrap]] void setImageLayerOrder(std::string identifier, std::string imageUrl, int imageOrder) { using namespace openspace; @@ -158,7 +199,7 @@ namespace { SkyBrowserModule* module = global::moduleEngine->module(); TargetBrowserPair* pair = module->pair(identifier); if (pair) { - pair->setImageOrder(imageIndex, imageOrder); + pair->setImageOrder(imageUrl, imageOrder); } } @@ -169,13 +210,17 @@ namespace { [[codegen::luawrap]] void loadImagesToWWT(std::string identifier) { using namespace openspace; + if (!browserBelongsToCurrentNode(identifier)) { + return; + } + std::string prunedId = prunedIdentifier(identifier); // Load images from url - LINFO("Connection established to WorldWide Telescope application in " + identifier); - LINFO("Loading image collections to " + identifier); + LINFO("Connection established to WorldWide Telescope application in " + prunedId); + LINFO("Loading image collections to " + prunedId); // Load the collections here because we know that the browser can execute javascript SkyBrowserModule* module = global::moduleEngine->module(); - TargetBrowserPair* pair = module->pair(identifier); + TargetBrowserPair* pair = module->pair(prunedId); if (pair) { pair->hideChromeInterface(); pair->browser()->loadImageCollection(module->wwtImageCollectionUrl()); @@ -207,12 +252,11 @@ namespace { ); } } - // To ensure each node in a cluster calls its own instance of the wwt application // Do not send this script to the other nodes global::scriptEngine->queueScript( "openspace.skybrowser.sendOutIdsToBrowsers()", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::RemoteScripting::Yes ); } @@ -241,9 +285,14 @@ namespace { using namespace openspace; // Initialize browser with ID and its corresponding target - LINFO("Initializing sky browser " + identifier); + if (!browserBelongsToCurrentNode(identifier)) { + return; + } + + std::string prunedId = prunedIdentifier(identifier); + LINFO("Initializing sky browser " + prunedId); SkyBrowserModule* module = global::moduleEngine->module(); - TargetBrowserPair* pair = module->pair(identifier); + TargetBrowserPair* pair = module->pair(prunedId); if (pair) { pair->initialize(); } @@ -296,10 +345,7 @@ namespace { // Create Lua table to send to the GUI ghoul::Dictionary list; - - for (int i = 0; i < module->nLoadedImages(); i++) { - const ImageData& img = module->wwtDataHandler().image(i); - + for (auto const& [id, img] : module->wwtDataHandler().images()) { // Push ("Key", value) ghoul::Dictionary image; image.setValue("name", img.name); @@ -312,11 +358,9 @@ namespace { image.setValue("hasCelestialCoords", img.hasCelestialCoords); image.setValue("credits", img.credits); image.setValue("creditsUrl", img.creditsUrl); - image.setValue("identifier", std::to_string(i)); + image.setValue("identifier", img.identifier); - // Index for current ImageData - // Set table for the current ImageData - list.setValue(std::to_string(i + 1), image); + list.setValue(img.identifier, image); } return list; @@ -409,15 +453,15 @@ namespace { * Takes an identifier to a sky browser or sky target, an index to an image and a value * for the opacity. */ -[[codegen::luawrap]] void setOpacityOfImageLayer(std::string identifier, int imageIndex, - float opacity) +[[codegen::luawrap]] void setOpacityOfImageLayer(std::string identifier, + std::string imageUrl, float opacity) { using namespace openspace; SkyBrowserModule* module = global::moduleEngine->module(); TargetBrowserPair* pair = module->pair(identifier); if (pair) { - pair->setImageOpacity(imageIndex, opacity); + pair->setImageOpacity(imageUrl, opacity); } } @@ -467,7 +511,7 @@ namespace { glm::vec3 positionTarget = glm::vec3(0.9f, 0.4f, -2.1f); glm::dvec3 galacticTarget = skybrowser::localCameraToGalactic(positionTarget); if (glm::any(glm::isnan(galacticTarget))) { - galacticTarget = glm::dvec3 (0.0, 0.0, skybrowser::CelestialSphereRadius); + galacticTarget = glm::dvec3(0.0, 0.0, skybrowser::CelestialSphereRadius); } std::string guiPath = "/Sky Browser"; std::string url = "http://wwt.openspaceproject.com/1/openspace/"; @@ -593,14 +637,14 @@ namespace { * image from that sky browser. */ [[codegen::luawrap]] void removeSelectedImageInBrowser(std::string identifier, - int imageIndex) + std::string imageUrl) { using namespace openspace; SkyBrowserModule* module = global::moduleEngine->module(); TargetBrowserPair* pair = module->pair(identifier); if (pair) { - pair->browser()->removeSelectedImage(imageIndex); + pair->browser()->removeSelectedImage(imageUrl); } } @@ -765,19 +809,24 @@ namespace { [[codegen::luawrap]] void loadingImageCollectionComplete(std::string identifier) { using namespace openspace; + if (!browserBelongsToCurrentNode(identifier)) { + return; + } + std::string prunedId = prunedIdentifier(identifier); + SkyBrowserModule* module = global::moduleEngine->module(); - TargetBrowserPair* pair = module->pair(identifier); + TargetBrowserPair* pair = module->pair(prunedId); if (pair) { - LINFO("Image collection is loaded in Screen Space Sky Browser " + identifier); + LINFO("Image collection is loaded in Screen Space Sky Browser " + prunedId); pair->setImageCollectionIsLoaded(true); // Add all selected images to WorldWide Telescope - const std::vector& images = pair->selectedImages(); + const std::vector& images = pair->selectedImages(); std::for_each( images.rbegin(), images.rend(), - [&](int index) { - const ImageData& image = module->wwtDataHandler().image(index); + [&](std::string imageUrl) { + const ImageData& image = module->wwtDataHandler().image(imageUrl).value(); // Index of image is used as layer ID as it's unique in the image data set - pair->browser()->addImageLayerToWwt(image.imageUrl, index); + pair->browser()->addImageLayerToWwt(image.imageUrl); } ); } @@ -796,22 +845,6 @@ namespace { } } -/** - * Point spacecraft to the equatorial coordinates the target points to. Takes an - * identifier to a sky browser. - */ -[[codegen::luawrap]] void pointSpaceCraft(std::string identifier) { - using namespace openspace; - SkyBrowserModule* module = global::moduleEngine->module(); - TargetBrowserPair* pair = module->pair(identifier); - glm::dvec2 equatorial = pair->targetDirectionEquatorial(); - global::eventEngine->publishEvent( - equatorial.x, - equatorial.y, - module->spaceCraftAnimationTime() - ); -} - /** * Stop animations. Takes an identifier to a sky browser. */ diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index 7b76684f3e..85cf3c6eab 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -70,12 +70,22 @@ namespace { "be" }; + constexpr openspace::properties::Property::PropertyInfo PointSpacecraftInfo = { + "PointSpacecraft", + "Point Spacecraft", + "If checked, spacecrafts will point towards the coordinate of an image upon " + "selection." + }; + struct [[codegen::Dictionary(ScreenSpaceSkyBrowser)]] Parameters { // [[codegen::verbatim(TextureQualityInfo.description)]] std::optional textureQuality; // [[codegen::verbatim(IsHiddenInfo.description)]] std::optional isHidden; + + // [[codegen::verbatim(PointSpacecraftInfo.description)]] + std::optional pointSpacecraft; }; #include "screenspaceskybrowser_codegen.cpp" @@ -107,6 +117,7 @@ ScreenSpaceSkyBrowser::ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary , WwtCommunicator(dictionary) , _textureQuality(TextureQualityInfo, 1.f, 0.25f, 1.f) , _isHidden(IsHiddenInfo, true) + , _isPointingSpacecraft(PointSpacecraftInfo, false) { _identifier = makeUniqueIdentifier(_identifier); @@ -114,6 +125,7 @@ ScreenSpaceSkyBrowser::ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary const Parameters p = codegen::bake(dictionary); _textureQuality = p.textureQuality.value_or(_textureQuality); _isHidden = p.isHidden.value_or(_isHidden); + _isPointingSpacecraft = p.pointSpacecraft.value_or(_isPointingSpacecraft); addProperty(_isHidden); addProperty(_url); @@ -121,6 +133,7 @@ ScreenSpaceSkyBrowser::ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary addProperty(_reload); addProperty(_textureQuality); addProperty(_verticalFov); + addProperty(_isPointingSpacecraft); _textureQuality.onChange([this]() { _isDimensionsDirty = true; }); @@ -177,17 +190,26 @@ bool ScreenSpaceSkyBrowser::isInitialized() const { return _isInitialized; } +bool ScreenSpaceSkyBrowser::isPointingSpacecraft() const { + return _isPointingSpacecraft; +} + void ScreenSpaceSkyBrowser::setIdInBrowser() const { - WwtCommunicator::setIdInBrowser(identifier()); + int currentNode = global::windowDelegate->currentNode(); + WwtCommunicator::setIdInBrowser(fmt::format("{}_{}", identifier(), currentNode)); } void ScreenSpaceSkyBrowser::setIsInitialized(bool isInitialized) { _isInitialized = isInitialized; } +void ScreenSpaceSkyBrowser::setPointSpaceCraft(bool shouldPoint) { + _isPointingSpacecraft = shouldPoint; +} + void ScreenSpaceSkyBrowser::updateTextureResolution() { // Check if texture quality has changed. If it has, adjust accordingly - if (abs(_textureQuality.value() - _lastTextureQuality) > glm::epsilon()) { + if (std::abs(_textureQuality.value() - _lastTextureQuality) > glm::epsilon()) { float diffTextureQuality = _textureQuality / _lastTextureQuality; glm::vec2 newRes = glm::vec2(_browserDimensions.value()) * diffTextureQuality; _browserDimensions = glm::ivec2(newRes); diff --git a/modules/skybrowser/src/targetbrowserpair.cpp b/modules/skybrowser/src/targetbrowserpair.cpp index f7bd7bd4ec..a946e6f737 100644 --- a/modules/skybrowser/src/targetbrowserpair.cpp +++ b/modules/skybrowser/src/targetbrowserpair.cpp @@ -69,8 +69,8 @@ TargetBrowserPair::TargetBrowserPair(SceneGraphNode* targetNode, _targetRenderable = dynamic_cast(_targetNode->renderable()); } -void TargetBrowserPair::setImageOrder(int i, int order) { - _browser->setImageOrder(i, order); +void TargetBrowserPair::setImageOrder(const std::string& imageUrl, int order) { + _browser->setImageOrder(imageUrl, order); } void TargetBrowserPair::startFinetuningTarget() { @@ -147,17 +147,31 @@ std::string TargetBrowserPair::targetNodeId() const { return _targetNode->identifier(); } +bool TargetBrowserPair::pointSpaceCraft() const { + return _browser->isPointingSpacecraft(); +} + double TargetBrowserPair::verticalFov() const { return _browser->verticalFov(); } -std::vector TargetBrowserPair::selectedImages() const { +std::vector TargetBrowserPair::selectedImages() const { return _browser->selectedImages(); } ghoul::Dictionary TargetBrowserPair::dataAsDictionary() const { glm::dvec2 spherical = targetDirectionEquatorial(); glm::dvec3 cartesian = skybrowser::sphericalToCartesian(spherical); + SkyBrowserModule* module = global::moduleEngine->module(); + std::vector selectedImagesIndices; + + for (const std::string& imageUrl : selectedImages()) { + bool imageExists = module->wwtDataHandler().image(imageUrl).has_value(); + ghoul_assert(imageExists, "Image doesn't exist in the wwt catalog!"); + selectedImagesIndices.push_back( + module->wwtDataHandler().image(imageUrl)->identifier + ); + } ghoul::Dictionary res; res.setValue("id", browserId()); @@ -172,7 +186,7 @@ ghoul::Dictionary TargetBrowserPair::dataAsDictionary() const { res.setValue("ratio", static_cast(_browser->browserRatio())); res.setValue("isFacingCamera", isFacingCamera()); res.setValue("isUsingRae", isUsingRadiusAzimuthElevation()); - res.setValue("selectedImages", selectedImages()); + res.setValue("selectedImages", selectedImagesIndices); res.setValue("scale", static_cast(_browser->scale())); res.setValue("opacities", _browser->opacities()); res.setValue("borderRadius", _browser->borderRadius()); @@ -193,9 +207,9 @@ ghoul::Dictionary TargetBrowserPair::dataAsDictionary() const { return res; } -void TargetBrowserPair::selectImage(const ImageData& image, int i) { +void TargetBrowserPair::selectImage(const ImageData& image) { // Load image into browser - _browser->selectImage(image.imageUrl, i); + _browser->selectImage(image.imageUrl); // If the image has coordinates, move the target if (image.hasCelestialCoords) { @@ -205,20 +219,20 @@ void TargetBrowserPair::selectImage(const ImageData& image, int i) { } } -void TargetBrowserPair::addImageLayerToWwt(const std::string& url, int i) { - _browser->addImageLayerToWwt(url, i); +void TargetBrowserPair::addImageLayerToWwt(const std::string& imageUrl) { + _browser->addImageLayerToWwt(imageUrl); } -void TargetBrowserPair::removeSelectedImage(int i) { - _browser->removeSelectedImage(i); +void TargetBrowserPair::removeSelectedImage(const std::string& imageUrl) { + _browser->removeSelectedImage(imageUrl); } void TargetBrowserPair::loadImageCollection(const std::string& collection) { _browser->loadImageCollection(collection); } -void TargetBrowserPair::setImageOpacity(int i, float opacity) { - _browser->setImageOpacity(i, opacity); +void TargetBrowserPair::setImageOpacity(const std::string& imageUrl, float opacity) { + _browser->setImageOpacity(imageUrl, opacity); } void TargetBrowserPair::hideChromeInterface() { @@ -273,6 +287,10 @@ void TargetBrowserPair::applyRoll() { _targetRenderable->applyRoll(); } +void TargetBrowserPair::setPointSpaceCraft(bool shouldPoint) { + _browser->setPointSpaceCraft(shouldPoint); +} + void TargetBrowserPair::incrementallyAnimateToCoordinate() { // Animate the target before the field of view starts to animate if (_targetAnimation.isAnimating()) { @@ -283,11 +301,18 @@ void TargetBrowserPair::incrementallyAnimateToCoordinate() { aimTargetGalactic(_targetNode->identifier(), _targetAnimation.newValue()); _fovAnimation.start(); _targetIsAnimating = false; + _fovIsAnimating = true; } + // After the target has animated to its position, animate the field of view if (_fovAnimation.isAnimating()) { _browser->setVerticalFov(_fovAnimation.newValue()); _targetRenderable->setVerticalFov(_browser->verticalFov()); } + else if (!_fovAnimation.isAnimating() && _fovIsAnimating) { + // Set the finished field of view + setVerticalFov(_fovAnimation.newValue()); + _fovIsAnimating = false; + } } void TargetBrowserPair::startFading(float goal, float fadeTime) { @@ -312,7 +337,7 @@ void TargetBrowserPair::startAnimation(glm::dvec3 galacticCoords, double fovEnd) SkyBrowserModule* module = global::moduleEngine->module(); double fovSpeed = module->browserAnimationSpeed(); // The speed is given degrees /sec - double fovTime = abs(_browser->verticalFov() - fovEnd) / fovSpeed; + double fovTime = std::abs(_browser->verticalFov() - fovEnd) / fovSpeed; // Fov animation _fovAnimation = skybrowser::Animation(_browser->verticalFov(), fovEnd, fovTime); diff --git a/modules/skybrowser/src/utility.cpp b/modules/skybrowser/src/utility.cpp index 53e3c1a1f5..e6c276a48a 100644 --- a/modules/skybrowser/src/utility.cpp +++ b/modules/skybrowser/src/utility.cpp @@ -170,7 +170,9 @@ bool isCoordinateInView(const glm::dvec3& equatorial) { double r = windowRatio(); bool isCoordInView = - abs(coordsScreen.x) < r && abs(coordsScreen.y) < 1.f && coordsScreen.z < 0.f; + std::abs(coordsScreen.x) < r && + std::abs(coordsScreen.y) < 1.f && + coordsScreen.z < 0.f; return isCoordInView; } diff --git a/modules/skybrowser/src/wwtcommunicator.cpp b/modules/skybrowser/src/wwtcommunicator.cpp index 00b0d503c8..a02daeb31a 100644 --- a/modules/skybrowser/src/wwtcommunicator.cpp +++ b/modules/skybrowser/src/wwtcommunicator.cpp @@ -69,12 +69,12 @@ namespace { return msg; } - ghoul::Dictionary addImageMessage(const std::string& id, const std::string& url) { + ghoul::Dictionary addImageMessage(const std::string& url) { using namespace std::string_literals; ghoul::Dictionary msg; msg.setValue("event", "image_layer_create"s); - msg.setValue("id", id); + msg.setValue("id", url); msg.setValue("url", url); msg.setValue("mode", "preloaded"s); msg.setValue("goto", false); @@ -101,7 +101,7 @@ namespace { return msg; } - ghoul::Dictionary setLayerOrderMessage(const std::string& id, int order) { + ghoul::Dictionary setLayerOrderMessage(const std::string& imageUrl, int order) { static int MessageCounter = 0; // The lower the layer order, the more towards the back the image is placed @@ -110,7 +110,7 @@ namespace { ghoul::Dictionary msg; msg.setValue("event", "image_layer_order"s); - msg.setValue("id", id); + msg.setValue("id", imageUrl); msg.setValue("order", order); msg.setValue("version", MessageCounter); @@ -165,33 +165,33 @@ void WwtCommunicator::update() { Browser::update(); } -void WwtCommunicator::selectImage(const std::string& url, int i) { +void WwtCommunicator::selectImage(const std::string& url) { // Ensure there are no duplicates - auto it = findSelectedImage(i); + auto it = findSelectedImage(url); if (it == _selectedImages.end()) { // Push newly selected image to front - _selectedImages.push_front(std::pair(i, 1.0)); + _selectedImages.push_front(std::pair(url, 1.0)); // If wwt has not loaded the collection yet, wait with passing the message if (_isImageCollectionLoaded) { - addImageLayerToWwt(url, i); + addImageLayerToWwt(url); } } } -void WwtCommunicator::addImageLayerToWwt(const std::string& url, int i) { +void WwtCommunicator::addImageLayerToWwt(const std::string& imageUrl) { // Index of image is used as layer ID as it is unique in the image data set - sendMessageToWwt(addImageMessage(std::to_string(i), url)); - sendMessageToWwt(setImageOpacityMessage(std::to_string(i), 1.0)); + sendMessageToWwt(addImageMessage(imageUrl)); + sendMessageToWwt(setImageOpacityMessage(imageUrl, 1.0)); } -void WwtCommunicator::removeSelectedImage(int i) { +void WwtCommunicator::removeSelectedImage(const std::string& imageUrl) { // Remove from selected list - auto it = findSelectedImage(i); + auto it = findSelectedImage(imageUrl); if (it != _selectedImages.end()) { _selectedImages.erase(it); - sendMessageToWwt(removeImageMessage(std::to_string(i))); + sendMessageToWwt(removeImageMessage(imageUrl)); } } @@ -200,14 +200,14 @@ void WwtCommunicator::sendMessageToWwt(const ghoul::Dictionary& msg) const { executeJavascript(fmt::format("sendMessageToWWT({});", m)); } -std::vector WwtCommunicator::selectedImages() const { - std::vector selectedImagesVector; +std::vector WwtCommunicator::selectedImages() const { + std::vector selectedImagesVector; selectedImagesVector.resize(_selectedImages.size()); std::transform( _selectedImages.cbegin(), _selectedImages.cend(), selectedImagesVector.begin(), - [](const std::pair& image) { return image.first; } + [](const std::pair& image) { return image.first; } ); return selectedImagesVector; } @@ -219,7 +219,7 @@ std::vector WwtCommunicator::opacities() const { _selectedImages.cbegin(), _selectedImages.cend(), opacities.begin(), - [](const std::pair& image) { return image.second; } + [](const std::pair& image) { return image.second; } ); return opacities; } @@ -277,11 +277,15 @@ bool WwtCommunicator::isImageCollectionLoaded() const { return _isImageCollectionLoaded; } -std::deque>::iterator WwtCommunicator::findSelectedImage(int i) { +SelectedImageDeque::iterator WwtCommunicator::findSelectedImage( + const std::string& imageUrl) +{ auto it = std::find_if( _selectedImages.begin(), _selectedImages.end(), - [i](const std::pair& pair) { return pair.first == i; } + [imageUrl](const std::pair& pair) { + return pair.first == imageUrl; + } ); return it; } @@ -290,13 +294,12 @@ glm::dvec2 WwtCommunicator::equatorialAim() const { return _equatorialAim; } -void WwtCommunicator::setImageOrder(int i, int order) { +void WwtCommunicator::setImageOrder(const std::string& imageUrl, int order) { // Find in selected images list - auto current = findSelectedImage(i); - int currentIndex = std::distance(_selectedImages.begin(), current); - int difference = order - currentIndex; + auto current = findSelectedImage(imageUrl); + int currentIndex = static_cast(std::distance(_selectedImages.begin(), current)); - std::deque> newDeque; + std::deque> newDeque; for (int i = 0; i < static_cast(_selectedImages.size()); i++) { if (i == currentIndex) { @@ -319,7 +322,7 @@ void WwtCommunicator::setImageOrder(int i, int order) { _selectedImages = newDeque; int reverseOrder = static_cast(_selectedImages.size()) - order - 1; - ghoul::Dictionary message = setLayerOrderMessage(std::to_string(i), reverseOrder); + ghoul::Dictionary message = setLayerOrderMessage(imageUrl, reverseOrder); sendMessageToWwt(message); } @@ -329,11 +332,11 @@ void WwtCommunicator::loadImageCollection(const std::string& collection) { } } -void WwtCommunicator::setImageOpacity(int i, float opacity) { - auto it = findSelectedImage(i); +void WwtCommunicator::setImageOpacity(const std::string& imageUrl, float opacity) { + auto it = findSelectedImage(imageUrl); it->second = opacity; - ghoul::Dictionary msg = setImageOpacityMessage(std::to_string(i), opacity); + ghoul::Dictionary msg = setImageOpacityMessage(imageUrl, opacity); sendMessageToWwt(msg); } diff --git a/modules/skybrowser/src/wwtdatahandler.cpp b/modules/skybrowser/src/wwtdatahandler.cpp index a4394f06ed..a465eb4ab7 100644 --- a/modules/skybrowser/src/wwtdatahandler.cpp +++ b/modules/skybrowser/src/wwtdatahandler.cpp @@ -28,18 +28,7 @@ #include #include #include - -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wsuggest-override" -#pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" -#endif - -#include - -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic pop -#endif +#include namespace { constexpr std::string_view _loggerCat = "WwtDataHandler"; @@ -182,9 +171,8 @@ namespace { return true; } - std::optional loadImageFromNode( - const tinyxml2::XMLElement* node, - std::string collection) + std::optional + loadImageFromNode(const tinyxml2::XMLElement* node, const std::string& collection) { using namespace openspace; @@ -254,7 +242,8 @@ namespace { hasCelestialCoords, fov, equatorialSpherical, - equatorialCartesian + equatorialCartesian, + "" }; } } //namespace @@ -329,13 +318,21 @@ void WwtDataHandler::loadImages(const std::string& root, saveImagesFromXml(rootNode, collectionName); } } - - // Sort images in alphabetical order - std::sort( - _images.begin(), - _images.end(), - [](ImageData& a, ImageData& b) { return a.name < b.name; } + // Sort images. Copy images to vector + std::vector _imageVector; + for (const auto& [id, img] : _images) { + _imageVector.push_back(img); + } + // Sort + std::sort(_imageVector.begin(), _imageVector.end(), + [](const ImageData& lhs, const ImageData& rhs) { + return lhs.name < rhs.name; + } ); + // Set the identifiers to the correct order + for (int i = 0; i < _imageVector.size(); i++) { + _images[_imageVector[i].imageUrl].identifier = std::to_string(i); + } LINFO(fmt::format("Loaded {} WorldWide Telescope images", _images.size())); } @@ -344,9 +341,16 @@ int WwtDataHandler::nLoadedImages() const { return static_cast(_images.size()); } -const ImageData& WwtDataHandler::image(int i) const { - ghoul_assert(i < static_cast(_images.size()), "Index outside of vector size"); - return _images[i]; +std::optional WwtDataHandler::image(const std::string& imageUrl) const { + auto it = _images.find(imageUrl); + if (it == _images.end()) { + return std::nullopt; + } + return it->second; +} + +const std::map& WwtDataHandler::images() const { + return _images; } void WwtDataHandler::saveImagesFromXml(const tinyxml2::XMLElement* root, @@ -361,9 +365,11 @@ void WwtDataHandler::saveImagesFromXml(const tinyxml2::XMLElement* root, const std::string name = node->Name(); // If node is an image or place, load it if (name == ImageSet || name == Place) { - std::optional image = loadImageFromNode(node, collection); + std::optional image = loadImageFromNode( + node, collection + ); if (image.has_value()) { - _images.push_back(std::move(*image)); + _images.insert({ image.value().imageUrl, std::move(*image) }); } } diff --git a/modules/space/CMakeLists.txt b/modules/space/CMakeLists.txt index 46f8df42ed..1c5295ce21 100644 --- a/modules/space/CMakeLists.txt +++ b/modules/space/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES horizonsfile.h diff --git a/modules/space/labelscomponent.cpp b/modules/space/labelscomponent.cpp index 973c575ba3..25fa08aee6 100644 --- a/modules/space/labelscomponent.cpp +++ b/modules/space/labelscomponent.cpp @@ -45,12 +45,6 @@ namespace { "The speck label file with the data for the labels" }; - constexpr openspace::properties::Property::PropertyInfo UnitInfo = { - "Unit", - "Unit", - "Distance unit for the label data" - }; - constexpr openspace::properties::Property::PropertyInfo OpacityInfo = { "Opacity", "Opacity", diff --git a/modules/space/rendering/renderableconstellationlines.cpp b/modules/space/rendering/renderableconstellationlines.cpp index 2efe096ab1..f2d8a64b85 100644 --- a/modules/space/rendering/renderableconstellationlines.cpp +++ b/modules/space/rendering/renderableconstellationlines.cpp @@ -103,8 +103,8 @@ documentation::Documentation RenderableConstellationLines::Documentation() { RenderableConstellationLines::RenderableConstellationLines( const ghoul::Dictionary& dictionary) : RenderableConstellationsBase(dictionary) - , _speckFile(SpeckInfo) , _drawElements(DrawElementsInfo, true) + , _speckFile(SpeckInfo) { const Parameters p = codegen::bake(dictionary); @@ -382,7 +382,6 @@ bool RenderableConstellationLines::readSpeckFile() { // Try to read three values for the position glm::vec3 pos; - bool success = true; auto reading = scn::scan(line, "{} {} {}", pos.x, pos.y, pos.z); if (reading) { pos *= scale; @@ -391,7 +390,6 @@ bool RenderableConstellationLines::readSpeckFile() { constellationLine.vertices.push_back(pos.z); } else { - success = false; LERROR(fmt::format( "Failed reading position on line {} of mesh {} in file: '{}'. " "Stopped reading constellation data", l, lineIndex, fileName diff --git a/modules/space/rendering/renderableconstellationsbase.cpp b/modules/space/rendering/renderableconstellationsbase.cpp index f782b8f3df..f6d5d87d16 100644 --- a/modules/space/rendering/renderableconstellationsbase.cpp +++ b/modules/space/rendering/renderableconstellationsbase.cpp @@ -98,10 +98,10 @@ documentation::Documentation RenderableConstellationsBase::Documentation() { RenderableConstellationsBase::RenderableConstellationsBase( const ghoul::Dictionary& dictionary) : Renderable(dictionary) - , _drawLabels(DrawLabelInfo, false) , _lineWidth(LineWidthInfo, 2.f, 1.f, 16.f) - , _namesFilename(NamesFileInfo) , _selection(SelectionInfo) + , _drawLabels(DrawLabelInfo, false) + , _namesFilename(NamesFileInfo) { const Parameters p = codegen::bake(dictionary); @@ -188,7 +188,7 @@ void RenderableConstellationsBase::loadConstellationFile() { } void RenderableConstellationsBase::fillSelectionProperty() { - for (const std::pair& pair : _namesTranslation) { + for (const std::pair& pair : _namesTranslation) { _selection.addOption(pair.second); } } diff --git a/modules/space/rendering/renderableorbitalkepler.cpp b/modules/space/rendering/renderableorbitalkepler.cpp index 6bde01ef0e..1fc6416164 100644 --- a/modules/space/rendering/renderableorbitalkepler.cpp +++ b/modules/space/rendering/renderableorbitalkepler.cpp @@ -304,7 +304,7 @@ void RenderableOrbitalKepler::updateBuffers() { _numObjects = parameters.size(); - if (_startRenderIdx < 0 || _startRenderIdx >= _numObjects) { + if (_startRenderIdx >= _numObjects) { throw ghoul::RuntimeError(fmt::format( "Start index {} out of range [0, {}]", _startRenderIdx, _numObjects )); diff --git a/modules/space/rendering/renderableorbitalkepler.h b/modules/space/rendering/renderableorbitalkepler.h index f6d51752a1..42e1e59bfc 100644 --- a/modules/space/rendering/renderableorbitalkepler.h +++ b/modules/space/rendering/renderableorbitalkepler.h @@ -57,7 +57,6 @@ private: void updateBuffers(); bool _updateDataBuffersAtNextRender = false; - bool _isFileReadinitialized = false; std::streamoff _numObjects; std::vector _segmentSize; properties::UIntProperty _segmentQuality; diff --git a/modules/space/translation/gptranslation.cpp b/modules/space/translation/gptranslation.cpp index e6395f7a90..5fcaf5911e 100644 --- a/modules/space/translation/gptranslation.cpp +++ b/modules/space/translation/gptranslation.cpp @@ -70,7 +70,8 @@ GPTranslation::GPTranslation(const ghoul::Dictionary& dictionary) { p.file, codegen::map(p.format) ); - if (parameters.size() < element) { + + if (element > static_cast(parameters.size())) { throw ghoul::RuntimeError(fmt::format( "Requested element {} but only {} are available", element, parameters.size() )); diff --git a/modules/spacecraftinstruments/CMakeLists.txt b/modules/spacecraftinstruments/CMakeLists.txt index fe1b84716a..a45da7f0fc 100644 --- a/modules/spacecraftinstruments/CMakeLists.txt +++ b/modules/spacecraftinstruments/CMakeLists.txt @@ -22,9 +22,9 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) -set(HEADER_FILES +set(HEADER_FILES dashboard/dashboarditeminstruments.h rendering/renderablecrawlingline.h rendering/renderablefov.h diff --git a/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp b/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp index bd4730c157..4aad6ce2a9 100644 --- a/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp +++ b/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp @@ -39,8 +39,6 @@ #include namespace { - constexpr std::string_view _loggerCat = "RenderablePlanetProjection"; - constexpr std::array MainUniformNames = { "sun_pos", "modelTransform", "modelViewProjectionTransform", "hasBaseMap", "hasHeightMap", "heightExaggeration", "meridianShift", "ambientBrightness", @@ -52,7 +50,6 @@ namespace { "boresight", "radius", "segments" }; - constexpr std::string_view KeyRadius = "Geometry.Radius"; constexpr std::string_view NoImageText = "No Image"; constexpr openspace::properties::Property::PropertyInfo ColorTexturePathsInfo = { diff --git a/modules/spout/CMakeLists.txt b/modules/spout/CMakeLists.txt index 8874b449a4..8cbb806213 100644 --- a/modules/spout/CMakeLists.txt +++ b/modules/spout/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES renderableplanespout.h diff --git a/modules/statemachine/CMakeLists.txt b/modules/statemachine/CMakeLists.txt index 36c3ea6b87..55b3d8aa31 100644 --- a/modules/statemachine/CMakeLists.txt +++ b/modules/statemachine/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/state.h diff --git a/modules/statemachine/statemachinemodule.cpp b/modules/statemachine/statemachinemodule.cpp index dfda04c8ee..3a4a15b807 100644 --- a/modules/statemachine/statemachinemodule.cpp +++ b/modules/statemachine/statemachinemodule.cpp @@ -69,8 +69,8 @@ void StateMachineModule::initializeStateMachine(const ghoul::Dictionary& states, )); } catch (const documentation::SpecificationError& e) { - LERROR(ghoul::to_string(e.result)); LERROR(fmt::format("Error loading state machine: {}", e.what())); + logError(e); } } diff --git a/modules/sync/CMakeLists.txt b/modules/sync/CMakeLists.txt index c3341a2057..fd88a89ebb 100644 --- a/modules/sync/CMakeLists.txt +++ b/modules/sync/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES syncmodule.h diff --git a/modules/touch/CMakeLists.txt b/modules/touch/CMakeLists.txt index 0c0d8dca37..778c756fda 100644 --- a/modules/touch/CMakeLists.txt +++ b/modules/touch/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES ext/levmarq.h @@ -57,5 +57,6 @@ create_new_module( ${HEADER_FILES} ${SOURCE_FILES} ${SHADER_FILES} ) -include_external_library(${touch_module} PRIVATE libTUIO11 ${CMAKE_CURRENT_SOURCE_DIR}/ext) -disable_external_warnings_for_file(${CMAKE_CURRENT_SOURCE_DIR}/ext/levmarq.cpp) +add_subdirectory(ext SYSTEM) +target_link_libraries(${touch_module} PRIVATE libTUIO11) +set_target_properties(libTUIO11 PROPERTIES FOLDER "External") diff --git a/modules/touch/include/touchinteraction.h b/modules/touch/include/touchinteraction.h index b492bbb5d6..44fd1c237b 100644 --- a/modules/touch/include/touchinteraction.h +++ b/modules/touch/include/touchinteraction.h @@ -41,7 +41,6 @@ #include //#define TOUCH_DEBUG_PROPERTIES -//#define TOUCH_DEBUG_NODE_PICK_MESSAGES namespace openspace { @@ -51,9 +50,9 @@ class SceneGraphNode; // Class used for keeping track of the recent average frame time class FrameTimeAverage { public: - //Update the circular buffer with the most recent frame time + // Update the circular buffer with the most recent frame time void updateWithNewFrame(double sample); - //Get the value of the most recent average frame time (seconds) + // Get the value of the most recent average frame time (seconds) double averageFrameTime() const; private: @@ -67,13 +66,11 @@ class TouchInteraction : public properties::PropertyOwner { public: TouchInteraction(); - // for interpretInteraction() - enum Type { + enum class InteractionType { ROTATION = 0, PINCH, PAN, ROLL, - PICK, ZOOM_OUT }; @@ -85,18 +82,19 @@ public: glm::dvec2 pan = glm::dvec2(0.0); }; - /* Main function call + /** + * Main function call * 1 Checks if doubleTap occured * 2 If the node in focus is large enough and all contact points have selected it, * calls directControl() function for direct-manipulation - * 3 Updates std::vector _selected (only if LMA successfully + * 3 Updates std::vector _selectedContactPoints (only if LMA successfully * converged, avoids interaction to snap on LMA fails) * 4 If directControl() wasn't called this frame, interpret the incoming * list and decide what type of interaction this frame should do * 5 Compute the new total velocities after interaction * 6 Evaluate if directControl should be called next frame- true if all contact points * select the same node and said node is larger than _nodeRadiusThreshold - */ + */ void updateStateFromInput(const std::vector& list, std::vector& lastProcessed); @@ -109,46 +107,43 @@ public: // Sets _tap to true, called if tap occured current frame (called from touchmodule) void tap(); - // Set touchactive as true from the touchmodule if incoming list isn't empty, used to - // void mouse input - void touchActive(bool active); - // Get & Setters - Camera* getCamera(); - const SceneGraphNode* getFocusNode(); - void setFocusNode(const SceneGraphNode* focusNode); void setCamera(Camera* camera); private: - /* Function that calculates the new camera state such that it minimizes the L2 error + /** + * Function that calculates the new camera state such that it minimizes the L2 error * in screenspace * between contact points and surface coordinates projected to clip space using LMA */ void directControl(const std::vector& list); - /* Traces each contact point into the scene as a ray - * if the ray hits a node, save the id, node and surface coordinates the cursor hit - * in the list _selected + /** + * Traces each contact point into the scene as a ray and find the intersection + * points on the surface of the current anchor node, if any. Saves the input id + * the node and surface coordinates the cursor hit */ - void findSelectedNode(const std::vector& list); + void updateNodeSurfacePoints(const std::vector& list); - /* Returns an int (ROT = 0, PINCH, PAN, ROLL, PICK) for what interaction to be used, - * depending on what input was gotten + /** + * Returns an enum for what interaction to be used, depending on what input was + * received */ - int interpretInteraction(const std::vector& list, + InteractionType interpretInteraction(const std::vector& list, const std::vector& lastProcessed); // Compute new velocity according to the interpreted action void computeVelocities(const std::vector& list, const std::vector& lastProcessed); - //Compute velocity based on double-tap for zooming + // Compute velocity based on double-tap for zooming double computeTapZoomDistance(double zoomGain); - //Compute coefficient for velocity decay to be applied in decceleration + // Compute coefficient for velocity decay to be applied in decceleration double computeConstTimeDecayCoefficient(double velocity); - /* Decelerate the velocities. Function is called in step() but is dereferenced from + /** + * Decelerate the velocities. Function is called in step() but is dereferenced from * frame time to assure same behaviour on all systems */ void decelerate(double dt); @@ -156,12 +151,13 @@ private: // Resets all properties that can be changed in the GUI to default void resetPropertiesToDefault(); + // Set all velocities to zero + void resetVelocities(); + Camera* _camera = nullptr; // Property variables - properties::StringProperty _origin; properties::BoolProperty _unitTest; - properties::BoolProperty _touchActive; properties::BoolProperty _disableZoom; properties::BoolProperty _disableRoll; properties::TriggerProperty _reset; @@ -170,10 +166,7 @@ private: properties::FloatProperty _touchScreenSize; properties::FloatProperty _tapZoomFactor; properties::FloatProperty _pinchZoomFactor; - properties::FloatProperty _nodeRadiusThreshold; properties::FloatProperty _rollAngleThreshold; - properties::FloatProperty _orbitSpeedThreshold; - properties::FloatProperty _spinSensitivity; properties::FloatProperty _zoomSensitivityExponential; properties::FloatProperty _zoomSensitivityProportionalDist; properties::FloatProperty _zoomSensitivityDistanceThreshold; @@ -184,11 +177,12 @@ private: properties::FloatProperty _centroidStillThreshold; properties::BoolProperty _panEnabled; properties::FloatProperty _interpretPan; - properties::FloatProperty _slerpTime; properties::Vec4Property _friction; - properties::FloatProperty _pickingRadiusMinimum; properties::FloatProperty _constTimeDecay_secs; + properties::BoolProperty _enableDirectManipulation; + properties::FloatProperty _directTouchDistanceThreshold; + #ifdef TOUCH_DEBUG_PROPERTIES struct DebugProperties : PropertyOwner { DebugProperties(); @@ -205,14 +199,13 @@ private: int stepVelUpdate = 0; #endif std::array _pinchInputs; + // Class variables VelocityStates _vel; VelocityStates _lastVel; VelocityStates _sensitivity; - double _projectionScaleFactor = 1.000004; - double _currentRadius = 1.0; - double _slerpdT = 10001.0; + bool _isWithinDirectTouchDistance = false; double _timeSlack = 0.0; std::chrono::milliseconds _time; bool _directTouchMode = false; @@ -220,12 +213,9 @@ private: bool _tap = false; bool _doubleTap = false; bool _zoomOutTap = false; - bool _lmSuccess = true; - std::vector _selected; - SceneGraphNode* _pickingSelected = nullptr; - DirectInputSolver _solver; + std::vector _selectedNodeSurfacePoints; + DirectInputSolver _directInputSolver; - glm::dquat _toSlerp = glm::dquat(1.0, 0.0, 0.0, 0.0); glm::vec2 _centroid = glm::vec2(0.f); FrameTimeAverage _frameTimeAvg; diff --git a/modules/touch/shaders/marker_fs.glsl b/modules/touch/shaders/marker_fs.glsl index 3815eb1b7d..9d9018a9b9 100644 --- a/modules/touch/shaders/marker_fs.glsl +++ b/modules/touch/shaders/marker_fs.glsl @@ -33,20 +33,28 @@ uniform vec3 color; Fragment getFragment() { - // calculate normal from texture coordinates + // Calculate normal from texture coordinates vec3 n; n.xy = gl_PointCoord.st * vec2(2.0, -2.0) + vec2(-1.0, 1.0); float mag = dot(n.xy, n.xy); - if (mag > 1.0) { - // kill pixels outside circle - discard; + + float edgeSmoothing = 1.0; + float w = 0.1; // wdith for smoothing + if (mag > 1.0 - w) { + // Kill pixels outside circle. Do a smoothstep for soft border + float t = (mag - (1.0-w)) / w; + edgeSmoothing = smoothstep(1.0, 0.0, t); + if (edgeSmoothing <= 0.0) { + discard; + } } n.z = sqrt(1.0 - mag); - - // calculate lighting + + // Calculate lighting vec3 light_dir = vec3(0.0, 0.0, 1.0); float diffuse = max(0.0, dot(light_dir, n)); float alpha = min(pow(sqrt(mag), thickness), opacity); + alpha *= edgeSmoothing; Fragment frag; frag.color = vec4(color * diffuse, alpha); diff --git a/modules/touch/src/directinputsolver.cpp b/modules/touch/src/directinputsolver.cpp index b0665ce5da..89360bfb3c 100644 --- a/modules/touch/src/directinputsolver.cpp +++ b/modules/touch/src/directinputsolver.cpp @@ -212,6 +212,13 @@ bool DirectInputSolver::solve(const std::vector& list, const std::vector& selectedBodies, std::vector* parameters, const Camera& camera) { + ZoneScopedN("Direct touch input solver") + + ghoul_assert( + selectedBodies.size() >= list.size(), + "Number of touch inputs must match the number of 'selected bodies'" + ); + int nFingers = std::min(static_cast(list.size()), 3); _nDof = std::min(nFingers * 2, 6); diff --git a/modules/touch/src/touchinteraction.cpp b/modules/touch/src/touchinteraction.cpp index dcce4ae840..63fb656faa 100644 --- a/modules/touch/src/touchinteraction.cpp +++ b/modules/touch/src/touchinteraction.cpp @@ -22,19 +22,13 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include - -#ifdef OPENSPACE_MODULE_GLOBEBROWSING_ENABLED -#include -#include -#endif - #include + #include +#include #include #include #include -#include #include #include #include @@ -68,12 +62,6 @@ namespace { constexpr std::string_view _loggerCat = "TouchInteraction"; - constexpr openspace::properties::Property::PropertyInfo OriginInfo = { - "Origin", - "Origin", - "" // @TODO Missing documentation - }; - constexpr openspace::properties::Property::PropertyInfo UnitTestInfo = { "UnitTest", "Take a unit test saving the LM data into file", @@ -95,13 +83,6 @@ namespace { "" // @TODO Missing documentation }; - constexpr openspace::properties::Property::PropertyInfo EventsInfo = { - "TouchEvents", - "True if we have a touch event", - "", - openspace::properties::Property::Visibility::Hidden - }; - constexpr openspace::properties::Property::PropertyInfo SetDefaultInfo = { "SetDefault", "Reset all properties to default", @@ -139,30 +120,12 @@ namespace { "sensitivity that will alter the pinch-zoom speed" }; - constexpr openspace::properties::Property::PropertyInfo DirectManipulationInfo = { - "DirectManipulationRadius", - "Radius a planet has to have to activate direct-manipulation", - "" // @TODO Missing documentation - }; - constexpr openspace::properties::Property::PropertyInfo RollThresholdInfo = { "RollThreshold", "Threshold for min angle for roll interpret", "" // @TODO Missing documentation }; - constexpr openspace::properties::Property::PropertyInfo OrbitSpinningThreshold = { - "OrbitThreshold", - "Threshold to activate orbit spinning in direct-manipulation", - "" // @TODO Missing documentation - }; - - constexpr openspace::properties::Property::PropertyInfo SpinningSensitivityInfo = { - "SpinningSensitivity", - "Sensitivity of spinning in direct-manipulation", - "" // @TODO Missing documentation - }; - constexpr openspace::properties::Property::PropertyInfo ZoomSensitivityExpInfo = { "ZoomSensitivityExp", "Sensitivity of exponential zooming in relation to distance from focus node", @@ -221,12 +184,6 @@ namespace { "" // @TODO Missing documentation }; - constexpr openspace::properties::Property::PropertyInfo SlerpTimeInfo = { - "SlerpTime", - "Time to slerp in seconds to new orientation with new node picking", - "" // @TODO Missing documentation - }; - constexpr openspace::properties::Property::PropertyInfo FrictionInfo = { "Friction", "Friction for different interactions (orbit, zoom, roll, pan)", @@ -249,6 +206,24 @@ namespace { "defaults to the surface of the current anchor." }; + constexpr openspace::properties::Property::PropertyInfo + EnableDirectManipulationInfo = + { + "EnableDirectManipulation", + "Enable direct manipulation", + "Decides whether the direct manipulation mode should be enabled or not. " + }; + + constexpr openspace::properties::Property::PropertyInfo + DirectManipulationThresholdInfo = + { + "DirectManipulationThreshold", + "Direct manipulation threshold", + "This threshold affects the distance from the interaction sphere at which the " + "direct manipulation interaction mode starts being active. The value is given " + "as a factor times the interaction sphere" + }; + // Compute coefficient of decay based on current frametime; if frametime has been // longer than usual then multiple decay steps may be applied to keep the decay // relative to user time @@ -266,22 +241,17 @@ namespace openspace { TouchInteraction::TouchInteraction() : properties::PropertyOwner({ "TouchInteraction" }) - , _origin(OriginInfo) , _unitTest(UnitTestInfo, false) - , _touchActive(EventsInfo, false) , _disableZoom(DisableZoomInfo, false) , _disableRoll(DisableRollInfo, false) , _reset(SetDefaultInfo) , _maxTapTime(MaxTapTimeInfo, 300, 10, 1000) , _deceleratesPerSecond(DecelatesPerSecondInfo, 240, 60, 300) - , _touchScreenSize(TouchScreenSizeInfo, 55.0f, 5.5f, 150.0f) + , _touchScreenSize(TouchScreenSizeInfo, 55.f, 5.5f, 150.f) , _tapZoomFactor(TapZoomFactorInfo, 0.2f, 0.f, 0.5f, 0.01f) , _pinchZoomFactor(PinchZoomFactorInfo, 0.01f, 0.f, 0.2f) - , _nodeRadiusThreshold(DirectManipulationInfo, 0.2f, 0.0f, 1.0f) , _rollAngleThreshold(RollThresholdInfo, 0.025f, 0.f, 0.05f, 0.001f) - , _orbitSpeedThreshold(OrbitSpinningThreshold, 0.005f, 0.f, 0.01f, 0.0001f) - , _spinSensitivity(SpinningSensitivityInfo, 0.25f, 0.f, 2.f, 0.01f) - , _zoomSensitivityExponential(ZoomSensitivityExpInfo, 1.03f, 1.0f, 1.1f) + , _zoomSensitivityExponential(ZoomSensitivityExpInfo, 1.03f, 1.f, 1.1f) , _zoomSensitivityProportionalDist(ZoomSensitivityPropInfo, 11.f, 5.f, 50.f) , _zoomSensitivityDistanceThreshold( ZoomSensitivityDistanceThresholdInfo, @@ -289,7 +259,7 @@ TouchInteraction::TouchInteraction() 0.01f, 0.25f ) - , _zoomBoundarySphereMultiplier(ZoomBoundarySphereMultiplierInfo, 1.001f, 0.01f, 10000.0f) + , _zoomBoundarySphereMultiplier(ZoomBoundarySphereMultiplierInfo, 1.001f, 0.01f, 10000.f) , _zoomInLimit(ZoomInLimitInfo, -1.0, 0.0, std::numeric_limits::max()) , _zoomOutLimit( ZoomOutLimitInfo, @@ -298,31 +268,25 @@ TouchInteraction::TouchInteraction() std::numeric_limits::max() ) , _inputStillThreshold(InputSensitivityInfo, 0.0005f, 0.f, 0.001f, 0.0001f) - // used to void wrongly interpreted roll interactions + // Used to void wrongly interpreted roll interactions , _centroidStillThreshold(StationaryCentroidInfo, 0.0018f, 0.f, 0.01f, 0.0001f) , _panEnabled(PanModeInfo, false) , _interpretPan(PanDeltaDistanceInfo, 0.015f, 0.f, 0.1f) - , _slerpTime(SlerpTimeInfo, 3.f, 0.1f, 5.f) , _friction( FrictionInfo, glm::vec4(0.025f, 0.025f, 0.02f, 0.001f), glm::vec4(0.f), glm::vec4(0.2f) ) - , _pickingRadiusMinimum( - { "Picking Radius", "Minimum radius for picking in NDC coordinates", "" }, - 0.1f, - 0.f, - 1.f - ) - , _constTimeDecay_secs(ConstantTimeDecaySecsInfo, 1.75f, 0.1f, 4.0f) + , _constTimeDecay_secs(ConstantTimeDecaySecsInfo, 1.75f, 0.1f, 4.f) , _pinchInputs({ TouchInput(0, 0, 0.0, 0.0, 0.0), TouchInput(0, 0, 0.0, 0.0, 0.0) }) , _vel{ glm::dvec2(0.0), 0.0, 0.0, glm::dvec2(0.0) } , _sensitivity{ glm::dvec2(0.08, 0.045), 12.0, 2.75, glm::dvec2(0.08, 0.045) } - // calculated with two vectors with known diff in length, then + // Calculated with two vectors with known diff in length, then // projDiffLength/diffLength. + , _enableDirectManipulation(EnableDirectManipulationInfo, true) + , _directTouchDistanceThreshold(DirectManipulationThresholdInfo, 5.f, 0.f, 10.f) { - addProperty(_touchActive); addProperty(_disableZoom); addProperty(_disableRoll); addProperty(_unitTest); @@ -332,10 +296,7 @@ TouchInteraction::TouchInteraction() addProperty(_touchScreenSize); addProperty(_tapZoomFactor); addProperty(_pinchZoomFactor); - addProperty(_nodeRadiusThreshold); addProperty(_rollAngleThreshold); - addProperty(_orbitSpeedThreshold); - addProperty(_spinSensitivity); addProperty(_zoomSensitivityExponential); addProperty(_zoomSensitivityProportionalDist); addProperty(_zoomSensitivityDistanceThreshold); @@ -347,25 +308,15 @@ TouchInteraction::TouchInteraction() addProperty(_centroidStillThreshold); addProperty(_panEnabled); addProperty(_interpretPan); - addProperty(_slerpTime); addProperty(_friction); - addProperty(_pickingRadiusMinimum); + + addProperty(_enableDirectManipulation); + addProperty(_directTouchDistanceThreshold); #ifdef TOUCH_DEBUG_PROPERTIES addPropertySubOwner(_debugProperties); #endif - _origin.onChange([this]() { - SceneGraphNode* node = sceneGraphNode(_origin.value()); - if (node) { - setFocusNode(node); - } - else { - LWARNING(fmt::format( - "Could not find a node in scenegraph called '{}'", _origin.value() - )); - } - }); _time = std::chrono::duration_cast( std::chrono::high_resolution_clock::now().time_since_epoch() ); @@ -378,97 +329,90 @@ TouchInteraction::TouchInteraction() void TouchInteraction::updateStateFromInput(const std::vector& list, std::vector& lastProcessed) { + size_t numFingers = list.size(); + #ifdef TOUCH_DEBUG_PROPERTIES - _debugProperties.nFingers = list.size(); + _debugProperties.nFingers = numFingers; #endif - OpenSpaceEngine::Mode mode = global::openSpaceEngine->currentMode(); - if (mode == OpenSpaceEngine::Mode::CameraPath || - mode == OpenSpaceEngine::Mode::SessionRecordingPlayback) - { + if (numFingers == 0) { + // No fingers, no input (note that this function should not even be called then) return; } if (_tap) { - // check for doubletap + // @TODO (2023-02-01, emmbr) This if is not triggered on every touch tap. + // Why? + + // Check for doubletap using namespace std::chrono; milliseconds timestamp = duration_cast( high_resolution_clock::now().time_since_epoch() ); if ((timestamp - _time).count() < _maxTapTime) { - LINFO("Double tap!"); _doubleTap = true; _tap = false; } _time = timestamp; } + // Code for lower-right corner double-tap to zoom-out - const glm::vec2 res = global::windowDelegate->currentWindowSize(); - const glm::vec2 pos = list[0].latestInput().screenCoordinates(res); + { + const glm::vec2 res = global::windowDelegate->currentWindowSize(); + const glm::vec2 pos = list[0].latestInput().screenCoordinates(res); - const float bottomCornerSizeForZoomTap_fraction = 0.08f; - const int zoomTapThresholdX = static_cast( - res.x * (1.f - bottomCornerSizeForZoomTap_fraction) - ); - const int zoomTapThresholdY = static_cast( - res.y * (1.f - bottomCornerSizeForZoomTap_fraction) - ); + const float bottomCornerSizeForZoomTap_fraction = 0.08f; + const int zoomTapThresholdX = static_cast( + res.x * (1.f - bottomCornerSizeForZoomTap_fraction) + ); + const int zoomTapThresholdY = static_cast( + res.y * (1.f - bottomCornerSizeForZoomTap_fraction) + ); - const bool isTapInLowerRightCorner = - (std::abs(pos.x) > zoomTapThresholdX && std::abs(pos.y) > zoomTapThresholdY); + const bool isTapInLowerRightCorner = + (std::abs(pos.x) > zoomTapThresholdX && std::abs(pos.y) > zoomTapThresholdY); - if (_doubleTap && isTapInLowerRightCorner) { - _zoomOutTap = true; - _tap = false; - _doubleTap = false; + if (_doubleTap && isTapInLowerRightCorner) { + _zoomOutTap = true; + _tap = false; + _doubleTap = false; + } } - size_t numFingers = list.size(); bool isTransitionBetweenModes = (_wasPrevModeDirectTouch != _directTouchMode); if (isTransitionBetweenModes) { - _vel.orbit = glm::dvec2(0.0); - _vel.zoom = 0.0; - _vel.roll = 0.0; - _vel.pan = glm::dvec2(0.0); + resetVelocities(); resetAfterInput(); } - if (_directTouchMode && _selected.size() > 0 && numFingers == _selected.size()) { + _directTouchMode = _enableDirectManipulation && + _isWithinDirectTouchDistance && + !_selectedNodeSurfacePoints.empty() && + numFingers == _selectedNodeSurfacePoints.size(); + + if (_directTouchMode) { #ifdef TOUCH_DEBUG_PROPERTIES _debugProperties.interactionMode = "Direct"; #endif directControl(list); } - if (_lmSuccess) { - findSelectedNode(list); - } - - if (!_directTouchMode) { + else { #ifdef TOUCH_DEBUG_PROPERTIES _debugProperties.interactionMode = "Velocities"; #endif computeVelocities(list, lastProcessed); } + if (_enableDirectManipulation && _isWithinDirectTouchDistance) { + updateNodeSurfacePoints(list); + } + _wasPrevModeDirectTouch = _directTouchMode; - // evaluates if current frame is in directTouchMode (will be used next frame) - _directTouchMode = - (_currentRadius > _nodeRadiusThreshold && _selected.size() == numFingers); } void TouchInteraction::directControl(const std::vector& list) { // Reset old velocities upon new interaction - _vel.orbit = glm::dvec2(0.0); - _vel.zoom = 0.0; - _vel.roll = 0.0; - _vel.pan = glm::dvec2(0.0); - - OpenSpaceEngine::Mode mode = global::openSpaceEngine->currentMode(); - if (mode == OpenSpaceEngine::Mode::CameraPath || - mode == OpenSpaceEngine::Mode::SessionRecordingPlayback) - { - return; - } + resetVelocities(); #ifdef TOUCH_DEBUG_PROPERTIES LINFO("DirectControl"); @@ -478,10 +422,10 @@ void TouchInteraction::directControl(const std::vector& list) std::vector par(6, 0.0); par[0] = _lastVel.orbit.x; // use _lastVel for orbit par[1] = _lastVel.orbit.y; - _lmSuccess = _solver.solve(list, _selected, &par, *_camera); - int nDof = _solver.nDof(); + bool lmSuccess = _directInputSolver.solve(list, _selectedNodeSurfacePoints, &par, *_camera); + int nDof = _directInputSolver.nDof(); - if (_lmSuccess && !_unitTest) { + if (lmSuccess && !_unitTest) { // If good values were found set new camera state _vel.orbit = glm::dvec2(par.at(0), par.at(1)); if (nDof > 2) { @@ -500,51 +444,38 @@ void TouchInteraction::directControl(const std::vector& list) // Reset velocities after setting new camera state _lastVel = _vel; - _vel.orbit = glm::dvec2(0.0); - _vel.zoom = 0.0; - _vel.roll = 0.0; - _vel.pan = glm::dvec2(0.0); + resetVelocities(); } else { - // prevents touch to infinitely be active (due to windows bridge case where event + // Prevents touch to infinitely be active (due to windows bridge case where event // doesn't get consumed sometimes when LMA fails to converge) resetAfterInput(); } } -void TouchInteraction::findSelectedNode(const std::vector& list) { - // trim list to only contain visible nodes that make sense - // @TODO (emmbr 2023-01-31) This hardcoded list should be removed and replaced by something - // else. Either a type of renderable that can always be directly manipulated, or a list - // that can be set in config/assets. Or both? - std::string selectables[31] = { - "Sun", "Mercury", "Venus", "Earth", "Mars", "Ceres", "Jupiter", "Saturn", "Uranus", - "Neptune", "Pluto", "Moon", "Titan", "Rhea", "Mimas", "Iapetus", "Enceladus", - "Dione", "Io", "Ganymede", "Europa", "Callisto", "NewHorizons", "Styx", "Nix", - "Kerberos", "Hydra", "Charon", "Tethys", "OsirisRex", "Bennu" - }; - std::vector selectableNodes; - for (SceneGraphNode* node : global::renderEngine->scene()->allSceneGraphNodes()) { - for (const std::string& name : selectables) { - if (node->identifier() == name) { - selectableNodes.push_back(node); - } - } +void TouchInteraction::updateNodeSurfacePoints(const std::vector& list) { + _selectedNodeSurfacePoints.clear(); + + const SceneGraphNode* anchor = + global::navigationHandler->orbitalNavigator().anchorNode(); + SceneGraphNode* node = sceneGraphNode(anchor->identifier()); + + // Check if current anchor is valid for direct touch + TouchModule* module = global::moduleEngine->module(); + + bool isDirectTouchRenderable = node->renderable() && + module->isDefaultDirectTouchType(node->renderable()->typeAsString()); + + if (!(node->supportsDirectInteraction() || isDirectTouchRenderable)) { + return; } glm::dquat camToWorldSpace = _camera->rotationQuaternion(); glm::dvec3 camPos = _camera->positionVec3(); - std::vector newSelected; - - // node & distance - std::pair currentlyPicked = { - nullptr, - std::numeric_limits::max() - }; - + std::vector surfacePoints; for (const TouchInputHolder& inputHolder : list) { - // normalized -1 to 1 coordinates on screen + // Normalized -1 to 1 coordinates on screen double xCo = 2 * (inputHolder.latestInput().x - 0.5); double yCo = -2 * (inputHolder.latestInput().y - 0.5); glm::dvec3 cursorInWorldSpace = camToWorldSpace * @@ -554,106 +485,37 @@ void TouchInteraction::findSelectedNode(const std::vector& lis size_t id = inputHolder.fingerId(); - for (SceneGraphNode* node : selectableNodes) { - double interactionSphereSquared = - node->interactionSphere() * node->interactionSphere(); - glm::dvec3 camToSelectable = node->worldPosition() - camPos; - double intersectionDist = 0.0; - const bool intersected = glm::intersectRaySphere( - camPos, - raytrace, - node->worldPosition(), - interactionSphereSquared, - intersectionDist - ); - if (intersected) { - glm::dvec3 intersectionPos = camPos + raytrace * intersectionDist; - glm::dvec3 pointInModelView = glm::inverse(node->worldRotationMatrix()) * - (intersectionPos - node->worldPosition()); + // Compute positions on anchor node, by checking if touch input + // intersect interaction sphere + double intersectionDist = 0.0; + const bool intersected = glm::intersectRaySphere( + camPos, + raytrace, + node->worldPosition(), + node->interactionSphere() * node->interactionSphere(), + intersectionDist + ); - // Add id, node and surface coordinates to the selected list - auto oldNode = std::find_if( - newSelected.begin(), - newSelected.end(), - [id](const DirectInputSolver::SelectedBody& s) { return s.id == id; } - ); - if (oldNode != newSelected.end()) { - const double oldNodeDist = glm::length( - oldNode->node->worldPosition() - camPos - ); - if (glm::length(camToSelectable) < oldNodeDist) { - // new node is closer, remove added node and add the new one - // instead - newSelected.pop_back(); - newSelected.push_back({ id, node, pointInModelView }); - } - } - else { - newSelected.push_back({ id, node, pointInModelView }); - } - } + if (intersected) { + glm::dvec3 intersectionPos = camPos + raytrace * intersectionDist; + glm::dvec3 pointInModelView = glm::inverse(node->worldRotationMatrix()) * + (intersectionPos - node->worldPosition()); - // Compute locations in view space to perform the picking - glm::dvec4 clip = glm::dmat4(_camera->projectionMatrix()) * - _camera->combinedViewMatrix() * - glm::vec4(node->worldPosition(), 1.0); - glm::dvec2 ndc = clip / clip.w; - - const bool isVisibleX = (ndc.x >= -1.0 && ndc.x <= 1.0); - const bool isVisibleY = (ndc.y >= -1.0 && ndc.y <= 1.0); - if (isVisibleX && isVisibleY) { - glm::dvec2 cursor = glm::dvec2(xCo, yCo); - - const double ndcDist = glm::length(ndc - cursor); - // We either want to select the object if it's bounding sphere as been - // touched (checked by the first part of this loop above) or if the touch - // point is within a minimum distance of the center - - // If the user touched the planet directly, this is definitely the one - // they are interested in => minimum distance - if (intersected) { -#ifdef TOUCH_DEBUG_NODE_PICK_MESSAGES - LINFOC( - node->identifier(), - "Picking candidate based on direct touch" - ); -#endif //#ifdef TOUCH_DEBUG_NODE_PICK_MESSAGES - currentlyPicked = std::pair( - node, - -std::numeric_limits::max() - ); - } - else if (ndcDist <= _pickingRadiusMinimum) { - // The node was considered due to minimum picking distance radius -#ifdef TOUCH_DEBUG_NODE_PICK_MESSAGES - LINFOC( - node->identifier(), - "Picking candidate based on proximity" - ); -#endif //#ifdef TOUCH_DEBUG_NODE_PICK_MESSAGES - const double dist = length(camToSelectable); - if (dist < currentlyPicked.second) { - currentlyPicked = std::make_pair(node, dist); - } - } - } + // Note that node is saved as the direct input solver was initially + // implemented to handle touch contact points on multiple nodes + surfacePoints.push_back({ id, node, pointInModelView }); } } - // If an item has been picked, it's in the first position of the vector now - if (SceneGraphNode* node = currentlyPicked.first) { - _pickingSelected = node; -#ifdef TOUCH_DEBUG_NODE_PICK_MESSAGES - LINFOC("Picking", "Picked node: " + _pickingSelected->identifier()); -#endif //#ifdef TOUCH_DEBUG_NODE_PICK_MESSAGES - } - - _selected = std::move(newSelected); + _selectedNodeSurfacePoints = std::move(surfacePoints); } -int TouchInteraction::interpretInteraction(const std::vector& list, +TouchInteraction::InteractionType +TouchInteraction::interpretInteraction(const std::vector& list, const std::vector& lastProcessed) { + ghoul_assert(!list.empty(), "Cannot interpret interaction of no input"); + glm::fvec2 lastCentroid = _centroid; _centroid = glm::vec2(0.f, 0.f); for (const TouchInputHolder& inputHolder : list) { @@ -664,7 +526,7 @@ int TouchInteraction::interpretInteraction(const std::vector& } _centroid /= static_cast(list.size()); - // see if the distance between fingers changed - used in pan interpretation + // See if the distance between fingers changed - used in pan interpretation double dist = 0; double lastDist = 0; TouchInput distInput = list[0].latestInput(); @@ -682,7 +544,7 @@ int TouchInteraction::interpretInteraction(const std::vector& glm::dvec2(distInput.x, distInput.y)); distInput = p; } - // find the slowest moving finger - used in roll interpretation + // Find the slowest moving finger - used in roll interpretation double minDiff = 1000.0; for (const TouchInputHolder& inputHolder : list) { const auto it = std::find_if( @@ -707,7 +569,7 @@ int TouchInteraction::interpretInteraction(const std::vector& minDiff = diff; } } - // find if all fingers angles are high - used in roll interpretation + // Find if all fingers angles are high - used in roll interpretation double rollOn = std::accumulate( list.begin(), list.end(), @@ -757,29 +619,26 @@ int TouchInteraction::interpretInteraction(const std::vector& #endif if (_zoomOutTap) { - return ZOOM_OUT; - } - else if (_doubleTap) { - return PICK; + return InteractionType::ZOOM_OUT; } else if (list.size() == 1) { - return ROTATION; + return InteractionType::ROTATION; } else { float avgDistance = static_cast(std::abs(dist - lastDist)); - // if average distance between 3 fingers are constant we have panning + // If average distance between 3 fingers are constant we have panning if (_panEnabled && (avgDistance < _interpretPan && list.size() == 3)) { - return PAN; + return InteractionType::PAN; } - // we have roll if one finger is still, or the total roll angles around the + // We have roll if one finger is still, or the total roll angles around the // centroid is over _rollAngleThreshold (_centroidStillThreshold is used to void // misinterpretations) else if (std::abs(minDiff) < _inputStillThreshold || (std::abs(rollOn) < 100.0 && normalizedCentroidDistance < _centroidStillThreshold)) { - return ROLL; + return InteractionType::ROLL; } else { const bool sameInput0 = _pinchInputs[0].holdsInput(list[0].latestInput()); @@ -791,7 +650,7 @@ int TouchInteraction::interpretInteraction(const std::vector& _pinchInputs[0] = TouchInputHolder(list[0].latestInput()); _pinchInputs[1] = TouchInputHolder(list[1].latestInput()); } - return PINCH; + return InteractionType::PINCH; } } } @@ -799,21 +658,21 @@ int TouchInteraction::interpretInteraction(const std::vector& void TouchInteraction::computeVelocities(const std::vector& list, const std::vector& lastProcessed) { - const int action = interpretInteraction(list, lastProcessed); const SceneGraphNode* anchor = global::navigationHandler->orbitalNavigator().anchorNode(); - if (!anchor) { + if (list.empty() || !anchor) { return; } + const InteractionType action = interpretInteraction(list, lastProcessed); + #ifdef TOUCH_DEBUG_PROPERTIES const std::map interactionNames = { { ROTATION, "Rotation" }, { PINCH, "Pinch" }, { PAN, "Pan" }, - { ROLL, "Roll" }, - { PICK, "Pick" } + { ROLL, "Roll" } }; _debugProperties.interpretedInteraction = interactionNames.at(action); @@ -821,8 +680,7 @@ void TouchInteraction::computeVelocities(const std::vector& li if (pinchConsecCt > 3) { LDEBUG(fmt::format( "PINCH gesture ended with {} drag distance and {} counts", - pinchConsecZoomFactor, - pinchConsecCt + pinchConsecZoomFactor, pinchConsecCt )); } pinchConsecCt = 0; @@ -835,7 +693,8 @@ void TouchInteraction::computeVelocities(const std::vector& li const float aspectRatio = static_cast(windowSize.x) / static_cast(windowSize.y); switch (action) { - case ROTATION: { // add rotation velocity + case InteractionType::ROTATION: { + // Add rotation velocity _vel.orbit += glm::dvec2(inputHolder.speedX() * _sensitivity.orbit.x, inputHolder.speedY() * _sensitivity.orbit.y); @@ -845,13 +704,13 @@ void TouchInteraction::computeVelocities(const std::vector& li ); break; } - case PINCH: { + case InteractionType::PINCH: { if (_disableZoom) { break; } - // add zooming velocity - dependant on distance difference between contact - // points this/first frame + // Add zooming velocity - dependant on distance difference between contact + // points this/first frame using namespace glm; const TouchInput& startFinger0 = _pinchInputs[0].firstInput(); const TouchInput& startFinger1 = _pinchInputs[1].firstInput(); @@ -876,12 +735,12 @@ void TouchInteraction::computeVelocities(const std::vector& li std::max(_touchScreenSize.value() * 0.1, 1.0); break; } - case ROLL: { + case InteractionType::ROLL: { if (_disableRoll) { break; } - // add global roll rotation velocity + // Add global roll rotation velocity double rollFactor = std::accumulate( list.begin(), list.end(), @@ -900,7 +759,7 @@ void TouchInteraction::computeVelocities(const std::vector& li _centroid.x, _centroid.y ); - // if's used to set angles 359 + 1 = 0 and 0 - 1 = 359 + // Ifs used to set angles 359 + 1 = 0 and 0 - 1 = 359 if (lastAngle > currentAngle + 1.5 * glm::pi()) { res += currentAngle + (2 * glm::pi() - lastAngle); } @@ -917,49 +776,24 @@ void TouchInteraction::computeVelocities(const std::vector& li _constTimeDecayCoeff.roll = computeConstTimeDecayCoefficient(_vel.roll); break; } - case PAN: { + case InteractionType::PAN: { if (!_panEnabled) { break; } - // add local rotation velocity + // Add local rotation velocity _vel.pan += glm::dvec2(inputHolder.speedX() * _sensitivity.pan.x, inputHolder.speedY() * _sensitivity.pan.y); double panVelocityAvg = glm::distance(_vel.pan.x, _vel.pan.y); _constTimeDecayCoeff.pan = computeConstTimeDecayCoefficient(panVelocityAvg); break; } - case PICK: { - // pick something in the scene as focus node - if (_pickingSelected) { - setFocusNode(_pickingSelected); - - // rotate camera to look at new focus, using slerp quat - glm::dvec3 camToFocus = _pickingSelected->worldPosition() - - _camera->positionVec3(); - glm::dvec3 forward = glm::normalize(_camera->viewDirectionWorldSpace()); - double angle = glm::angle(forward, camToFocus); - glm::dvec3 axis = glm::normalize(glm::cross(forward, camToFocus)); - _toSlerp.x = axis.x * sin(angle / 2.0); - _toSlerp.y = axis.y * sin(angle / 2.0); - _toSlerp.z = axis.z * sin(angle / 2.0); - _toSlerp.w = cos(angle / 2.0); - _slerpdT = 0.0; - } - else { - // zooms in to current if PICK interpret happened but only space was - // selected - _vel.zoom = computeTapZoomDistance(0.3); - _constTimeDecayCoeff.zoom = computeConstTimeDecayCoefficient(_vel.zoom); - } - break; - } - case ZOOM_OUT: { + case InteractionType::ZOOM_OUT: { if (_disableZoom) { break; } - // zooms out from current if triple tap occurred + // Zooms out from current if triple tap occurred _vel.zoom = computeTapZoomDistance(-1.0); _constTimeDecayCoeff.zoom = computeConstTimeDecayCoefficient(_vel.zoom); } @@ -973,23 +807,18 @@ double TouchInteraction::computeConstTimeDecayCoefficient(double velocity) { if (stepsToDecay > 0.0 && std::abs(velocity) > postDecayVelocityTarget) { return std::pow(postDecayVelocityTarget / std::abs(velocity), 1.0 / stepsToDecay); } - else { - return 1.0; - } + return 1.0; } double TouchInteraction::computeTapZoomDistance(double zoomGain) { const SceneGraphNode* anchor = global::navigationHandler->orbitalNavigator().anchorNode(); + if (!anchor) { return 0.0; } - double dist = glm::distance( - _camera->positionVec3(), - global::navigationHandler->orbitalNavigator().anchorNode()->worldPosition() - ); - + double dist = glm::distance(_camera->positionVec3(), anchor->worldPosition()); dist -= anchor->interactionSphere(); double newVelocity = dist * _tapZoomFactor; @@ -1002,21 +831,11 @@ double TouchInteraction::computeTapZoomDistance(double zoomGain) { // Main update call, calculates the new orientation and position for the camera depending // on _vel and dt. Called every frame void TouchInteraction::step(double dt, bool directTouch) { - OpenSpaceEngine::Mode mode = global::openSpaceEngine->currentMode(); - if (mode == OpenSpaceEngine::Mode::CameraPath || - mode == OpenSpaceEngine::Mode::SessionRecordingPlayback) - { - return; - } - using namespace glm; const SceneGraphNode* anchor = global::navigationHandler->orbitalNavigator().anchorNode(); - // since functions cant be called directly (TouchInteraction not a subclass of - // InteractionMode) - setFocusNode(global::navigationHandler->orbitalNavigator().anchorNode()); if (anchor && _camera) { // Create variables from current state dvec3 camPos = _camera->positionVec3(); @@ -1028,8 +847,7 @@ void TouchInteraction::step(double dt, bool directTouch) { const dvec3 camDirection = _camera->viewDirectionWorldSpace(); // Make a representation of the rotation quaternion with local and global - // rotations - // To avoid problem with lookup in up direction + // rotations. To avoid problem with lookup in up direction const dmat4 lookAtMat = lookAt( dvec3(0.0, 0.0, 0.0), directionToCenter, @@ -1039,9 +857,17 @@ void TouchInteraction::step(double dt, bool directTouch) { dquat localCamRot = inverse(globalCamRot) * _camera->rotationQuaternion(); const double interactionSphere = anchor->interactionSphere(); - const double distance = std::max(length(centerToCamera) - interactionSphere, 0.0); - _currentRadius = interactionSphere / - std::max(distance * _projectionScaleFactor, 1.0); + + // Check if camera is within distance for direct manipulation to be applicable + if (interactionSphere > 0.0 && _enableDirectManipulation) { + const double distance = + std::max(length(centerToCamera) - interactionSphere, 0.0); + const double maxDistance = interactionSphere * _directTouchDistanceThreshold; + _isWithinDirectTouchDistance = distance <= maxDistance; + } + else { + _isWithinDirectTouchDistance = false; + } { // Roll @@ -1053,12 +879,6 @@ void TouchInteraction::step(double dt, bool directTouch) { const dvec3 eulerAngles(_vel.pan.y * dt, _vel.pan.x * dt, 0.0); const dquat rotationDiff = dquat(eulerAngles); localCamRot = localCamRot * rotationDiff; - - // if we have chosen a new focus node - if (_slerpdT < _slerpTime) { - _slerpdT += 0.1 * dt; - localCamRot = slerp(localCamRot, _toSlerp, _slerpdT / _slerpTime); - } } { // Orbit (global rotation) @@ -1077,9 +897,10 @@ void TouchInteraction::step(double dt, bool directTouch) { dvec3(_camera->lookUpVectorCameraSpace()); const dmat4 lookAtMatrix = lookAt( - dvec3(0.0, 0.0, 0.0), + dvec3(0.0), directionToCenter, - lookUpWhenFacingCenter); + lookUpWhenFacingCenter + ); globalCamRot = normalize(quat_cast(inverse(lookAtMatrix))); } { @@ -1106,8 +927,10 @@ void TouchInteraction::step(double dt, bool directTouch) { // Because of heightmaps we need to ensure we don't go through the surface if (_zoomInLimit.value() < nodeRadius) { #ifdef TOUCH_DEBUG_PROPERTIES - LINFO(fmt::format("{}: Zoom In limit should be larger than anchor " - "center to surface, setting it to {}", _loggerCat, zoomInBounds)); + LINFO(fmt::format( + "Zoom In limit should be larger than anchor " + "center to surface, setting it to {}", zoomInBounds + )); #endif zoomInBounds = _zoomInLimit.value(); } @@ -1116,8 +939,8 @@ void TouchInteraction::step(double dt, bool directTouch) { // Make sure zoom in limit is not larger than zoom out limit if (zoomInBounds > _zoomOutLimit.value()) { LWARNING(fmt::format( - "{}: Zoom In Limit should be smaller than Zoom Out Limit", - _loggerCat, _zoomOutLimit.value() + "Zoom In Limit should be smaller than Zoom Out Limit", + _zoomOutLimit.value() )); } const double currentPosDistance = length(centerToCamera); @@ -1163,9 +986,10 @@ void TouchInteraction::step(double dt, bool directTouch) { } else if (currentPosViolatingZoomOutLimit) { #ifdef TOUCH_DEBUG_PROPERTIES - LINFOC("", fmt::format( - "{}: You are outside zoom out {} limit, only zoom in allowed", - _loggerCat, _zoomOutLimit.value())); + LINFO(fmt::format( + "You are outside zoom out {} limit, only zoom in allowed", + _zoomOutLimit.value() + )); #endif // Only allow zooming in if you are outside the zoom out limit if (newPosDistance < currentPosDistance) { @@ -1181,6 +1005,19 @@ void TouchInteraction::step(double dt, bool directTouch) { } decelerate(dt); + + // @TODO (emmbr, 2023-02-08) This is ugly, but for now prevents jittering + // when zooming in closer than the orbital navigator allows. Long term, we + // should make the touch interaction tap into the orbitalnavigator and let that + // do the updating of the camera, instead of handling them separately. Then we + // would keep them in sync and avoid duplicated camera updating code. + camPos = + global::navigationHandler->orbitalNavigator().pushToSurfaceOfAnchor(camPos); + + // @TODO (emmbr, 2023-02-08) with the line above, the ZoomInLimit might not be + // needed anymore. We should make it so that just the limit properties in the + // OrbitalNavigator is actually needed, and don't have duplicates + // Update the camera state _camera->setPositionVec3(camPos); _camera->setRotation(globalCamRot * localCamRot); @@ -1194,8 +1031,7 @@ void TouchInteraction::step(double dt, bool directTouch) { stepVelUpdate = 0; LINFO(fmt::format( "DistToFocusNode {} stepZoomVelUpdate {}", - length(centerToCamera), - _vel.zoom + length(centerToCamera), _vel.zoom )); } #endif @@ -1225,13 +1061,6 @@ void TouchInteraction::decelerate(double dt) { //Ensure the number of times to apply the decay coefficient is valid times = std::min(times, 1); - OpenSpaceEngine::Mode mode = global::openSpaceEngine->currentMode(); - if (mode == OpenSpaceEngine::Mode::CameraPath || - mode == OpenSpaceEngine::Mode::SessionRecordingPlayback) - { - return; - } - _vel.orbit *= computeDecayCoeffFromFrametime(_constTimeDecayCoeff.orbit, times); _vel.roll *= computeDecayCoeffFromFrametime(_constTimeDecayCoeff.roll, times); _vel.pan *= computeDecayCoeffFromFrametime(_constTimeDecayCoeff.pan, times); @@ -1244,15 +1073,11 @@ void TouchInteraction::resetAfterInput() { _debugProperties.nFingers = 0; _debugProperties.interactionMode = "None"; #endif - if (_directTouchMode && !_selected.empty() && _lmSuccess) { - double spinDelta = _spinSensitivity / global::windowDelegate->averageDeltaTime(); - if (glm::length(_lastVel.orbit) > _orbitSpeedThreshold) { - // allow node to start "spinning" after direct-manipulation finger is let go - _vel.orbit = _lastVel.orbit * spinDelta; - } - } - - _lmSuccess = true; + // @TODO (emmbr 2023-02-03) Bring back feature that allows node to spin when + // the direct manipulaiton finger is let go. Should implement this using the + // orbitalnavigator's friction values. This also implies passing velocities to + // the orbitalnavigator, instead of setting the camera directly as is currently + // done in this class. // Reset variables _lastVel.orbit = glm::dvec2(0.0); @@ -1264,8 +1089,7 @@ void TouchInteraction::resetAfterInput() { _pinchInputs[0].clearInputs(); _pinchInputs[1].clearInputs(); - _selected.clear(); - _pickingSelected = nullptr; + _selectedNodeSurfacePoints.clear(); } // Reset all property values to default @@ -1275,51 +1099,31 @@ void TouchInteraction::resetPropertiesToDefault() { _disableRoll.set(false); _maxTapTime.set(300); _deceleratesPerSecond.set(240); - _touchScreenSize.set(55.0f); + _touchScreenSize.set(55.f); _tapZoomFactor.set(0.2f); _pinchZoomFactor.set(0.01f); - _nodeRadiusThreshold.set(0.2f); _rollAngleThreshold.set(0.025f); - _orbitSpeedThreshold.set(0.005f); - _spinSensitivity.set(1.0f); _zoomSensitivityExponential.set(1.025f); _inputStillThreshold.set(0.0005f); _centroidStillThreshold.set(0.0018f); _interpretPan.set(0.015f); - _slerpTime.set(3.0f); _friction.set(glm::vec4(0.025f, 0.025f, 0.02f, 0.02f)); } +void TouchInteraction::resetVelocities() { + _vel.orbit = glm::dvec2(0.0); + _vel.zoom = 0.0; + _vel.roll = 0.0; + _vel.pan = glm::dvec2(0.0); +} + void TouchInteraction::tap() { _tap = true; } -void TouchInteraction::touchActive(bool active) { - _touchActive = active; -} - -// Get & Setters -Camera* TouchInteraction::getCamera() { - return _camera; -} - -const SceneGraphNode* TouchInteraction::getFocusNode() { - return global::navigationHandler->orbitalNavigator().anchorNode(); -} void TouchInteraction::setCamera(Camera* camera) { _camera = camera; } -void TouchInteraction::setFocusNode(const SceneGraphNode* focusNode) { - if (focusNode) { - global::navigationHandler->orbitalNavigator().setAnchorNode( - focusNode->identifier() - ); - } - else { - global::navigationHandler->orbitalNavigator().setAnchorNode(""); - } -} - void FrameTimeAverage::updateWithNewFrame(double sample) { if (sample > 0.0005) { _samples[_index++] = sample; diff --git a/modules/touch/src/touchmarker.cpp b/modules/touch/src/touchmarker.cpp index e6401232e2..8d6329a4a8 100644 --- a/modules/touch/src/touchmarker.cpp +++ b/modules/touch/src/touchmarker.cpp @@ -72,7 +72,7 @@ TouchMarker::TouchMarker() , _radiusSize(RadiusInfo, 30.f, 0.f, 100.f) , _opacity(OpacityInfo, 0.8f, 0.f, 1.f) , _thickness(ThicknessInfo, 2.f, 0.f, 4.f) - , _color(ColorInfo, glm::vec3(0.96f, 0.2f, 0.2f), glm::vec3(0.f), glm::vec3(1.f)) + , _color(ColorInfo, glm::vec3(1.f), glm::vec3(0.f), glm::vec3(1.f)) { addProperty(_visible); addProperty(_radiusSize); diff --git a/modules/touch/touchmodule.cpp b/modules/touch/touchmodule.cpp index dfa9ada612..ce9acf6364 100644 --- a/modules/touch/touchmodule.cpp +++ b/modules/touch/touchmodule.cpp @@ -28,44 +28,98 @@ #include #include #include +#include #include #include #include +#include +#include +#include using namespace TUIO; namespace { - constexpr openspace::properties::Property::PropertyInfo TouchActiveInfo = { - "TouchActive", - "True if we want to use touch input as 3D navigation", - "Use this if we want to turn on or off Touch input navigation. " - "Disabling this will reset all current touch inputs to the navigation." + constexpr std::string_view _loggerCat = "TouchModule"; + + constexpr openspace::properties::Property::PropertyInfo EnableTouchInfo = { + "EnableTouchInteraction", + "Enable Touch Interaction", + "Use this property to turn on/off touch input navigation in the 3D scene. " + "Disabling will reset all current touch inputs to the navigation." + }; + + constexpr openspace::properties::Property::PropertyInfo EventsInfo = { + "DetectedTouchEvent", + "Detected Touch Event", + "True when there is an active touch event", + openspace::properties::Property::Visibility::Hidden + }; + + constexpr openspace::properties::Property::PropertyInfo + DefaultDirectTouchRenderableTypesInfo = + { + "DefaultDirectTouchRenderableTypes", + "Default Direct Touch Renderable Types", + "A list of renderable types that will automatically use the \'direct " + "manipulation\' scheme when interacted with, keeping the finger on a static " + "position on the interaction sphere of the object when touching. Good for " + "relatively spherical objects.", + openspace::properties::Property::Visibility::AdvancedUser }; } namespace openspace { TouchModule::TouchModule() : OpenSpaceModule("Touch") - , _touchActive(TouchActiveInfo, true) + , _touchIsEnabled(EnableTouchInfo, true) + , _hasActiveTouchEvent(EventsInfo, false) + , _defaultDirectTouchRenderableTypes(DefaultDirectTouchRenderableTypesInfo) { addPropertySubOwner(_touch); addPropertySubOwner(_markers); - addProperty(_touchActive); - _touchActive.onChange([&] { + addProperty(_touchIsEnabled); + _touchIsEnabled.onChange([&]() { _touch.resetAfterInput(); _lastTouchInputs.clear(); }); + + _hasActiveTouchEvent.setReadOnly(true); + addProperty(_hasActiveTouchEvent); + + _defaultDirectTouchRenderableTypes.onChange([&]() { + _sortedDefaultRenderableTypes.clear(); + for (const std::string& s : _defaultDirectTouchRenderableTypes.value()) { + ghoul::TemplateFactory* fRenderable = + FactoryManager::ref().factory(); + + if (!fRenderable->hasClass(s)) { + LWARNING(fmt::format( + "In property 'DefaultDirectTouchRenderableTypes': '{}' is not a " + "registered renderable type. Ignoring", s + )); + continue; + } + + _sortedDefaultRenderableTypes.insert(s); + } + }); + addProperty(_defaultDirectTouchRenderableTypes); } TouchModule::~TouchModule() { // intentionally left empty } -void TouchModule::internalInitialize(const ghoul::Dictionary& /*dictionary*/){ +bool TouchModule::isDefaultDirectTouchType(std::string_view renderableType) const { + return _sortedDefaultRenderableTypes.find(std::string(renderableType)) != + _sortedDefaultRenderableTypes.end(); +} + +void TouchModule::internalInitialize(const ghoul::Dictionary&){ _ear.reset(new TuioEar()); global::callback::initializeGL->push_back([&]() { - LDEBUGC("TouchModule", "Initializing TouchMarker OpenGL"); + LDEBUG("Initializing TouchMarker OpenGL"); _markers.initialize(); #ifdef WIN32 // We currently only support one window of touch input internally @@ -78,7 +132,7 @@ void TouchModule::internalInitialize(const ghoul::Dictionary& /*dictionary*/){ }); global::callback::deinitializeGL->push_back([&]() { - LDEBUGC("TouchMarker", "Deinitialize TouchMarker OpenGL"); + LDEBUG("Deinitialize TouchMarker OpenGL"); _markers.deinitialize(); }); @@ -104,26 +158,37 @@ void TouchModule::internalInitialize(const ghoul::Dictionary& /*dictionary*/){ global::callback::preSync->push_back([&]() { - if (!_touchActive) { + if (!_touchIsEnabled) { + return; + } + + OpenSpaceEngine::Mode mode = global::openSpaceEngine->currentMode(); + if (mode == OpenSpaceEngine::Mode::CameraPath || + mode == OpenSpaceEngine::Mode::SessionRecordingPlayback) + { + // Reset everything, to avoid problems once we process inputs again + _lastTouchInputs.clear(); + _touch.resetAfterInput(); + clearInputs(); return; } _touch.setCamera(global::navigationHandler->camera()); - _touch.setFocusNode(global::navigationHandler->orbitalNavigator().anchorNode()); - if (processNewInput() && global::windowDelegate->isMaster()) { + bool gotNewInput = processNewInput(); + if (gotNewInput && global::windowDelegate->isMaster()) { _touch.updateStateFromInput(_touchPoints, _lastTouchInputs); } else if (_touchPoints.empty()) { _touch.resetAfterInput(); } - // update lastProcessed + // Update last processed touch inputs _lastTouchInputs.clear(); for (const TouchInputHolder& points : _touchPoints) { _lastTouchInputs.emplace_back(points.latestInput()); } - // calculate the new camera state for this frame + // Calculate the new camera state for this frame _touch.step(global::windowDelegate->deltaTime()); clearInputs(); }); @@ -145,14 +210,15 @@ bool TouchModule::processNewInput() { removeTouchInput(removal); } - // Set touch property to active (to void mouse input, mainly for mtdev bridges) - _touch.touchActive(!_touchPoints.empty()); + bool touchHappened = !_touchPoints.empty(); + _hasActiveTouchEvent = touchHappened; - if (!_touchPoints.empty()) { + // Set touch property to active (to void mouse input, mainly for mtdev bridges) + if (touchHappened) { global::interactionMonitor->markInteraction(); } - // Erase old input id's that no longer exists + // Erase old input ids that no longer exist _lastTouchInputs.erase( std::remove_if( _lastTouchInputs.begin(), @@ -168,7 +234,7 @@ bool TouchModule::processNewInput() { } ), _lastTouchInputs.end() - ); + ); if (_tap) { _touch.tap(); @@ -180,9 +246,11 @@ bool TouchModule::processNewInput() { if (_touchPoints.size() == _lastTouchInputs.size() && !_touchPoints.empty()) { + // @TODO (emmbr26, 2023-02-03) Looks to me like this code will always return + // true? That's a bit weird and should probably be investigated bool newInput = true; - // go through list and check if the last registrered time is newer than the one in - // lastProcessed (last frame) + // Go through list and check if the last registrered time is newer than the + // last processed touch inputs (last frame) std::for_each( _lastTouchInputs.begin(), _lastTouchInputs.end(), @@ -197,7 +265,8 @@ bool TouchModule::processNewInput() { if (!holder->isMoving()) { newInput = true; } - }); + } + ); return newInput; } else { diff --git a/modules/touch/touchmodule.h b/modules/touch/touchmodule.h index d217cd4972..7600a42c16 100644 --- a/modules/touch/touchmodule.h +++ b/modules/touch/touchmodule.h @@ -27,6 +27,8 @@ #include #include +#include +#include #include #include #include @@ -41,9 +43,15 @@ class Win32TouchHook; class TouchModule : public OpenSpaceModule { public: + constexpr static const char* Name = "Touch"; + TouchModule(); ~TouchModule(); + // Function to check if the given renderable type is one that should + // use direct maniuplation + bool isDefaultDirectTouchType(std::string_view renderableType) const; + protected: void internalInitialize(const ghoul::Dictionary& dictionary) override; @@ -64,7 +72,13 @@ private: std::vector _deferredRemovals; std::vector _lastTouchInputs; - properties::BoolProperty _touchActive; + properties::BoolProperty _touchIsEnabled; + properties::BoolProperty _hasActiveTouchEvent; + properties::StringListProperty _defaultDirectTouchRenderableTypes; + + // A sorted version of the list in the property + std::set _sortedDefaultRenderableTypes; + // contains an id and the Point that was processed last frame glm::ivec2 _webPositionCallback = glm::ivec2(0); #ifdef WIN32 diff --git a/modules/toyvolume/CMakeLists.txt b/modules/toyvolume/CMakeLists.txt index b1ee1f7bde..03ab3be8c4 100644 --- a/modules/toyvolume/CMakeLists.txt +++ b/modules/toyvolume/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES rendering/renderabletoyvolume.h diff --git a/modules/vislab/CMakeLists.txt b/modules/vislab/CMakeLists.txt index dacf117beb..05e583dfb5 100644 --- a/modules/vislab/CMakeLists.txt +++ b/modules/vislab/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES rendering/renderabledistancelabel.h diff --git a/modules/volume/CMakeLists.txt b/modules/volume/CMakeLists.txt index 2486bfcb83..782f19a0a5 100644 --- a/modules/volume/CMakeLists.txt +++ b/modules/volume/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES envelope.h diff --git a/modules/webbrowser/CMakeLists.txt b/modules/webbrowser/CMakeLists.txt index f165745009..46cf185070 100644 --- a/modules/webbrowser/CMakeLists.txt +++ b/modules/webbrowser/CMakeLists.txt @@ -22,10 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -cmake_minimum_required(VERSION 3.12 FATAL_ERROR) - -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) -include(${GHOUL_BASE_DIR}/support/cmake/handle_external_library.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) include(cmake/webbrowser_helpers.cmake) set(WEBBROWSER_MODULE_NAME WebBrowser) @@ -90,14 +87,11 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CEF_ROOT}/cmake") find_package(CEF REQUIRED) # Include the libcef_dll_wrapper target (executes libcef_dll/CMakeLists.txt). -add_subdirectory(${CEF_LIBCEF_DLL_WRAPPER_PATH} libcef_dll_wrapper) +add_subdirectory(${CEF_LIBCEF_DLL_WRAPPER_PATH} libcef_dll_wrapper SYSTEM) mark_as_advanced(CEF_DEBUG_INFO_FLAG USE_ATL USE_OFFICIAL_BUILD_SANDBOX USE_SANDBOX) -if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU") - # The CEF DLL wrapper is raising a lot of warnings on GCC - target_compile_options(libcef_dll_wrapper PRIVATE "-w") -endif () +target_compile_options(libcef_dll_wrapper PRIVATE "-w") target_precompile_headers(libcef_dll_wrapper PRIVATE [["include/cef_client.h"]] @@ -266,8 +260,7 @@ target_precompile_headers(${webbrowser_module} PRIVATE ) -set_folder_location(libcef_dll_wrapper "Helper") -set_folder_location(openspace_web_helper "Helper") +set_target_properties(libcef_dll_wrapper PROPERTIES FOLDER "Helper") # Display CEF configuration settings. # PRINT_CEF_CONFIG() diff --git a/modules/webbrowser/src/eventhandler.cpp b/modules/webbrowser/src/eventhandler.cpp index 5d81cb3295..ab174007b4 100644 --- a/modules/webbrowser/src/eventhandler.cpp +++ b/modules/webbrowser/src/eventhandler.cpp @@ -373,8 +373,8 @@ bool EventHandler::isDoubleClick(const MouseButtonState& button) const { // check position const float maxDist = maxDoubleClickDistance() / 2.f; - const bool x = abs(_mousePosition.x - button.lastClickPosition.x) < maxDist; - const bool y = abs(_mousePosition.y - button.lastClickPosition.y) < maxDist; + const bool x = std::abs(_mousePosition.x - button.lastClickPosition.x) < maxDist; + const bool y = std::abs(_mousePosition.y - button.lastClickPosition.y) < maxDist; return x && y; } diff --git a/modules/webgui/CMakeLists.txt b/modules/webgui/CMakeLists.txt index efe6fce462..94b5a7c2cd 100644 --- a/modules/webgui/CMakeLists.txt +++ b/modules/webgui/CMakeLists.txt @@ -22,7 +22,7 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) include(../webbrowser/cmake/webbrowser_helpers.cmake) set(WEBGUI_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "WEBGUI_MODULE_PATH") diff --git a/scripts/core_scripts.lua b/scripts/core_scripts.lua index f05c4d9ec5..b284028f6c 100644 --- a/scripts/core_scripts.lua +++ b/scripts/core_scripts.lua @@ -1,20 +1,20 @@ openspace.documentation = { { Name = "markInterestingNodes", - Arguments = { sceneGraphNode = "[ String ]" }, + Arguments = { sceneGraphNodes = "String[]" }, Documentation = "This function marks the scene graph nodes identified by name " .. - "as interesting, which will provide shortcut access to focus buttons and " .. + "as interesting, which will provide shortcut access to focus buttons and " .. "featured properties" }, { Name = "markInterestingTimes", - Arguments = { times = "[ Table ]" }, + Arguments = { times = "Table[]" }, Documentation = "This function marks interesting times for the current scene, " .. "which will create shortcuts for a quick access" }, { Name = "removeInterestingNodes", - Arguments = { sceneGraphNode = "[ String ]" }, + Arguments = { sceneGraphNodes = "String[]" }, Documentation = "This function removes unmarks the scene graph nodes " .. "identified by name as interesting, thus removing the shortcuts from the " .. "features properties list" @@ -39,6 +39,26 @@ openspace.documentation = { Arguments = { oldKey = "String", newKey = "String" }, Documentation = "Rebinds all scripts from the old key (first argument) to the " .. "new key (second argument)" + }, + { + Name = "appendToListProperty", + Arguments = { identifier = "String", value = "any" }, + Documentation = "Add a value to the list property with the given identifier. " .. + "The value can be any type, as long as it is the correct type for the given " .. + "property. Note that a number will be converted to a string automatically." + }, + { + Name = "addToPropertyValue", + Arguments = { identifier = "String", value = "String | Number" }, + Documentation = "Add a value to the property with the given identifier. " .. + "Works on both numerical and string properties, where adding to a string " .. + "property means appending the given string value to the existing string value." + }, + { + Name = "invertBooleanProperty", + Arguments = { identifier = "String" }, + Documentation = "Inverts the value of a boolean property with the given ".. + "identifier" } } @@ -82,3 +102,38 @@ openspace.rebindKey = function(oldKey, newKey) openspace.bindKey(newKey, v) end end + +openspace.appendToListProperty = function(propertyIdentifier, newItem) + local list = openspace.getPropertyValue(propertyIdentifier) + if type(list) ~= 'table' then + openspace.printError( + "Error when calling script 'openspace.appendToListProperty': " .. + "Could not append to non-list property '" .. propertyIdentifier .. "'" + ) + return; + end + table.insert(list, newItem) + openspace.setPropertyValueSingle(propertyIdentifier, list) +end + +openspace.addToPropertyValue = function(propertyIdentifier, valueToAdd) + local value = openspace.getPropertyValue(propertyIdentifier) + if type(value) == 'string' then + value = value .. valueToAdd; + else + value = value + valueToAdd; + end + openspace.setPropertyValueSingle(propertyIdentifier, value) +end + +openspace.invertBooleanProperty = function(propertyIdentifier) + local value = openspace.getPropertyValue(propertyIdentifier) + if type(value) ~= 'boolean' then + openspace.printError( + "Error when calling script 'openspace.invertBooleanProperty': " .. + "Could not invert non-boolean property '" .. propertyIdentifier .. "'" + ) + return; + end + openspace.setPropertyValueSingle(propertyIdentifier, not value) +end diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a459b29ed0..4c8d61a145 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -22,378 +22,378 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/set_openspace_compile_settings.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/set_openspace_compile_settings.cmake) set(OPENSPACE_SOURCE - ${OPENSPACE_BASE_DIR}/src/openspace.cpp - ${OPENSPACE_BASE_DIR}/src/camera/camera.cpp - ${OPENSPACE_BASE_DIR}/src/documentation/core_registration.cpp - ${OPENSPACE_BASE_DIR}/src/documentation/documentation.cpp - ${OPENSPACE_BASE_DIR}/src/documentation/documentationengine.cpp - ${OPENSPACE_BASE_DIR}/src/documentation/documentationgenerator.cpp - ${OPENSPACE_BASE_DIR}/src/documentation/verifier.cpp - ${OPENSPACE_BASE_DIR}/src/engine/configuration.cpp - ${OPENSPACE_BASE_DIR}/src/engine/downloadmanager.cpp - ${OPENSPACE_BASE_DIR}/src/engine/globals.cpp - ${OPENSPACE_BASE_DIR}/src/engine/globalscallbacks.cpp - ${OPENSPACE_BASE_DIR}/src/engine/logfactory.cpp - ${OPENSPACE_BASE_DIR}/src/engine/moduleengine.cpp - ${OPENSPACE_BASE_DIR}/src/engine/moduleengine_lua.inl - ${OPENSPACE_BASE_DIR}/src/engine/openspaceengine.cpp - ${OPENSPACE_BASE_DIR}/src/engine/openspaceengine_lua.inl - ${OPENSPACE_BASE_DIR}/src/engine/syncengine.cpp - ${OPENSPACE_BASE_DIR}/src/events/event.cpp - ${OPENSPACE_BASE_DIR}/src/events/eventengine.cpp - ${OPENSPACE_BASE_DIR}/src/events/eventengine_lua.inl - ${OPENSPACE_BASE_DIR}/src/interaction/actionmanager.cpp - ${OPENSPACE_BASE_DIR}/src/interaction/actionmanager_lua.inl - ${OPENSPACE_BASE_DIR}/src/interaction/camerainteractionstates.cpp - ${OPENSPACE_BASE_DIR}/src/interaction/interactionmonitor.cpp - ${OPENSPACE_BASE_DIR}/src/interaction/mouseinputstate.cpp - ${OPENSPACE_BASE_DIR}/src/interaction/joystickinputstate.cpp - ${OPENSPACE_BASE_DIR}/src/interaction/joystickcamerastates.cpp - ${OPENSPACE_BASE_DIR}/src/interaction/keybindingmanager.cpp - ${OPENSPACE_BASE_DIR}/src/interaction/keybindingmanager_lua.inl - ${OPENSPACE_BASE_DIR}/src/interaction/keyboardinputstate.cpp - ${OPENSPACE_BASE_DIR}/src/interaction/mousecamerastates.cpp - ${OPENSPACE_BASE_DIR}/src/interaction/scriptcamerastates.cpp - ${OPENSPACE_BASE_DIR}/src/interaction/sessionrecording.cpp - ${OPENSPACE_BASE_DIR}/src/interaction/sessionrecording_lua.inl - ${OPENSPACE_BASE_DIR}/src/interaction/websocketinputstate.cpp - ${OPENSPACE_BASE_DIR}/src/interaction/websocketcamerastates.cpp - ${OPENSPACE_BASE_DIR}/src/interaction/tasks/convertrecfileversiontask.cpp - ${OPENSPACE_BASE_DIR}/src/interaction/tasks/convertrecformattask.cpp - ${OPENSPACE_BASE_DIR}/src/mission/mission.cpp - ${OPENSPACE_BASE_DIR}/src/mission/missionmanager.cpp - ${OPENSPACE_BASE_DIR}/src/mission/missionmanager_lua.inl - ${OPENSPACE_BASE_DIR}/src/navigation/pathcurves/avoidcollisioncurve.cpp - ${OPENSPACE_BASE_DIR}/src/navigation/pathcurves/zoomoutoverviewcurve.cpp - ${OPENSPACE_BASE_DIR}/src/navigation/keyframenavigator.cpp - ${OPENSPACE_BASE_DIR}/src/navigation/navigationhandler.cpp - ${OPENSPACE_BASE_DIR}/src/navigation/navigationhandler_lua.inl - ${OPENSPACE_BASE_DIR}/src/navigation/navigationstate.cpp - ${OPENSPACE_BASE_DIR}/src/navigation/orbitalnavigator.cpp - ${OPENSPACE_BASE_DIR}/src/navigation/path.cpp - ${OPENSPACE_BASE_DIR}/src/navigation/pathcurve.cpp - ${OPENSPACE_BASE_DIR}/src/navigation/pathnavigator.cpp - ${OPENSPACE_BASE_DIR}/src/navigation/pathnavigator_lua.inl - ${OPENSPACE_BASE_DIR}/src/navigation/waypoint.cpp - ${OPENSPACE_BASE_DIR}/src/network/messagestructureshelper.cpp - ${OPENSPACE_BASE_DIR}/src/network/parallelconnection.cpp - ${OPENSPACE_BASE_DIR}/src/network/parallelpeer.cpp - ${OPENSPACE_BASE_DIR}/src/network/parallelpeer_lua.inl - ${OPENSPACE_BASE_DIR}/src/properties/optionproperty.cpp - ${OPENSPACE_BASE_DIR}/src/properties/property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/propertyowner.cpp - ${OPENSPACE_BASE_DIR}/src/properties/selectionproperty.cpp - ${OPENSPACE_BASE_DIR}/src/properties/stringproperty.cpp - ${OPENSPACE_BASE_DIR}/src/properties/triggerproperty.cpp - ${OPENSPACE_BASE_DIR}/src/properties/list/doublelistproperty.cpp - ${OPENSPACE_BASE_DIR}/src/properties/list/intlistproperty.cpp - ${OPENSPACE_BASE_DIR}/src/properties/list/stringlistproperty.cpp - ${OPENSPACE_BASE_DIR}/src/properties/matrix/dmat2property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/matrix/dmat3property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/matrix/dmat4property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/matrix/mat2property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/matrix/mat3property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/matrix/mat4property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/scalar/boolproperty.cpp - ${OPENSPACE_BASE_DIR}/src/properties/scalar/doubleproperty.cpp - ${OPENSPACE_BASE_DIR}/src/properties/scalar/floatproperty.cpp - ${OPENSPACE_BASE_DIR}/src/properties/scalar/intproperty.cpp - ${OPENSPACE_BASE_DIR}/src/properties/scalar/longproperty.cpp - ${OPENSPACE_BASE_DIR}/src/properties/scalar/shortproperty.cpp - ${OPENSPACE_BASE_DIR}/src/properties/scalar/uintproperty.cpp - ${OPENSPACE_BASE_DIR}/src/properties/scalar/ulongproperty.cpp - ${OPENSPACE_BASE_DIR}/src/properties/scalar/ushortproperty.cpp - ${OPENSPACE_BASE_DIR}/src/properties/vector/dvec2property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/vector/dvec3property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/vector/dvec4property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/vector/ivec2property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/vector/ivec3property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/vector/ivec4property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/vector/uvec2property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/vector/uvec3property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/vector/uvec4property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/vector/vec2property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/vector/vec3property.cpp - ${OPENSPACE_BASE_DIR}/src/properties/vector/vec4property.cpp - ${OPENSPACE_BASE_DIR}/src/query/query.cpp - ${OPENSPACE_BASE_DIR}/src/rendering/dashboard.cpp - ${OPENSPACE_BASE_DIR}/src/rendering/dashboard_lua.inl - ${OPENSPACE_BASE_DIR}/src/rendering/dashboarditem.cpp - ${OPENSPACE_BASE_DIR}/src/rendering/dashboardtextitem.cpp - ${OPENSPACE_BASE_DIR}/src/rendering/framebufferrenderer.cpp - ${OPENSPACE_BASE_DIR}/src/rendering/deferredcastermanager.cpp - ${OPENSPACE_BASE_DIR}/src/rendering/helper.cpp - ${OPENSPACE_BASE_DIR}/src/rendering/loadingscreen.cpp - ${OPENSPACE_BASE_DIR}/src/rendering/luaconsole.cpp - ${OPENSPACE_BASE_DIR}/src/rendering/raycastermanager.cpp - ${OPENSPACE_BASE_DIR}/src/rendering/renderable.cpp - ${OPENSPACE_BASE_DIR}/src/rendering/renderengine.cpp - ${OPENSPACE_BASE_DIR}/src/rendering/renderengine_lua.inl - ${OPENSPACE_BASE_DIR}/src/rendering/screenspacerenderable.cpp - ${OPENSPACE_BASE_DIR}/src/rendering/texturecomponent.cpp - ${OPENSPACE_BASE_DIR}/src/rendering/transferfunction.cpp - ${OPENSPACE_BASE_DIR}/src/rendering/volumeraycaster.cpp - ${OPENSPACE_BASE_DIR}/src/scene/asset.cpp - ${OPENSPACE_BASE_DIR}/src/scene/assetmanager.cpp - ${OPENSPACE_BASE_DIR}/src/scene/assetmanager_lua.inl - ${OPENSPACE_BASE_DIR}/src/scene/lightsource.cpp - ${OPENSPACE_BASE_DIR}/src/scene/profile.cpp - ${OPENSPACE_BASE_DIR}/src/scene/profile_lua.inl - ${OPENSPACE_BASE_DIR}/src/scene/rotation.cpp - ${OPENSPACE_BASE_DIR}/src/scene/scale.cpp - ${OPENSPACE_BASE_DIR}/src/scene/scene.cpp - ${OPENSPACE_BASE_DIR}/src/scene/scene_lua.inl - ${OPENSPACE_BASE_DIR}/src/scene/sceneinitializer.cpp - ${OPENSPACE_BASE_DIR}/src/scene/scenelicensewriter.cpp - ${OPENSPACE_BASE_DIR}/src/scene/scenegraphnode.cpp - ${OPENSPACE_BASE_DIR}/src/scene/timeframe.cpp - ${OPENSPACE_BASE_DIR}/src/scene/translation.cpp - ${OPENSPACE_BASE_DIR}/src/scripting/lualibrary.cpp - ${OPENSPACE_BASE_DIR}/src/scripting/scriptengine.cpp - ${OPENSPACE_BASE_DIR}/src/scripting/scriptengine_lua.inl - ${OPENSPACE_BASE_DIR}/src/scripting/scriptscheduler.cpp - ${OPENSPACE_BASE_DIR}/src/scripting/scriptscheduler_lua.inl - ${OPENSPACE_BASE_DIR}/src/scripting/systemcapabilitiesbinding.cpp - ${OPENSPACE_BASE_DIR}/src/scripting/systemcapabilitiesbinding_lua.inl - ${OPENSPACE_BASE_DIR}/src/util/blockplaneintersectiongeometry.cpp - ${OPENSPACE_BASE_DIR}/src/util/boxgeometry.cpp - ${OPENSPACE_BASE_DIR}/src/util/collisionhelper.cpp - ${OPENSPACE_BASE_DIR}/src/util/coordinateconversion.cpp - ${OPENSPACE_BASE_DIR}/src/util/distanceconversion.cpp - ${OPENSPACE_BASE_DIR}/src/util/factorymanager.cpp - ${OPENSPACE_BASE_DIR}/src/util/httprequest.cpp - ${OPENSPACE_BASE_DIR}/src/util/json_helper.cpp - ${OPENSPACE_BASE_DIR}/src/util/keys.cpp - ${OPENSPACE_BASE_DIR}/src/util/openspacemodule.cpp - ${OPENSPACE_BASE_DIR}/src/util/planegeometry.cpp - ${OPENSPACE_BASE_DIR}/src/util/progressbar.cpp - ${OPENSPACE_BASE_DIR}/src/util/resourcesynchronization.cpp - ${OPENSPACE_BASE_DIR}/src/util/screenlog.cpp - ${OPENSPACE_BASE_DIR}/src/util/sphere.cpp - ${OPENSPACE_BASE_DIR}/src/util/spicemanager.cpp - ${OPENSPACE_BASE_DIR}/src/util/spicemanager_lua.inl - ${OPENSPACE_BASE_DIR}/src/util/syncbuffer.cpp - ${OPENSPACE_BASE_DIR}/src/util/tstring.cpp - ${OPENSPACE_BASE_DIR}/src/util/histogram.cpp - ${OPENSPACE_BASE_DIR}/src/util/task.cpp - ${OPENSPACE_BASE_DIR}/src/util/taskloader.cpp - ${OPENSPACE_BASE_DIR}/src/util/threadpool.cpp - ${OPENSPACE_BASE_DIR}/src/util/time.cpp - ${OPENSPACE_BASE_DIR}/src/util/timeconversion.cpp - ${OPENSPACE_BASE_DIR}/src/util/timeline.cpp - ${OPENSPACE_BASE_DIR}/src/util/timemanager.cpp - ${OPENSPACE_BASE_DIR}/src/util/time_lua.inl - ${OPENSPACE_BASE_DIR}/src/util/timerange.cpp - ${OPENSPACE_BASE_DIR}/src/util/touch.cpp - ${OPENSPACE_BASE_DIR}/src/util/transformationmanager.cpp - ${OPENSPACE_BASE_DIR}/src/util/universalhelpers.cpp - ${OPENSPACE_BASE_DIR}/src/util/versionchecker.cpp + openspace.cpp + camera/camera.cpp + documentation/core_registration.cpp + documentation/documentation.cpp + documentation/documentationengine.cpp + documentation/documentationgenerator.cpp + documentation/verifier.cpp + engine/configuration.cpp + engine/downloadmanager.cpp + engine/globals.cpp + engine/globalscallbacks.cpp + engine/logfactory.cpp + engine/moduleengine.cpp + engine/moduleengine_lua.inl + engine/openspaceengine.cpp + engine/openspaceengine_lua.inl + engine/syncengine.cpp + events/event.cpp + events/eventengine.cpp + events/eventengine_lua.inl + interaction/actionmanager.cpp + interaction/actionmanager_lua.inl + interaction/camerainteractionstates.cpp + interaction/interactionmonitor.cpp + interaction/mouseinputstate.cpp + interaction/joystickinputstate.cpp + interaction/joystickcamerastates.cpp + interaction/keybindingmanager.cpp + interaction/keybindingmanager_lua.inl + interaction/keyboardinputstate.cpp + interaction/mousecamerastates.cpp + interaction/scriptcamerastates.cpp + interaction/sessionrecording.cpp + interaction/sessionrecording_lua.inl + interaction/websocketinputstate.cpp + interaction/websocketcamerastates.cpp + interaction/tasks/convertrecfileversiontask.cpp + interaction/tasks/convertrecformattask.cpp + mission/mission.cpp + mission/missionmanager.cpp + mission/missionmanager_lua.inl + navigation/pathcurves/avoidcollisioncurve.cpp + navigation/pathcurves/zoomoutoverviewcurve.cpp + navigation/keyframenavigator.cpp + navigation/navigationhandler.cpp + navigation/navigationhandler_lua.inl + navigation/navigationstate.cpp + navigation/orbitalnavigator.cpp + navigation/path.cpp + navigation/pathcurve.cpp + navigation/pathnavigator.cpp + navigation/pathnavigator_lua.inl + navigation/waypoint.cpp + network/messagestructureshelper.cpp + network/parallelconnection.cpp + network/parallelpeer.cpp + network/parallelpeer_lua.inl + properties/optionproperty.cpp + properties/property.cpp + properties/propertyowner.cpp + properties/selectionproperty.cpp + properties/stringproperty.cpp + properties/triggerproperty.cpp + properties/list/doublelistproperty.cpp + properties/list/intlistproperty.cpp + properties/list/stringlistproperty.cpp + properties/matrix/dmat2property.cpp + properties/matrix/dmat3property.cpp + properties/matrix/dmat4property.cpp + properties/matrix/mat2property.cpp + properties/matrix/mat3property.cpp + properties/matrix/mat4property.cpp + properties/scalar/boolproperty.cpp + properties/scalar/doubleproperty.cpp + properties/scalar/floatproperty.cpp + properties/scalar/intproperty.cpp + properties/scalar/longproperty.cpp + properties/scalar/shortproperty.cpp + properties/scalar/uintproperty.cpp + properties/scalar/ulongproperty.cpp + properties/scalar/ushortproperty.cpp + properties/vector/dvec2property.cpp + properties/vector/dvec3property.cpp + properties/vector/dvec4property.cpp + properties/vector/ivec2property.cpp + properties/vector/ivec3property.cpp + properties/vector/ivec4property.cpp + properties/vector/uvec2property.cpp + properties/vector/uvec3property.cpp + properties/vector/uvec4property.cpp + properties/vector/vec2property.cpp + properties/vector/vec3property.cpp + properties/vector/vec4property.cpp + query/query.cpp + rendering/dashboard.cpp + rendering/dashboard_lua.inl + rendering/dashboarditem.cpp + rendering/dashboardtextitem.cpp + rendering/framebufferrenderer.cpp + rendering/deferredcastermanager.cpp + rendering/helper.cpp + rendering/loadingscreen.cpp + rendering/luaconsole.cpp + rendering/raycastermanager.cpp + rendering/renderable.cpp + rendering/renderengine.cpp + rendering/renderengine_lua.inl + rendering/screenspacerenderable.cpp + rendering/texturecomponent.cpp + rendering/transferfunction.cpp + rendering/volumeraycaster.cpp + scene/asset.cpp + scene/assetmanager.cpp + scene/assetmanager_lua.inl + scene/lightsource.cpp + scene/profile.cpp + scene/profile_lua.inl + scene/rotation.cpp + scene/scale.cpp + scene/scene.cpp + scene/scene_lua.inl + scene/sceneinitializer.cpp + scene/scenelicensewriter.cpp + scene/scenegraphnode.cpp + scene/timeframe.cpp + scene/translation.cpp + scripting/lualibrary.cpp + scripting/scriptengine.cpp + scripting/scriptengine_lua.inl + scripting/scriptscheduler.cpp + scripting/scriptscheduler_lua.inl + scripting/systemcapabilitiesbinding.cpp + scripting/systemcapabilitiesbinding_lua.inl + util/blockplaneintersectiongeometry.cpp + util/boxgeometry.cpp + util/collisionhelper.cpp + util/coordinateconversion.cpp + util/distanceconversion.cpp + util/factorymanager.cpp + util/httprequest.cpp + util/json_helper.cpp + util/keys.cpp + util/openspacemodule.cpp + util/planegeometry.cpp + util/progressbar.cpp + util/resourcesynchronization.cpp + util/screenlog.cpp + util/sphere.cpp + util/spicemanager.cpp + util/spicemanager_lua.inl + util/syncbuffer.cpp + util/tstring.cpp + util/histogram.cpp + util/task.cpp + util/taskloader.cpp + util/threadpool.cpp + util/time.cpp + util/timeconversion.cpp + util/timeline.cpp + util/timemanager.cpp + util/time_lua.inl + util/timerange.cpp + util/touch.cpp + util/transformationmanager.cpp + util/universalhelpers.cpp + util/versionchecker.cpp ) if (APPLE) set(OPENSPACE_SOURCE ${OPENSPACE_SOURCE} - ${OPENSPACE_BASE_DIR}/src/interaction/touchbar.mm + interaction/touchbar.mm ) set_source_files_properties( - ${OPENSPACE_BASE_DIR}/src/interaction/touchbar.mm + interaction/touchbar.mm PROPERTIES SKIP_PRECOMPILE_HEADERS ON ) endif () set(OPENSPACE_HEADER - ${OPENSPACE_BASE_DIR}/include/openspace/json.h - ${OPENSPACE_BASE_DIR}/include/openspace/camera/camera.h - ${OPENSPACE_BASE_DIR}/include/openspace/camera/camerapose.h - ${OPENSPACE_BASE_DIR}/include/openspace/documentation/core_registration.h - ${OPENSPACE_BASE_DIR}/include/openspace/documentation/documentation.h - ${OPENSPACE_BASE_DIR}/include/openspace/documentation/documentationengine.h - ${OPENSPACE_BASE_DIR}/include/openspace/documentation/documentationgenerator.h - ${OPENSPACE_BASE_DIR}/include/openspace/documentation/verifier.h - ${OPENSPACE_BASE_DIR}/include/openspace/documentation/verifier.inl - ${OPENSPACE_BASE_DIR}/include/openspace/engine/configuration.h - ${OPENSPACE_BASE_DIR}/include/openspace/engine/downloadmanager.h - ${OPENSPACE_BASE_DIR}/include/openspace/engine/globals.h - ${OPENSPACE_BASE_DIR}/include/openspace/engine/globalscallbacks.h - ${OPENSPACE_BASE_DIR}/include/openspace/engine/logfactory.h - ${OPENSPACE_BASE_DIR}/include/openspace/engine/moduleengine.h - ${OPENSPACE_BASE_DIR}/include/openspace/engine/moduleengine.inl - ${OPENSPACE_BASE_DIR}/include/openspace/engine/openspaceengine.h - ${OPENSPACE_BASE_DIR}/include/openspace/engine/syncengine.h - ${OPENSPACE_BASE_DIR}/include/openspace/engine/windowdelegate.h - ${OPENSPACE_BASE_DIR}/include/openspace/events/event.h - ${OPENSPACE_BASE_DIR}/include/openspace/events/eventengine.h - ${OPENSPACE_BASE_DIR}/include/openspace/events/eventengine.inl - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/action.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/actionmanager.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/delayedvariable.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/delayedvariable.inl - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/camerainteractionstates.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/mouseinputstate.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/interactionmonitor.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/interpolator.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/interpolator.inl - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/joystickinputstate.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/joystickcamerastates.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/keybindingmanager.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/keyboardinputstate.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/mousecamerastates.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/scriptcamerastates.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/sessionrecording.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/sessionrecording.inl - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/websocketinputstate.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/websocketcamerastates.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/tasks/convertrecfileversiontask.h - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/tasks/convertrecformattask.h - ${OPENSPACE_BASE_DIR}/include/openspace/mission/mission.h - ${OPENSPACE_BASE_DIR}/include/openspace/mission/missionmanager.h - ${OPENSPACE_BASE_DIR}/include/openspace/navigation/pathcurves/avoidcollisioncurve.h - ${OPENSPACE_BASE_DIR}/include/openspace/navigation/pathcurves/zoomoutoverviewcurve.h - ${OPENSPACE_BASE_DIR}/include/openspace/navigation/keyframenavigator.h - ${OPENSPACE_BASE_DIR}/include/openspace/navigation/navigationhandler.h - ${OPENSPACE_BASE_DIR}/include/openspace/navigation/navigationstate.h - ${OPENSPACE_BASE_DIR}/include/openspace/navigation/orbitalnavigator.h - ${OPENSPACE_BASE_DIR}/include/openspace/navigation/path.h - ${OPENSPACE_BASE_DIR}/include/openspace/navigation/pathcurve.h - ${OPENSPACE_BASE_DIR}/include/openspace/navigation/pathnavigator.h - ${OPENSPACE_BASE_DIR}/include/openspace/navigation/waypoint.h - ${OPENSPACE_BASE_DIR}/include/openspace/network/parallelconnection.h - ${OPENSPACE_BASE_DIR}/include/openspace/network/parallelpeer.h - ${OPENSPACE_BASE_DIR}/include/openspace/network/messagestructures.h - ${OPENSPACE_BASE_DIR}/include/openspace/network/messagestructureshelper.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/listproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/listproperty.inl - ${OPENSPACE_BASE_DIR}/include/openspace/properties/numericalproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/numericalproperty.inl - ${OPENSPACE_BASE_DIR}/include/openspace/properties/optionproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/propertyowner.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/selectionproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/stringproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/templateproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/templateproperty.inl - ${OPENSPACE_BASE_DIR}/include/openspace/properties/triggerproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/list/doublelistproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/list/intlistproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/list/stringlistproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/matrix/dmat2property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/matrix/dmat3property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/matrix/dmat4property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/matrix/mat2property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/matrix/mat3property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/matrix/mat4property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/scalar/boolproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/scalar/doubleproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/scalar/floatproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/scalar/intproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/scalar/longproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/scalar/shortproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/scalar/uintproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/scalar/ulongproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/scalar/ushortproperty.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/vector/dvec2property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/vector/dvec3property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/vector/dvec4property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/vector/ivec2property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/vector/ivec3property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/vector/ivec4property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/vector/uvec2property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/vector/uvec3property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/vector/uvec4property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/vector/vec2property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/vector/vec3property.h - ${OPENSPACE_BASE_DIR}/include/openspace/properties/vector/vec4property.h - ${OPENSPACE_BASE_DIR}/include/openspace/query/query.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/dashboard.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/dashboarditem.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/dashboardtextitem.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/framebufferrenderer.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/deferredcaster.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/deferredcasterlistener.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/deferredcastermanager.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/loadingscreen.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/luaconsole.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/helper.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/raycasterlistener.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/raycastermanager.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/renderable.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/renderengine.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/screenspacerenderable.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/texturecomponent.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/transferfunction.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/volume.h - ${OPENSPACE_BASE_DIR}/include/openspace/rendering/volumeraycaster.h - ${OPENSPACE_BASE_DIR}/include/openspace/scene/asset.h - ${OPENSPACE_BASE_DIR}/include/openspace/scene/assetmanager.h - ${OPENSPACE_BASE_DIR}/include/openspace/scene/lightsource.h - ${OPENSPACE_BASE_DIR}/include/openspace/scene/profile.h - ${OPENSPACE_BASE_DIR}/include/openspace/scene/rotation.h - ${OPENSPACE_BASE_DIR}/include/openspace/scene/scale.h - ${OPENSPACE_BASE_DIR}/include/openspace/scene/scene.h - ${OPENSPACE_BASE_DIR}/include/openspace/scene/sceneinitializer.h - ${OPENSPACE_BASE_DIR}/include/openspace/scene/scenelicensewriter.h - ${OPENSPACE_BASE_DIR}/include/openspace/scene/scenegraphnode.h - ${OPENSPACE_BASE_DIR}/include/openspace/scene/timeframe.h - ${OPENSPACE_BASE_DIR}/include/openspace/scene/translation.h - ${OPENSPACE_BASE_DIR}/include/openspace/scripting/lualibrary.h - ${OPENSPACE_BASE_DIR}/include/openspace/scripting/scriptengine.h - ${OPENSPACE_BASE_DIR}/include/openspace/scripting/scriptscheduler.h - ${OPENSPACE_BASE_DIR}/include/openspace/scripting/systemcapabilitiesbinding.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/blockplaneintersectiongeometry.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/boxgeometry.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/collisionhelper.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/concurrentjobmanager.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/concurrentjobmanager.inl - ${OPENSPACE_BASE_DIR}/include/openspace/util/concurrentqueue.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/concurrentqueue.inl - ${OPENSPACE_BASE_DIR}/include/openspace/util/coordinateconversion.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/distanceconstants.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/distanceconversion.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/factorymanager.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/factorymanager.inl - ${OPENSPACE_BASE_DIR}/include/openspace/util/httprequest.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/job.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/json_helper.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/json_helper.inl - ${OPENSPACE_BASE_DIR}/include/openspace/util/keys.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/memorymanager.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/mouse.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/openspacemodule.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/planegeometry.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/progressbar.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/resourcesynchronization.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/screenlog.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/sphere.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/spicemanager.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/syncable.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/syncbuffer.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/syncbuffer.inl - ${OPENSPACE_BASE_DIR}/include/openspace/util/syncdata.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/syncdata.inl - ${OPENSPACE_BASE_DIR}/include/openspace/util/task.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/taskloader.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/time.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/timeconversion.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/timeline.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/timeline.inl - ${OPENSPACE_BASE_DIR}/include/openspace/util/timemanager.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/timerange.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/touch.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/tstring.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/universalhelpers.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/updatestructures.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/versionchecker.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/transformationmanager.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/threadpool.h - ${OPENSPACE_BASE_DIR}/include/openspace/util/histogram.h + ${PROJECT_SOURCE_DIR}/include/openspace/json.h + ${PROJECT_SOURCE_DIR}/include/openspace/camera/camera.h + ${PROJECT_SOURCE_DIR}/include/openspace/camera/camerapose.h + ${PROJECT_SOURCE_DIR}/include/openspace/documentation/core_registration.h + ${PROJECT_SOURCE_DIR}/include/openspace/documentation/documentation.h + ${PROJECT_SOURCE_DIR}/include/openspace/documentation/documentationengine.h + ${PROJECT_SOURCE_DIR}/include/openspace/documentation/documentationgenerator.h + ${PROJECT_SOURCE_DIR}/include/openspace/documentation/verifier.h + ${PROJECT_SOURCE_DIR}/include/openspace/documentation/verifier.inl + ${PROJECT_SOURCE_DIR}/include/openspace/engine/configuration.h + ${PROJECT_SOURCE_DIR}/include/openspace/engine/downloadmanager.h + ${PROJECT_SOURCE_DIR}/include/openspace/engine/globals.h + ${PROJECT_SOURCE_DIR}/include/openspace/engine/globalscallbacks.h + ${PROJECT_SOURCE_DIR}/include/openspace/engine/logfactory.h + ${PROJECT_SOURCE_DIR}/include/openspace/engine/moduleengine.h + ${PROJECT_SOURCE_DIR}/include/openspace/engine/moduleengine.inl + ${PROJECT_SOURCE_DIR}/include/openspace/engine/openspaceengine.h + ${PROJECT_SOURCE_DIR}/include/openspace/engine/syncengine.h + ${PROJECT_SOURCE_DIR}/include/openspace/engine/windowdelegate.h + ${PROJECT_SOURCE_DIR}/include/openspace/events/event.h + ${PROJECT_SOURCE_DIR}/include/openspace/events/eventengine.h + ${PROJECT_SOURCE_DIR}/include/openspace/events/eventengine.inl + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/action.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/actionmanager.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/delayedvariable.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/delayedvariable.inl + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/camerainteractionstates.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/mouseinputstate.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/interactionmonitor.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/interpolator.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/interpolator.inl + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/joystickinputstate.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/joystickcamerastates.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/keybindingmanager.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/keyboardinputstate.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/mousecamerastates.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/scriptcamerastates.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/sessionrecording.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/sessionrecording.inl + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/websocketinputstate.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/websocketcamerastates.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/tasks/convertrecfileversiontask.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/tasks/convertrecformattask.h + ${PROJECT_SOURCE_DIR}/include/openspace/mission/mission.h + ${PROJECT_SOURCE_DIR}/include/openspace/mission/missionmanager.h + ${PROJECT_SOURCE_DIR}/include/openspace/navigation/pathcurves/avoidcollisioncurve.h + ${PROJECT_SOURCE_DIR}/include/openspace/navigation/pathcurves/zoomoutoverviewcurve.h + ${PROJECT_SOURCE_DIR}/include/openspace/navigation/keyframenavigator.h + ${PROJECT_SOURCE_DIR}/include/openspace/navigation/navigationhandler.h + ${PROJECT_SOURCE_DIR}/include/openspace/navigation/navigationstate.h + ${PROJECT_SOURCE_DIR}/include/openspace/navigation/orbitalnavigator.h + ${PROJECT_SOURCE_DIR}/include/openspace/navigation/path.h + ${PROJECT_SOURCE_DIR}/include/openspace/navigation/pathcurve.h + ${PROJECT_SOURCE_DIR}/include/openspace/navigation/pathnavigator.h + ${PROJECT_SOURCE_DIR}/include/openspace/navigation/waypoint.h + ${PROJECT_SOURCE_DIR}/include/openspace/network/parallelconnection.h + ${PROJECT_SOURCE_DIR}/include/openspace/network/parallelpeer.h + ${PROJECT_SOURCE_DIR}/include/openspace/network/messagestructures.h + ${PROJECT_SOURCE_DIR}/include/openspace/network/messagestructureshelper.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/listproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/listproperty.inl + ${PROJECT_SOURCE_DIR}/include/openspace/properties/numericalproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/numericalproperty.inl + ${PROJECT_SOURCE_DIR}/include/openspace/properties/optionproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/propertyowner.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/selectionproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/stringproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/templateproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/templateproperty.inl + ${PROJECT_SOURCE_DIR}/include/openspace/properties/triggerproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/list/doublelistproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/list/intlistproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/list/stringlistproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/matrix/dmat2property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/matrix/dmat3property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/matrix/dmat4property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/matrix/mat2property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/matrix/mat3property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/matrix/mat4property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/scalar/boolproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/scalar/doubleproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/scalar/floatproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/scalar/intproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/scalar/longproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/scalar/shortproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/scalar/uintproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/scalar/ulongproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/scalar/ushortproperty.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/vector/dvec2property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/vector/dvec3property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/vector/dvec4property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/vector/ivec2property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/vector/ivec3property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/vector/ivec4property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/vector/uvec2property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/vector/uvec3property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/vector/uvec4property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/vector/vec2property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/vector/vec3property.h + ${PROJECT_SOURCE_DIR}/include/openspace/properties/vector/vec4property.h + ${PROJECT_SOURCE_DIR}/include/openspace/query/query.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/dashboard.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/dashboarditem.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/dashboardtextitem.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/framebufferrenderer.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/deferredcaster.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/deferredcasterlistener.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/deferredcastermanager.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/loadingscreen.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/luaconsole.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/helper.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/raycasterlistener.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/raycastermanager.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/renderable.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/renderengine.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/screenspacerenderable.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/texturecomponent.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/transferfunction.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/volume.h + ${PROJECT_SOURCE_DIR}/include/openspace/rendering/volumeraycaster.h + ${PROJECT_SOURCE_DIR}/include/openspace/scene/asset.h + ${PROJECT_SOURCE_DIR}/include/openspace/scene/assetmanager.h + ${PROJECT_SOURCE_DIR}/include/openspace/scene/lightsource.h + ${PROJECT_SOURCE_DIR}/include/openspace/scene/profile.h + ${PROJECT_SOURCE_DIR}/include/openspace/scene/rotation.h + ${PROJECT_SOURCE_DIR}/include/openspace/scene/scale.h + ${PROJECT_SOURCE_DIR}/include/openspace/scene/scene.h + ${PROJECT_SOURCE_DIR}/include/openspace/scene/sceneinitializer.h + ${PROJECT_SOURCE_DIR}/include/openspace/scene/scenelicensewriter.h + ${PROJECT_SOURCE_DIR}/include/openspace/scene/scenegraphnode.h + ${PROJECT_SOURCE_DIR}/include/openspace/scene/timeframe.h + ${PROJECT_SOURCE_DIR}/include/openspace/scene/translation.h + ${PROJECT_SOURCE_DIR}/include/openspace/scripting/lualibrary.h + ${PROJECT_SOURCE_DIR}/include/openspace/scripting/scriptengine.h + ${PROJECT_SOURCE_DIR}/include/openspace/scripting/scriptscheduler.h + ${PROJECT_SOURCE_DIR}/include/openspace/scripting/systemcapabilitiesbinding.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/blockplaneintersectiongeometry.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/boxgeometry.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/collisionhelper.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/concurrentjobmanager.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/concurrentjobmanager.inl + ${PROJECT_SOURCE_DIR}/include/openspace/util/concurrentqueue.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/concurrentqueue.inl + ${PROJECT_SOURCE_DIR}/include/openspace/util/coordinateconversion.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/distanceconstants.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/distanceconversion.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/factorymanager.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/factorymanager.inl + ${PROJECT_SOURCE_DIR}/include/openspace/util/httprequest.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/job.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/json_helper.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/json_helper.inl + ${PROJECT_SOURCE_DIR}/include/openspace/util/keys.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/memorymanager.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/mouse.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/openspacemodule.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/planegeometry.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/progressbar.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/resourcesynchronization.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/screenlog.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/sphere.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/spicemanager.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/syncable.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/syncbuffer.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/syncbuffer.inl + ${PROJECT_SOURCE_DIR}/include/openspace/util/syncdata.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/syncdata.inl + ${PROJECT_SOURCE_DIR}/include/openspace/util/task.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/taskloader.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/time.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/timeconversion.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/timeline.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/timeline.inl + ${PROJECT_SOURCE_DIR}/include/openspace/util/timemanager.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/timerange.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/touch.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/tstring.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/universalhelpers.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/updatestructures.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/versionchecker.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/transformationmanager.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/threadpool.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/histogram.h ) if (APPLE) set(OPENSPACE_HEADER ${OPENSPACE_HEADER} - ${OPENSPACE_BASE_DIR}/include/openspace/interaction/touchbar.h + ${PROJECT_SOURCE_DIR}/include/openspace/interaction/touchbar.h ) endif () @@ -401,8 +401,8 @@ endif () foreach (file ${OPENSPACE_SOURCE} ${OPENSPACE_HEADER}) # Remove prefixes from the files set(original_file ${file}) - string(REPLACE "${OPENSPACE_BASE_DIR}/src/" "" file ${file}) - string(REPLACE "${OPENSPACE_BASE_DIR}/include/openspace/" "" file ${file}) + string(REPLACE "${PROJECT_SOURCE_DIR}/src/" "" file ${file}) + string(REPLACE "${PROJECT_SOURCE_DIR}/include/openspace/" "" file ${file}) get_filename_component(directory ${file} DIRECTORY) if (NOT directory STREQUAL "") # Visual Studio wants '\' for the path separator @@ -427,22 +427,22 @@ add_library(openspace-core STATIC ${OPENSPACE_HEADER} ${OPENSPACE_SOURCE}) target_include_directories(openspace-core SYSTEM PUBLIC # In order to use the date library - ${OPENSPACE_BASE_DIR}/ext/date/include + ${PROJECT_SOURCE_DIR}/ext/date/include # In order to use the nlohmann JSON library - ${OPENSPACE_BASE_DIR}/ext + ${PROJECT_SOURCE_DIR}/ext ) target_include_directories(openspace-core PUBLIC # In order to be able to include openspace-core files - ${OPENSPACE_BASE_DIR}/include + ${PROJECT_SOURCE_DIR}/include # In order to be able to include the module_registration file ${CMAKE_BINARY_DIR}/_generated/include PRIVATE # In order to be able to include module files. This is a temporary fix as this # introduces a dependency from the opnspace-core onto the modules - ${OPENSPACE_BASE_DIR} + ${PROJECT_SOURCE_DIR} ) target_precompile_headers(openspace-core PRIVATE @@ -474,14 +474,14 @@ target_precompile_headers(openspace-core PRIVATE add_dependencies(openspace-core run_codegen) configure_file( - ${OPENSPACE_CMAKE_EXT_DIR}/openspace_header.template + ${PROJECT_SOURCE_DIR}/support/cmake/openspace_header.template ${CMAKE_BINARY_DIR}/_generated/include/openspace/openspace.h @ONLY IMMEDIATE ) configure_file( - ${OPENSPACE_CMAKE_EXT_DIR}/commit.template - ${OPENSPACE_BASE_DIR}/COMMIT.md + ${PROJECT_SOURCE_DIR}/support/cmake/commit.template + ${PROJECT_SOURCE_DIR}/COMMIT.md @ONLY IMMEDIATE ) diff --git a/src/documentation/documentation.cpp b/src/documentation/documentation.cpp index 6048deed89..f5ba040530 100644 --- a/src/documentation/documentation.cpp +++ b/src/documentation/documentation.cpp @@ -147,6 +147,30 @@ SpecificationError::SpecificationError(TestResult res, std::string comp) ghoul_assert(!result.success, "Result's success must be false"); } +void logError(const SpecificationError& error, std::string component) { + if (error.result.success) { + // Nothing to print if we succeeded + return; + } + + if (component.empty()) { + LERRORC(error.component, error.message); + } + else { + LERRORC(fmt::format("{}: {}", component, error.component), error.message); + + } + for (const documentation::TestResult::Offense& o : error.result.offenses) { + LERRORC( + o.offender, + fmt::format("{}: {}", ghoul::to_string(o.reason), o.explanation) + ); + } + for (const documentation::TestResult::Warning& w : error.result.warnings) { + LWARNINGC(w.offender, ghoul::to_string(w.reason)); + } +} + DocumentationEntry::DocumentationEntry(std::string k, std::shared_ptr v, Optional opt, std::string doc) : key(std::move(k)) diff --git a/src/engine/moduleengine.cpp b/src/engine/moduleengine.cpp index 7e559ec041..334d2a6241 100644 --- a/src/engine/moduleengine.cpp +++ b/src/engine/moduleengine.cpp @@ -82,12 +82,7 @@ void ModuleEngine::initialize( m->initialize(configuration); } catch (const documentation::SpecificationError& e) { - for (const documentation::TestResult::Offense& o : e.result.offenses) { - LERRORC(e.component, o.offender + ": " + ghoul::to_string(o.reason)); - } - for (const documentation::TestResult::Warning& w : e.result.warnings) { - LWARNINGC(e.component, w.offender + ": " + ghoul::to_string(w.reason)); - } + logError(e); throw; } diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 4570dea0a1..85d834ce86 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -265,12 +265,7 @@ void OpenSpaceEngine::initialize() { } catch (const documentation::SpecificationError& e) { LERROR("Failed loading of log"); - for (const documentation::TestResult::Offense& o : e.result.offenses) { - LERRORC(o.offender, ghoul::to_string(o.reason)); - } - for (const documentation::TestResult::Warning& w : e.result.warnings) { - LWARNINGC(w.offender, ghoul::to_string(w.reason)); - } + logError(e); throw; } } @@ -1371,6 +1366,7 @@ void OpenSpaceEngine::keyboardCallback(Key key, KeyModifier mod, KeyAction actio global::eventEngine->publishEvent( events::EventApplicationShutdown::State::Aborted ); + return; } using F = global::callback::KeyboardCallback; diff --git a/src/interaction/joystickcamerastates.cpp b/src/interaction/joystickcamerastates.cpp index 8970fe73f3..0ca0273b6a 100644 --- a/src/interaction/joystickcamerastates.cpp +++ b/src/interaction/joystickcamerastates.cpp @@ -73,7 +73,7 @@ void JoystickCameraStates::updateStateFromInput( int nAxes = joystickInputStates.numAxes(joystickInputState.name); for (int i = 0; - i < std::min(static_cast(nAxes), joystick->axisMapping.size()); + i < std::min(nAxes, static_cast(joystick->axisMapping.size())); ++i) { AxisInformation t = joystick->axisMapping[i]; diff --git a/src/interaction/keybindingmanager.cpp b/src/interaction/keybindingmanager.cpp index 8e7dcb1e83..7dc6d83ef8 100644 --- a/src/interaction/keybindingmanager.cpp +++ b/src/interaction/keybindingmanager.cpp @@ -55,10 +55,11 @@ void KeybindingManager::keyboardCallback(Key key, KeyModifier modifier, KeyActio auto ret = _keyLua.equal_range({ key, modifier }); for (auto it = ret.first; it != ret.second; ++it) { ghoul_assert(!it->second.empty(), "Action must not be empty"); - ghoul_assert( - global::actionManager->hasAction(it->second), - "Action must be registered" - ); + if (!global::actionManager->hasAction(it->second)) { + // Silently ignoring the unknown action as the user might have intended to + // bind a key to multiple actions, only one of which could be defined + continue; + } global::actionManager->triggerAction(it->second, ghoul::Dictionary()); } } diff --git a/src/interaction/mousecamerastates.cpp b/src/interaction/mousecamerastates.cpp index 3a722cde79..3d8be3a6cb 100644 --- a/src/interaction/mousecamerastates.cpp +++ b/src/interaction/mousecamerastates.cpp @@ -52,11 +52,11 @@ void MouseCameraStates::updateStateFromInput(const MouseInputState& mouseinputSt bool primaryPressed = mouseinputState.isMouseButtonPressed(primary); bool secondaryPressed = mouseinputState.isMouseButtonPressed(secondary); bool button3Pressed = mouseinputState.isMouseButtonPressed(MouseButton::Button3); - bool keyCtrlPressed = keyboardinputState.isKeyPressed(Key::LeftControl) | + bool keyCtrlPressed = keyboardinputState.isKeyPressed(Key::LeftControl) || keyboardinputState.isKeyPressed(Key::RightControl); - bool keyShiftPressed = keyboardinputState.isKeyPressed(Key::LeftShift) | + bool keyShiftPressed = keyboardinputState.isKeyPressed(Key::LeftShift) || keyboardinputState.isKeyPressed(Key::RightShift); - bool keyAltPressed = keyboardinputState.isKeyPressed(Key::LeftAlt) | + bool keyAltPressed = keyboardinputState.isKeyPressed(Key::LeftAlt) || keyboardinputState.isKeyPressed(Key::RightAlt); // Update the mouse states diff --git a/src/navigation/orbitalnavigator.cpp b/src/navigation/orbitalnavigator.cpp index 276f02c0a4..fa6e0ec4af 100644 --- a/src/navigation/orbitalnavigator.cpp +++ b/src/navigation/orbitalnavigator.cpp @@ -539,6 +539,20 @@ glm::quat OrbitalNavigator::anchorNodeToCameraRotation() const { return glm::quat(invWorldRotation) * glm::quat(_camera->rotationQuaternion()); } + +glm::dvec3 OrbitalNavigator::pushToSurfaceOfAnchor( + const glm::dvec3& cameraPosition) const +{ + const SurfacePositionHandle posHandle = + calculateSurfacePositionHandle(*_anchorNode, cameraPosition); + + return pushToSurface( + cameraPosition, + _anchorNode->worldPosition(), + posHandle + ); +} + void OrbitalNavigator::resetVelocities() { _mouseStates.resetVelocities(); _joystickStates.resetVelocities(); @@ -703,7 +717,6 @@ void OrbitalNavigator::updateCameraStateFromStates(double deltaTime) { // Perform the vertical movements based on user input pose.position = translateVertically(deltaTime, pose.position, anchorPos, posHandle); pose.position = pushToSurface( - _minimumAllowedDistance, pose.position, anchorPos, posHandle @@ -992,6 +1005,10 @@ bool OrbitalNavigator::hasRollFriction() const { return _friction.roll; } +double OrbitalNavigator::minAllowedDistance() const { + return _minimumAllowedDistance; +} + OrbitalNavigator::CameraRotationDecomposition OrbitalNavigator::decomposeCameraRotationSurface(CameraPose cameraPose, const SceneGraphNode& reference) @@ -1473,8 +1490,7 @@ glm::dquat OrbitalNavigator::rotateHorizontally(double deltaTime, return mouseCameraRollRotation * globalCameraRotation; } -glm::dvec3 OrbitalNavigator::pushToSurface(double minHeightAboveGround, - const glm::dvec3& cameraPosition, +glm::dvec3 OrbitalNavigator::pushToSurface(const glm::dvec3& cameraPosition, const glm::dvec3& objectPosition, const SurfacePositionHandle& positionHandle) const { @@ -1495,7 +1511,7 @@ glm::dvec3 OrbitalNavigator::pushToSurface(double minHeightAboveGround, glm::sign(dot(actualSurfaceToCamera, referenceSurfaceOutDirection)); return cameraPosition + referenceSurfaceOutDirection * - glm::max(minHeightAboveGround - surfaceToCameraSigned, 0.0); + glm::max(_minimumAllowedDistance - surfaceToCameraSigned, 0.0); } glm::dquat OrbitalNavigator::interpolateRotationDifferential(double deltaTime, @@ -1520,7 +1536,7 @@ glm::dquat OrbitalNavigator::interpolateRotationDifferential(double deltaTime, SurfacePositionHandle OrbitalNavigator::calculateSurfacePositionHandle( const SceneGraphNode& node, - const glm::dvec3 cameraPositionWorldSpace) + const glm::dvec3& cameraPositionWorldSpace) const { ghoul_assert( glm::length(cameraPositionWorldSpace) > 0.0, diff --git a/src/navigation/pathnavigator.cpp b/src/navigation/pathnavigator.cpp index 0753b6fb47..b1ffcb6f01 100644 --- a/src/navigation/pathnavigator.cpp +++ b/src/navigation/pathnavigator.cpp @@ -274,12 +274,7 @@ void PathNavigator::createPath(const ghoul::Dictionary& dictionary) { } catch (const documentation::SpecificationError& e) { LERROR("Could not create camera path"); - for (const documentation::TestResult::Offense& o : e.result.offenses) { - LERRORC(o.offender, ghoul::to_string(o.reason)); - } - for (const documentation::TestResult::Warning& w : e.result.warnings) { - LWARNINGC(w.offender, ghoul::to_string(w.reason)); - } + logError(e); } catch (const PathCurve::TooShortPathError&) { // Do nothing diff --git a/src/navigation/pathnavigator_lua.inl b/src/navigation/pathnavigator_lua.inl index e58816f612..26d3e79bce 100644 --- a/src/navigation/pathnavigator_lua.inl +++ b/src/navigation/pathnavigator_lua.inl @@ -172,7 +172,7 @@ namespace { ); } catch (const documentation::SpecificationError& e) { - LERRORC("flyToNavigationState", ghoul::to_string(e.result)); + logError(e, "flyToNavigationState"); throw ghoul::lua::LuaError(fmt::format("Unable to create a path: {}", e.what())); } diff --git a/src/properties/property.cpp b/src/properties/property.cpp index 7ca893f124..31df2d52b0 100644 --- a/src/properties/property.cpp +++ b/src/properties/property.cpp @@ -40,8 +40,6 @@ namespace { constexpr std::string_view IdentifierKey = "Identifier"; constexpr std::string_view NameKey = "Name"; constexpr std::string_view TypeKey = "Type"; - constexpr std::string_view DescriptionKey = "Description"; - constexpr std::string_view JsonValueKey = "Value"; constexpr std::string_view MetaDataKey = "MetaData"; constexpr std::string_view AdditionalDataKey = "AdditionalData"; } // namespace diff --git a/src/rendering/dashboarditem.cpp b/src/rendering/dashboarditem.cpp index 801e045516..d941888a9d 100644 --- a/src/rendering/dashboarditem.cpp +++ b/src/rendering/dashboarditem.cpp @@ -46,6 +46,8 @@ namespace { std::string identifier; std::optional guiName; + + std::optional enabled; }; #include "dashboarditem_codegen.cpp" } // namespace @@ -71,7 +73,7 @@ std::unique_ptr DashboardItem::createFromDictionary( DashboardItem::DashboardItem(const ghoul::Dictionary& dictionary) : properties::PropertyOwner({ "", "" }) - , _isEnabled(EnabledInfo, true) + , _enabled(EnabledInfo, true) { const Parameters p = codegen::bake(dictionary); @@ -80,11 +82,12 @@ DashboardItem::DashboardItem(const ghoul::Dictionary& dictionary) setGuiName(*p.guiName); } - addProperty(_isEnabled); + _enabled = p.enabled.value_or(_enabled); + addProperty(_enabled); } bool DashboardItem::isEnabled() const { - return _isEnabled; + return _enabled; } } // namespace openspace diff --git a/src/rendering/renderable.cpp b/src/rendering/renderable.cpp index 6f063a4a4f..bfdae64f07 100644 --- a/src/rendering/renderable.cpp +++ b/src/rendering/renderable.cpp @@ -240,6 +240,10 @@ double Renderable::interactionSphere() const { return _interactionSphere; } +std::string_view Renderable::typeAsString() const { + return _renderableType; +} + SurfacePositionHandle Renderable::calculateSurfacePositionHandle( const glm::dvec3& targetModelSpace) const { diff --git a/src/scene/scene.cpp b/src/scene/scene.cpp index 54ec1639ac..5408e0b63f 100644 --- a/src/scene/scene.cpp +++ b/src/scene/scene.cpp @@ -469,7 +469,7 @@ void Scene::addPropertyInterpolation(properties::Property* prop, float durationS if (info.prop == prop) { info.beginTime = now; info.durationSeconds = durationSeconds; - info.postScript = std::move(postScript), + info.postScript = std::move(postScript); info.easingFunction = func; // If we found it, we can break since we make sure that each property is only // represented once in this diff --git a/src/scene/scene_lua.inl b/src/scene/scene_lua.inl index 0b3701aeb9..fe0a178d2c 100644 --- a/src/scene/scene_lua.inl +++ b/src/scene/scene_lua.inl @@ -603,7 +603,7 @@ namespace { node.hasValue("Identifier") ? node.value("Identifier") : "Scene"; - LERRORC(cat, ghoul::to_string(e.result)); + logError(e, cat); throw ghoul::lua::LuaError( fmt::format("Error loading scene graph node: {}", e.what()) diff --git a/src/scene/scenegraphnode.cpp b/src/scene/scenegraphnode.cpp index 30e09f426b..ed4dc79efe 100644 --- a/src/scene/scenegraphnode.cpp +++ b/src/scene/scenegraphnode.cpp @@ -160,25 +160,40 @@ namespace { openspace::properties::Property::Visibility::Developer }; + constexpr openspace::properties::Property::PropertyInfo + SupportsDirectInteractionInfo = + { + "SupportsDirectInteraction", + "Supports Direct Interaction", + "Only relevant when using touch interaction. If true, the \'direct " + "manipulation\' scheme will be used when interacting with this scene graph " + "node, meaning that the positions on the interaction sphere that intersects " + "with the touch points will directly follow the motion of the touch points. " + "Works best for objects that have an interaction sphere of about the same size " + "as the bounding sphere, and that are somewhat spherical. Note that using this " + "feature might significalty reduce the performance.", + openspace::properties::Property::Visibility::AdvancedUser + }; + struct [[codegen::Dictionary(SceneGraphNode)]] Parameters { - // The identifier of this scenegraph node. This name must be unique among all + // The identifier of this scene graph node. This name must be unique among all // scene graph nodes that are loaded in a specific scene. If a duplicate is // detected the loading of the node will fail, as will all childing that depend on // the node. The identifier must not contain any whitespaces or '.' std::string identifier; - // This names the parent of the currently specified scenegraph node. The parent + // This names the parent of the currently specified scene graph node. The parent // must already exist in the scene graph. If not specified, the node will be - // attached to the root of the scenegraph + // attached to the root of the scene graph std::optional parent [[codegen::annotation( - "If specified, this must be a name for another scenegraph node" + "If specified, this must be a name for another scene graph node" )]]; - // The renderable that is to be created for this scenegraph node. A renderable is - // a component of a scenegraph node that will lead to some visual result on the + // The renderable that is to be created for this scene graph node. A renderable is + // a component of a scene graph node that will lead to some visual result on the // screen. The specifics heavily depend on the 'Type' of the renderable. If no - // Renderable is specified, this scenegraph node is an internal node and can be + // Renderable is specified, this scene graph node is an internal node and can be // used for either group children, or apply common transformations to a group of // children std::optional renderable [[codegen::reference("renderable")]]; @@ -189,27 +204,30 @@ namespace { // [[codegen::verbatim(InteractionSphereInfo.description)]] std::optional interactionSphere; + // [[codegen::verbatim(SupportsDirectInteractionInfo.description)]] + std::optional supportsDirectInteraction; + struct Transform { - // This node describes a translation that is applied to the scenegraph node + // This node describes a translation that is applied to the scene graph node // and all its children. Depending on the 'Type' of the translation, this can // either be a static translation or a time-varying one std::optional translation [[codegen::reference("core_transform_translation")]]; - // This nodes describes a rotation that is applied to the scenegraph node and + // This nodes describes a rotation that is applied to the scene graph node and // all its children. Depending on the 'Type' of the rotation, this can either // be a static rotation or a time-varying one std::optional rotation [[codegen::reference("core_transform_rotation")]]; - // This node describes a scaling that is applied to the scenegraph node and + // This node describes a scaling that is applied to the scene graph node and // all its children. Depending on the 'Type' of the scaling, this can either // be a static scaling or a time-varying one std::optional scale [[codegen::reference("core_transform_scaling")]]; }; - // This describes a set of transformations that are applied to this scenegraph + // This describes a set of transformations that are applied to this scene graph // node and all of its children. There are only three possible values // corresponding to a 'Translation', a 'Rotation', and a 'Scale' std::optional transform; @@ -248,7 +266,7 @@ namespace { std::optional timeFrame [[codegen::reference("core_time_frame")]]; - // A tag or list of tags that can be used to reference to a group of scenegraph + // A tag or list of tags that can be used to reference to a group of scene graph // nodes. std::optional>> tag; @@ -258,7 +276,7 @@ namespace { std::optional name; // If this value is specified, this '/' separated URI specifies the location - // of this scenegraph node in a GUI representation, for instance + // of this scene graph node in a GUI representation, for instance // '/SolarSystem/Earth/Moon' std::optional path; @@ -266,12 +284,12 @@ namespace { std::optional description; // If this value is specified, GUI applications are incouraged to ignore this - // scenegraph node. This is most useful to trim collective lists of nodes and + // scene graph node. This is most useful to trim collective lists of nodes and // not display, for example, barycenters std::optional hidden; }; // Additional information that is passed to GUI applications. These are all hints - // and do not have any impact on the actual function of the scenegraph node + // and do not have any impact on the actual function of the scene graph node std::optional gui [[codegen::key("GUI")]]; }; #include "scenegraphnode_codegen.cpp" @@ -487,7 +505,7 @@ ghoul::opengl::ProgramObject* SceneGraphNode::_debugSphereProgram = nullptr; SceneGraphNode::SceneGraphNode() : properties::PropertyOwner({ "" }) - , _guiHidden(GuiHiddenInfo) + , _guiHidden(GuiHiddenInfo, false) , _guiPath(GuiPathInfo, "/") , _guiDisplayName(GuiNameInfo) , _guiDescription(GuiDescriptionInfo) @@ -513,6 +531,7 @@ SceneGraphNode::SceneGraphNode() , _screenSizeRadius(ScreenSizeRadiusInfo, 0) , _visibilityDistance(VisibilityDistanceInfo, 6e10f) , _showDebugSphere(ShowDebugSphereInfo, false) + , _supportsDirectInteraction(SupportsDirectInteractionInfo, false) { addProperty(_computeScreenSpaceValues); addProperty(_screenSpacePosition); @@ -552,6 +571,8 @@ SceneGraphNode::SceneGraphNode() addProperty(_approachFactor); addProperty(_showDebugSphere); + + addProperty(_supportsDirectInteraction); } SceneGraphNode::~SceneGraphNode() {} @@ -1207,6 +1228,10 @@ double SceneGraphNode::approachFactor() const { return _approachFactor; } +bool SceneGraphNode::supportsDirectInteraction() const { + return _supportsDirectInteraction; +} + const Renderable* SceneGraphNode::renderable() const { return _renderable.get(); } diff --git a/src/scripting/scriptengine.cpp b/src/scripting/scriptengine.cpp index 03fae5f5ab..65f9299315 100644 --- a/src/scripting/scriptengine.cpp +++ b/src/scripting/scriptengine.cpp @@ -445,12 +445,7 @@ void ScriptEngine::addLibraryFunctions(lua_State* state, LuaLibrary& library, library.documentations.push_back(std::move(func)); } catch (const documentation::SpecificationError& e) { - for (const documentation::TestResult::Offense& o : e.result.offenses) { - LERRORC(o.offender, ghoul::to_string(o.reason)); - } - for (const documentation::TestResult::Warning& w : e.result.warnings) { - LWARNINGC(w.offender, ghoul::to_string(w.reason)); - } + logError(e); } lua_pop(state, 1); } @@ -576,26 +571,31 @@ void ScriptEngine::writeLog(const std::string& script) { void ScriptEngine::preSync(bool isMaster) { ZoneScoped - if (!isMaster) { - return; - } - std::lock_guard guard(_clientScriptsMutex); - while (!_incomingScripts.empty()) { - QueueItem item = std::move(_incomingScripts.front()); - _incomingScripts.pop(); + if (isMaster) { + while (!_incomingScripts.empty()) { + QueueItem item = std::move(_incomingScripts.front()); + _incomingScripts.pop(); - _scriptsToSync.push_back(item.script); - const bool remoteScripting = item.remoteScripting; + _scriptsToSync.push_back(item.script); + const bool remoteScripting = item.remoteScripting; - // Not really a received script but the master also needs to run the script... - _masterScriptQueue.push(item); + // Not really a received script but the master also needs to run the script... + _masterScriptQueue.push(item); - if (global::parallelPeer->isHost() && remoteScripting) { - global::parallelPeer->sendScript(item.script); + if (global::parallelPeer->isHost() && remoteScripting) { + global::parallelPeer->sendScript(item.script); + } + if (global::sessionRecording->isRecording()) { + global::sessionRecording->saveScriptKeyframeToTimeline(item.script); + } } - if (global::sessionRecording->isRecording()) { - global::sessionRecording->saveScriptKeyframeToTimeline(item.script); + } + else { + while (!_incomingScripts.empty()) { + QueueItem item = std::move(_incomingScripts.front()); + _incomingScripts.pop(); + _clientScriptQueue.push(item.script); } } } diff --git a/src/util/coordinateconversion.cpp b/src/util/coordinateconversion.cpp index 27f58c359a..31526a63f5 100644 --- a/src/util/coordinateconversion.cpp +++ b/src/util/coordinateconversion.cpp @@ -301,7 +301,7 @@ std::pair decimalDegreesToIcrs(double ra, double dec) // Calculate Dec int decDegrees = static_cast(std::trunc(decDeg)); - double decMinutesFull = (abs(decDeg) - abs(decDegrees)) * 60.0; + double decMinutesFull = (std::abs(decDeg) - std::abs(decDegrees)) * 60.0; int decMinutes = static_cast(std::trunc(decMinutesFull)); double decSeconds = (decMinutesFull - decMinutes) * 60.0; diff --git a/src/util/taskloader.cpp b/src/util/taskloader.cpp index 651a541d30..39d38e51e6 100644 --- a/src/util/taskloader.cpp +++ b/src/util/taskloader.cpp @@ -92,12 +92,7 @@ std::vector> TaskLoader::tasksFromFile(const std::string& } catch (const documentation::SpecificationError& e) { LERROR(fmt::format("Could not load tasks file {}. {}", absTasksFile, e.what())); - for (const documentation::TestResult::Offense& o : e.result.offenses) { - LERROR(ghoul::to_string(o)); - } - for (const documentation::TestResult::Warning& w : e.result.warnings) { - LWARNING(ghoul::to_string(w)); - } + logError(e); return std::vector>(); } diff --git a/support/cmake/application_definition.cmake b/support/cmake/application_definition.cmake index effda193ce..caeb2666bd 100644 --- a/support/cmake/application_definition.cmake +++ b/support/cmake/application_definition.cmake @@ -22,14 +22,37 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/global_variables.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/global_variables.cmake) + +function (copy_files target) + # Add the copy command + foreach (file_i ${ARGN}) + if (IS_DIRECTORY "${file_i}") + # copy_if_different doesn't handle directories well and just copies them without + # contents. So if the path is a directory, we need to issue a different copy + # command + get_filename_component(folder ${file_i} NAME) + add_custom_command( + TARGET ${target} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory "${file_i}" "$/${folder}" + ) + else () + add_custom_command( + TARGET ${target} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${file_i}" $ + ) + endif () + endforeach () +endfunction () function (create_new_application application_name) add_executable(${application_name} MACOSX_BUNDLE ${ARGN}) set_openspace_compile_settings(${application_name}) if (WIN32) get_external_library_dependencies(ext_lib) - ghl_copy_files(${application_name} ${ext_lib}) + copy_files(${application_name} ${ext_lib}) endif () target_link_libraries(${application_name} PUBLIC openspace-module-base) diff --git a/support/cmake/module_common.cmake b/support/cmake/module_common.cmake index ee77dc1227..a2306feda5 100644 --- a/support/cmake/module_common.cmake +++ b/support/cmake/module_common.cmake @@ -39,7 +39,7 @@ endfunction () function (create_module_header_filepath module_name module_path header_filepath) string(TOLOWER ${module_name} module_name) - string(REPLACE "${OPENSPACE_BASE_DIR}/" "" module_path ${module_path}) + string(REPLACE "${PROJECT_SOURCE_DIR}/" "" module_path ${module_path}) set(header_filepath "${module_path}/${module_name}module.h" PARENT_SCOPE) endfunction () diff --git a/support/cmake/module_definition.cmake b/support/cmake/module_definition.cmake index 6f295822bc..d5d458bc7d 100644 --- a/support/cmake/module_definition.cmake +++ b/support/cmake/module_definition.cmake @@ -22,9 +22,8 @@ # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################################## -include(${OPENSPACE_CMAKE_EXT_DIR}/module_common.cmake) -include(${OPENSPACE_CMAKE_EXT_DIR}/set_openspace_compile_settings.cmake) -include(${GHOUL_BASE_DIR}/support/cmake/handle_external_library.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/module_common.cmake) +include(${PROJECT_SOURCE_DIR}/support/cmake/set_openspace_compile_settings.cmake) include(GenerateExportHeader) @@ -33,7 +32,7 @@ include(GenerateExportHeader) # The library will have the name openspace-module- and has all of their # dependencies set correctly. # The 'library_mode' determines whether the module is linked STATIC or SHARED -# Dependencies will have to be set in a file called "include.cmake" +# Dependencies will have to be set in a file called "include.cmake" function (create_new_module module_name output_library_name library_mode) # Create a library name of the style: openspace-module-${name} create_library_name(${module_name} library_name) @@ -47,7 +46,7 @@ function (create_new_module module_name output_library_name library_mode) # Set compile settings that are common to all modules set_openspace_compile_settings(${library_name}) - target_include_directories(${library_name} PUBLIC ${OPENSPACE_BASE_DIR}) + target_include_directories(${library_name} PUBLIC ${PROJECT_SOURCE_DIR}) create_define_name(${module_name} define_name) target_compile_definitions(${library_name} PUBLIC "${define_name}") @@ -68,7 +67,7 @@ function (create_new_module module_name output_library_name library_mode) # instead # This value is used in handle_modules.cmake::handle_modules set_property(GLOBAL PROPERTY CurrentModuleClassName "${module_name}Module") - + set(${output_library_name} ${library_name} PARENT_SCOPE) endfunction () diff --git a/support/cmake/packaging.cmake b/support/cmake/packaging.cmake index 0d190f2cbc..528309880a 100644 --- a/support/cmake/packaging.cmake +++ b/support/cmake/packaging.cmake @@ -27,8 +27,8 @@ set(CPACK_MONOLITHIC_INSTALL TRUE) include(InstallRequiredSystemLibraries) set(CPACK_PACKAGE_NAME "OpenSpace") -set(CPACK_PACKAGE_DESCRIPTION_FILE "${OPENSPACE_BASE_DIR}/README.md") -set(CPACK_RESOURCE_FILE_LICENSE "${OPENSPACE_BASE_DIR}/LICENSE.md") +set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.md") +set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE.md") set(CPACK_PACKAGE_VERSION_MAJOR "${OPENSPACE_VERSION_MAJOR}") set(CPACK_PACKAGE_VERSION_MINOR "${OPENSPACE_VERSION_MINOR}") set(CPACK_PACKAGE_VERSION_PATCH "${OPENSPACE_VERSION_PATCH}") @@ -42,15 +42,15 @@ set(CPACK_PACKAGE_FILE_NAME set(CPACK_STRIP_FILES 1) install(DIRECTORY - ${OPENSPACE_BASE_DIR}/bin/${CMAKE_BUILD_TYPE}/ + ${PROJECT_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}/ DESTINATION bin USE_SOURCE_PERMISSIONS ) -install(DIRECTORY ${OPENSPACE_BASE_DIR}/config/ DESTINATION config) +install(DIRECTORY ${PROJECT_SOURCE_DIR}/config/ DESTINATION config) -install(DIRECTORY ${OPENSPACE_BASE_DIR}/data/ DESTINATION data) +install(DIRECTORY ${PROJECT_SOURCE_DIR}/data/ DESTINATION data) -install(DIRECTORY ${OPENSPACE_BASE_DIR}/modules/ +install(DIRECTORY ${PROJECT_SOURCE_DIR}/modules/ DESTINATION modules FILES_MATCHING PATTERN "*.glsl" @@ -59,25 +59,25 @@ install(DIRECTORY ${OPENSPACE_BASE_DIR}/modules/ PATTERN "*.vs" PATTERN "*.lua" ) -install(DIRECTORY ${OPENSPACE_BASE_DIR}/scripts/ DESTINATION scripts) -install(DIRECTORY ${OPENSPACE_BASE_DIR}/shaders/ DESTINATION shaders) +install(DIRECTORY ${PROJECT_SOURCE_DIR}/scripts/ DESTINATION scripts) +install(DIRECTORY ${PROJECT_SOURCE_DIR}/shaders/ DESTINATION shaders) install(FILES - ${OPENSPACE_BASE_DIR}/openspace.cfg - ${OPENSPACE_BASE_DIR}/CREDITS.md - ${OPENSPACE_BASE_DIR}/LICENSE.md - ${OPENSPACE_BASE_DIR}/README.md + ${PROJECT_SOURCE_DIR}/openspace.cfg + ${PROJECT_SOURCE_DIR}/CREDITS.md + ${PROJECT_SOURCE_DIR}/LICENSE.md + ${PROJECT_SOURCE_DIR}/README.md DESTINATION . ) if (WIN32) set(CPACK_GENERATOR ZIP) # Need backslash for correct subdirectory paths - set(CPACK_PACKAGE_ICON "${OPENSPACE_BASE_DIR}\\\\apps\\\\OpenSpace\\\\openspace.png") + set(CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}\\\\apps\\\\OpenSpace\\\\openspace.png") set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_NAME}\\\\${OPENSPACE_VERSION_NUMBER} ${OPENSPACE_VERSION_STRING}") else () set(CPACK_GENERATOR TGZ) - set(CPACK_PACKAGE_ICON "${OPENSPACE_BASE_DIR}/apps/OpenSpace/openspace.png") + set(CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}/apps/OpenSpace/openspace.png") set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_NAME}/${OPENSPACE_VERSION_NUMBER} ${OPENSPACE_VERSION_STRING}") endif () @@ -97,7 +97,7 @@ if (OPENSPACE_CREATE_INSTALLER) # Delete the desktop link set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "Delete '$DESKTOP\\\\${CPACK_NSIS_DISPLAY_NAME}.lnk' ") # The icon to start the application. - set(CPACK_NSIS_MUI_ICON "${OPENSPACE_BASE_DIR}\\\\apps\\\\OpenSpace\\\\openspace.ico") + set(CPACK_NSIS_MUI_ICON "${PROJECT_SOURCE_DIR}\\\\apps\\\\OpenSpace\\\\openspace.ico") # Add a link to the application website in the startup menu. set(CPACK_NSIS_MENU_LINKS "http://openspaceproject.com/" "OpenSpace Homepage") # Set the icon for the application in the Add/Remove programs section. diff --git a/support/cmake/set_openspace_compile_settings.cmake b/support/cmake/set_openspace_compile_settings.cmake index d7a3a301b0..1c3768c2a6 100644 --- a/support/cmake/set_openspace_compile_settings.cmake +++ b/support/cmake/set_openspace_compile_settings.cmake @@ -31,13 +31,9 @@ function (set_openspace_compile_settings target) "/wd4127" # conditional expression is constant [raised by: websocketpp] "/wd4201" # nonstandard extension used : nameless struct/union [raised by: GLM] "/wd5030" # attribute 'attribute' is not recognized [raised by: codegen] - "/std:c++latest" "/permissive-" "/Zc:__cplusplus" # Correctly set the __cplusplus macro ) - if (OPENSPACE_WARNINGS_AS_ERRORS) - set(MSVC_WARNINGS ${MSVC_WARNINGS} "/WX") - endif () if (OPENSPACE_OPTIMIZATION_ENABLE_AVX) set(MSVC_WARNINGS ${MSVC_WARNINGS} "/arch:AVX") endif () @@ -61,12 +57,11 @@ function (set_openspace_compile_settings target) endif () set(CLANG_WARNINGS - "-stdlib=libc++" "-Wall" "-Wextra" "-Wmost" "-Wpedantic" - + "-Wabstract-vbase-init" "-Walloca" "-Wanon-enum-enum-conversion" @@ -141,14 +136,11 @@ function (set_openspace_compile_settings target) "-Wvariadic-macros" "-Wvla" "-Wzero-as-null-pointer-constant" - + "-Wno-attributes" "-Wno-missing-braces" "-Wno-unknown-attributes" ) - if (OPENSPACE_WARNINGS_AS_ERRORS) - set(CLANG_WARNINGS ${CLANG_WARNINGS} "-Werror") - endif () set(GCC_WARNINGS @@ -177,17 +169,15 @@ function (set_openspace_compile_settings target) "-Wuninitialized" "-Wvla" "-Wzero-as-null-pointer-constant" - + "-Wno-attributes" "-Wno-deprecated-copy" "-Wno-float-equal" "-Wno-long-long" + "-Wno-missing-field-initializers" "-Wno-unknown-attributes" "-Wno-write-strings" ) - if (OPENSPACE_WARNINGS_AS_ERRORS) - set(GCC_WARNINGS ${CLANG_WARNINGS} "-Werror") - endif () if (MSVC) target_compile_options(${target} PRIVATE ${MSVC_WARNINGS}) @@ -198,16 +188,12 @@ function (set_openspace_compile_settings target) target_compile_definitions(${target} PRIVATE "WIN32_LEAN_AND_MEAN") target_compile_definitions(${target} PRIVATE "VC_EXTRALEAN") elseif (NOT LINUX AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") - if (OPENSPACE_WARNINGS_AS_ERRORS) - target_compile_options(${target} PRIVATE "-Werror") - endif () - # Apple has "deprecated" OpenGL and offers nothing by warnings instead + # Apple has "deprecated" OpenGL and offers nothing but warnings instead target_compile_definitions(${target} PRIVATE "GL_SILENCE_DEPRECATION") target_compile_options(${target} PRIVATE ${CLANG_WARNINGS}) elseif (UNIX AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") - target_compile_options(${target} PRIVATE ${CLANG_WARNINGS} "-std=c++17") - target_link_libraries(${target} PRIVATE "c++" "c++abi") + target_compile_options(${target} PRIVATE ${CLANG_WARNINGS}) elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") target_compile_options(${target} PRIVATE ${GCC_WARNINGS}) else () diff --git a/support/coding/codegen b/support/coding/codegen index be55036b25..c078531087 160000 --- a/support/coding/codegen +++ b/support/coding/codegen @@ -1 +1 @@ -Subproject commit be55036b25c537b3c2e306465d450e6df6625df3 +Subproject commit c07853108775739727d837fb4974763f798d0b2c diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6361a26c61..b2d5e9f9cb 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -53,13 +53,8 @@ add_executable( set_openspace_compile_settings(OpenSpaceTest) -target_include_directories(OpenSpaceTest - PUBLIC - "${GHOUL_BASE_DIR}/ext/catch2/single_include" - "${OPENSPACE_BASE_DIR}" -) target_compile_definitions(OpenSpaceTest PUBLIC "GHL_THROW_ON_ASSERT") -target_link_libraries(OpenSpaceTest PUBLIC openspace-core) +target_link_libraries(OpenSpaceTest PUBLIC Catch2 openspace-core) foreach (library_name ${all_enabled_modules}) get_target_property(library_type ${library_name} TYPE) @@ -78,4 +73,4 @@ if (OPENSPACE_MODULE_WEBBROWSER AND CEF_ROOT) run_cef_platform_config("${CEF_ROOT}" "${CEF_TARGET}" "${WEBBROWSER_MODULE_PATH}") endif () -set_folder_location(OpenSpaceTest "Unit Tests") +set_target_properties(OpenSpaceTest PROPERTIES FOLDER "Unit Tests") diff --git a/tests/main.cpp b/tests/main.cpp index 844cead108..0da1022ff9 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -22,8 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#define CATCH_CONFIG_RUNNER -#include "catch2/catch.hpp" +#include #include #include diff --git a/tests/property/test_property_listproperties.cpp b/tests/property/test_property_listproperties.cpp index 19d55f8997..d2eb8d680e 100644 --- a/tests/property/test_property_listproperties.cpp +++ b/tests/property/test_property_listproperties.cpp @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include #include #include diff --git a/tests/property/test_property_optionproperty.cpp b/tests/property/test_property_optionproperty.cpp index 19b469d5fd..bf4dfb8245 100644 --- a/tests/property/test_property_optionproperty.cpp +++ b/tests/property/test_property_optionproperty.cpp @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include #include diff --git a/tests/property/test_property_selectionproperty.cpp b/tests/property/test_property_selectionproperty.cpp index 96e882896e..4e0e22a35d 100644 --- a/tests/property/test_property_selectionproperty.cpp +++ b/tests/property/test_property_selectionproperty.cpp @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include #include #include diff --git a/tests/regression/517.cpp b/tests/regression/517.cpp index 8a2ca7be12..7cb2cd189b 100644 --- a/tests/regression/517.cpp +++ b/tests/regression/517.cpp @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include #include diff --git a/tests/test_assetloader.cpp b/tests/test_assetloader.cpp index 845b8fced4..a3a783418d 100644 --- a/tests/test_assetloader.cpp +++ b/tests/test_assetloader.cpp @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include #include #include diff --git a/tests/test_concurrentqueue.cpp b/tests/test_concurrentqueue.cpp index 4b85000f2a..a8cbd1fcf0 100644 --- a/tests/test_concurrentqueue.cpp +++ b/tests/test_concurrentqueue.cpp @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include #include diff --git a/tests/test_configuration.cpp b/tests/test_configuration.cpp index dfb198778f..01cd0b8839 100644 --- a/tests/test_configuration.cpp +++ b/tests/test_configuration.cpp @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include #include #include diff --git a/tests/test_distanceconversion.cpp b/tests/test_distanceconversion.cpp index ef38e7c824..98fe07da54 100644 --- a/tests/test_distanceconversion.cpp +++ b/tests/test_distanceconversion.cpp @@ -22,7 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include +#include #include #include @@ -34,76 +35,76 @@ TEST_CASE("DistanceConversion: Convert to meters", "[distanceconversion]") { double res; res = convertDistance(unit, DistanceUnit::Nanometer, DistanceUnit::Meter); - CHECK(res == Approx(1e-9)); + CHECK(res == Catch::Approx(1e-9)); res = convertDistance(unit, DistanceUnit::Micrometer, DistanceUnit::Meter); - CHECK(res == Approx(1e-6)); + CHECK(res == Catch::Approx(1e-6)); res = convertDistance(unit, DistanceUnit::Millimeter, DistanceUnit::Meter); - CHECK(res == Approx(1e-3)); + CHECK(res == Catch::Approx(1e-3)); res = convertDistance(unit, DistanceUnit::Centimeter, DistanceUnit::Meter); - CHECK(res == Approx(1e-2)); + CHECK(res == Catch::Approx(1e-2)); res = convertDistance(unit, DistanceUnit::Decimeter, DistanceUnit::Meter); - CHECK(res == Approx(1e-1)); + CHECK(res == Catch::Approx(1e-1)); res = convertDistance(unit, DistanceUnit::Meter, DistanceUnit::Meter); - CHECK(res == Approx(1.0)); + CHECK(res == Catch::Approx(1.0)); res = convertDistance(unit, DistanceUnit::Kilometer, DistanceUnit::Meter); - CHECK(res == Approx(1000.0)); + CHECK(res == Catch::Approx(1000.0)); res = convertDistance(unit, DistanceUnit::AU, DistanceUnit::Meter); - CHECK(res == Approx(1.495978707E11)); + CHECK(res == Catch::Approx(1.495978707E11)); res = convertDistance(unit, DistanceUnit::Lighthour, DistanceUnit::Meter); - CHECK(res == Approx(1.0799921E12)); + CHECK(res == Catch::Approx(1.0799921E12)); res = convertDistance(unit, DistanceUnit::Lightday, DistanceUnit::Meter); - CHECK(res == Approx(2.591981E13)); + CHECK(res == Catch::Approx(2.591981E13)); res = convertDistance(unit, DistanceUnit::Lightmonth, DistanceUnit::Meter); - CHECK(res == Approx(7.8839421E14)); + CHECK(res == Catch::Approx(7.8839421E14)); res = convertDistance(unit, DistanceUnit::Lightyear, DistanceUnit::Meter); - CHECK(res == Approx(9.4607304725808E15)); + CHECK(res == Catch::Approx(9.4607304725808E15)); res = convertDistance(unit, DistanceUnit::Parsec, DistanceUnit::Meter); - CHECK(res == Approx(3.0856776E16)); + CHECK(res == Catch::Approx(3.0856776E16)); res = convertDistance(unit, DistanceUnit::Kiloparsec, DistanceUnit::Meter); - CHECK(res == Approx(1e3 * 3.0856776E16)); + CHECK(res == Catch::Approx(1e3 * 3.0856776E16)); res = convertDistance(unit, DistanceUnit::Megaparsec, DistanceUnit::Meter); - CHECK(res == Approx(1e6 * 3.0856776E16)); + CHECK(res == Catch::Approx(1e6 * 3.0856776E16)); res = convertDistance(unit, DistanceUnit::Gigaparsec, DistanceUnit::Meter); - CHECK(res == Approx(1e9 * 3.0856776E16)); + CHECK(res == Catch::Approx(1e9 * 3.0856776E16)); res = convertDistance(unit, DistanceUnit::Thou, DistanceUnit::Meter); - CHECK(res == Approx(1e-3 * 0.0254)); + CHECK(res == Catch::Approx(1e-3 * 0.0254)); res = convertDistance(unit, DistanceUnit::Inch, DistanceUnit::Meter); - CHECK(res == Approx(0.0254)); + CHECK(res == Catch::Approx(0.0254)); res = convertDistance(unit, DistanceUnit::Foot, DistanceUnit::Meter); - CHECK(res == Approx(0.3048)); + CHECK(res == Catch::Approx(0.3048)); res = convertDistance(unit, DistanceUnit::Yard, DistanceUnit::Meter); - CHECK(res == Approx(0.9144)); + CHECK(res == Catch::Approx(0.9144)); res = convertDistance(unit, DistanceUnit::Chain, DistanceUnit::Meter); - CHECK(res == Approx(20.1168)); + CHECK(res == Catch::Approx(20.1168)); res = convertDistance(unit, DistanceUnit::Furlong, DistanceUnit::Meter); - CHECK(res == Approx(10.0 * 20.1168)); + CHECK(res == Catch::Approx(10.0 * 20.1168)); res = convertDistance(unit, DistanceUnit::Mile, DistanceUnit::Meter); - CHECK(res == Approx(1609.344)); + CHECK(res == Catch::Approx(1609.344)); res = convertDistance(unit, DistanceUnit::League, DistanceUnit::Meter); - CHECK(res == Approx(3.0 * 1609.344)); + CHECK(res == Catch::Approx(3.0 * 1609.344)); } TEST_CASE("DistanceConversion: Convert from meters", "[distanceconversion]") { @@ -111,76 +112,76 @@ TEST_CASE("DistanceConversion: Convert from meters", "[distanceconversion]") { double res; res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Nanometer); - CHECK(res == Approx(meters / 1e-9)); + CHECK(res == Catch::Approx(meters / 1e-9)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Micrometer); - CHECK(res == Approx(meters / 1e-6)); + CHECK(res == Catch::Approx(meters / 1e-6)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Millimeter); - CHECK(res == Approx(meters / 1e-3)); + CHECK(res == Catch::Approx(meters / 1e-3)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Centimeter); - CHECK(res == Approx(meters / 1e-2)); + CHECK(res == Catch::Approx(meters / 1e-2)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Decimeter); - CHECK(res == Approx(meters / 1e-1)); + CHECK(res == Catch::Approx(meters / 1e-1)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Meter); - CHECK(res == Approx(1.0)); + CHECK(res == Catch::Approx(1.0)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Kilometer); - CHECK(res == Approx(meters / 1000.0)); + CHECK(res == Catch::Approx(meters / 1000.0)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::AU); - CHECK(res == Approx(meters / 1.495978707E11)); + CHECK(res == Catch::Approx(meters / 1.495978707E11)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Lighthour); - CHECK(res == Approx(meters / 1.0799921E12)); + CHECK(res == Catch::Approx(meters / 1.0799921E12)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Lightday); - CHECK(res == Approx(meters / 2.591981E13)); + CHECK(res == Catch::Approx(meters / 2.591981E13)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Lightmonth); - CHECK(res == Approx(meters / 7.8839421E14)); + CHECK(res == Catch::Approx(meters / 7.8839421E14)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Lightyear); - CHECK(res == Approx(meters / 9.4607304725808E15)); + CHECK(res == Catch::Approx(meters / 9.4607304725808E15)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Parsec); - CHECK(res == Approx(meters / 3.0856776E16)); + CHECK(res == Catch::Approx(meters / 3.0856776E16)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Kiloparsec); - CHECK(res == Approx(meters / (1e3 * 3.0856776E16))); + CHECK(res == Catch::Approx(meters / (1e3 * 3.0856776E16))); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Megaparsec); - CHECK(res == Approx(meters / (1e6 * 3.0856776E16))); + CHECK(res == Catch::Approx(meters / (1e6 * 3.0856776E16))); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Gigaparsec); - CHECK(res == Approx(meters / (1e9 * 3.0856776E16))); + CHECK(res == Catch::Approx(meters / (1e9 * 3.0856776E16))); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Thou); - CHECK(res == Approx(meters / (1e-3 * 0.0254))); + CHECK(res == Catch::Approx(meters / (1e-3 * 0.0254))); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Inch); - CHECK(res == Approx(meters / 0.0254)); + CHECK(res == Catch::Approx(meters / 0.0254)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Foot); - CHECK(res == Approx(meters / 0.3048)); + CHECK(res == Catch::Approx(meters / 0.3048)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Yard); - CHECK(res == Approx(meters / 0.9144)); + CHECK(res == Catch::Approx(meters / 0.9144)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Chain); - CHECK(res == Approx(meters / 20.1168)); + CHECK(res == Catch::Approx(meters / 20.1168)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Furlong); - CHECK(res == Approx(meters / (10.0 * 20.1168))); + CHECK(res == Catch::Approx(meters / (10.0 * 20.1168))); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::Mile); - CHECK(res == Approx(meters / 1609.344)); + CHECK(res == Catch::Approx(meters / 1609.344)); res = convertDistance(meters, DistanceUnit::Meter, DistanceUnit::League); - CHECK(res == Approx(meters / (3.0 * 1609.344))); + CHECK(res == Catch::Approx(meters / (3.0 * 1609.344))); } TEST_CASE("DistanceConversion: Cross conversion", "[distanceconversion]") { @@ -188,71 +189,71 @@ TEST_CASE("DistanceConversion: Cross conversion", "[distanceconversion]") { double res; res = convertDistance(unit, DistanceUnit::Nanometer, DistanceUnit::Kilometer); - CHECK(res == Approx(1e-12)); + CHECK(res == Catch::Approx(1e-12)); res = convertDistance(unit, DistanceUnit::Micrometer, DistanceUnit::Decimeter); - CHECK(res == Approx(1e-5)); + CHECK(res == Catch::Approx(1e-5)); res = convertDistance(unit, DistanceUnit::Millimeter, DistanceUnit::Nanometer); - CHECK(res == Approx(1e6)); + CHECK(res == Catch::Approx(1e6)); res = convertDistance(unit, DistanceUnit::Centimeter, DistanceUnit::Micrometer); - CHECK(res == Approx(1e4)); + CHECK(res == Catch::Approx(1e4)); res = convertDistance(unit, DistanceUnit::Decimeter, DistanceUnit::Millimeter); - CHECK(res == Approx(1e2)); + CHECK(res == Catch::Approx(1e2)); res = convertDistance(unit, DistanceUnit::Kilometer, DistanceUnit::Centimeter); - CHECK(res == Approx(1e5)); + CHECK(res == Catch::Approx(1e5)); res = convertDistance(unit, DistanceUnit::AU, DistanceUnit::Parsec); - CHECK(res == Approx(4.84813681e-6)); + CHECK(res == Catch::Approx(4.84813681e-6)); res = convertDistance(unit, DistanceUnit::Lighthour, DistanceUnit::Lightmonth); - CHECK(res == Approx(1.36986305e-3)); + CHECK(res == Catch::Approx(1.36986305e-3)); res = convertDistance(unit, DistanceUnit::Lightday, DistanceUnit::Kiloparsec); - CHECK(res == Approx(8.40003829e-7)); + CHECK(res == Catch::Approx(8.40003829e-7)); res = convertDistance(unit, DistanceUnit::Lightmonth, DistanceUnit::Lightday); - CHECK(res == Approx(30.4166662487)); + CHECK(res == Catch::Approx(30.4166662487)); res = convertDistance(unit, DistanceUnit::Lightyear, DistanceUnit::Gigaparsec); - CHECK(res == Approx(3.0660139e-10)); + CHECK(res == Catch::Approx(3.0660139e-10)); res = convertDistance(unit, DistanceUnit::Parsec, DistanceUnit::Lightyear); - CHECK(res == Approx(3.26156379673)); + CHECK(res == Catch::Approx(3.26156379673)); res = convertDistance(unit, DistanceUnit::Kiloparsec, DistanceUnit::AU); - CHECK(res == Approx(2.06264806E8)); + CHECK(res == Catch::Approx(2.06264806E8)); res = convertDistance(unit, DistanceUnit::Megaparsec, DistanceUnit::Lighthour); - CHECK(res == Approx(2.85712978826E10)); + CHECK(res == Catch::Approx(2.85712978826E10)); res = convertDistance(unit, DistanceUnit::Gigaparsec, DistanceUnit::Megaparsec); - CHECK(res == Approx(1e3)); + CHECK(res == Catch::Approx(1e3)); res = convertDistance(unit, DistanceUnit::Thou, DistanceUnit::Yard); - CHECK(res == Approx(2.77777778e-5)); + CHECK(res == Catch::Approx(2.77777778e-5)); res = convertDistance(unit, DistanceUnit::Inch, DistanceUnit::Foot); - CHECK(res == Approx(8.33333333e-2)); + CHECK(res == Catch::Approx(8.33333333e-2)); res = convertDistance(unit, DistanceUnit::Foot, DistanceUnit::Mile); - CHECK(res == Approx(1.89393939e-4)); + CHECK(res == Catch::Approx(1.89393939e-4)); res = convertDistance(unit, DistanceUnit::Yard, DistanceUnit::Chain); - CHECK(res == Approx(4.54545455e-2)); + CHECK(res == Catch::Approx(4.54545455e-2)); res = convertDistance(unit, DistanceUnit::Chain, DistanceUnit::League); - CHECK(res == Approx(4.16666666e-3)); + CHECK(res == Catch::Approx(4.16666666e-3)); res = convertDistance(unit, DistanceUnit::Furlong, DistanceUnit::Thou); - CHECK(res == Approx(7.92E6)); + CHECK(res == Catch::Approx(7.92E6)); res = convertDistance(unit, DistanceUnit::Mile, DistanceUnit::Inch); - CHECK(res == Approx(6.3360E4)); + CHECK(res == Catch::Approx(6.3360E4)); res = convertDistance(unit, DistanceUnit::League, DistanceUnit::Furlong); - CHECK(res == Approx(24.0)); + CHECK(res == Catch::Approx(24.0)); } diff --git a/tests/test_documentation.cpp b/tests/test_documentation.cpp index b012fc5603..66702f9789 100644 --- a/tests/test_documentation.cpp +++ b/tests/test_documentation.cpp @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include #include #include diff --git a/tests/test_horizons.cpp b/tests/test_horizons.cpp index c5a70ee113..2d97b5ed3b 100644 --- a/tests/test_horizons.cpp +++ b/tests/test_horizons.cpp @@ -22,7 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include +#include #include #include @@ -123,22 +124,22 @@ void testReadingHorizons(HorizonsType type, std::filesystem::path filePath, std::vector data = result.data; REQUIRE(data.size() == 3); - CHECK(data[0].time == Approx(t0)); - CHECK(data[0].position.x == Approx(x0)); - CHECK(data[0].position.y == Approx(y0)); - CHECK(data[0].position.z == Approx(z0)); + CHECK(data[0].time == Catch::Approx(t0)); + CHECK(data[0].position.x == Catch::Approx(x0)); + CHECK(data[0].position.y == Catch::Approx(y0)); + CHECK(data[0].position.z == Catch::Approx(z0)); - CHECK(data[1].time == Approx(t1)); - CHECK(data[1].position.x == Approx(x1)); - CHECK(data[1].position.y == Approx(y1)); - CHECK(data[1].position.z == Approx(z1)); + CHECK(data[1].time == Catch::Approx(t1)); + CHECK(data[1].position.x == Catch::Approx(x1)); + CHECK(data[1].position.y == Catch::Approx(y1)); + CHECK(data[1].position.z == Catch::Approx(z1)); - CHECK(data[2].time == Approx(t2)); - CHECK(data[2].position.x == Approx(x2)); - CHECK(data[2].position.y == Approx(y2)); - CHECK(data[2].position.z == Approx(z2)); + CHECK(data[2].time == Catch::Approx(t2)); + CHECK(data[2].position.x == Catch::Approx(x2)); + CHECK(data[2].position.y == Catch::Approx(y2)); + CHECK(data[2].position.z == Catch::Approx(z2)); // Clean up openspace::SpiceManager::ref().unloadKernel(kernel.string()); diff --git a/tests/test_iswamanager.cpp b/tests/test_iswamanager.cpp index cec926f432..f6a5dbb97a 100644 --- a/tests/test_iswamanager.cpp +++ b/tests/test_iswamanager.cpp @@ -24,7 +24,7 @@ #ifdef OPENSPACE_MODULE_ISWA_ENABLED -#include "catch2/catch.hpp" +#include #include #include diff --git a/tests/test_jsonformatting.cpp b/tests/test_jsonformatting.cpp index 3caca0b87a..cd3d97b28d 100644 --- a/tests/test_jsonformatting.cpp +++ b/tests/test_jsonformatting.cpp @@ -22,7 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include +#include #include #include diff --git a/tests/test_latlonpatch.cpp b/tests/test_latlonpatch.cpp index 185585d4ee..6b95778f35 100644 --- a/tests/test_latlonpatch.cpp +++ b/tests/test_latlonpatch.cpp @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include #include #include diff --git a/tests/test_lrucache.cpp b/tests/test_lrucache.cpp index 235444c587..05355ea0fb 100644 --- a/tests/test_lrucache.cpp +++ b/tests/test_lrucache.cpp @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include #include #include diff --git a/tests/test_lua_createsinglecolorimage.cpp b/tests/test_lua_createsinglecolorimage.cpp index ed4b943dc0..1f65021d13 100644 --- a/tests/test_lua_createsinglecolorimage.cpp +++ b/tests/test_lua_createsinglecolorimage.cpp @@ -22,7 +22,9 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include +#include +#include #include #include @@ -42,7 +44,7 @@ TEST_CASE("CreateSingleColorImage: Create image and check return value", CHECK_THAT( path.string(), - Catch::Matchers::Contains("colorFile.ppm") + Catch::Matchers::ContainsSubstring("colorFile.ppm") ); } @@ -54,7 +56,7 @@ TEST_CASE("CreateSingleColorImage: Faulty color value (invalid values)", "notCreatedColorFile", glm::dvec3(255.0, 0.0, 0.0) ).string(), - Catch::Matchers::Contains( + Catch::Matchers::Equals( "Invalid color. Expected three double values {r, g, b} in range 0 to 1" ) ); diff --git a/tests/test_profile.cpp b/tests/test_profile.cpp index 53f800df41..c201093fdc 100644 --- a/tests/test_profile.cpp +++ b/tests/test_profile.cpp @@ -22,7 +22,9 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include +#include +#include #include #include @@ -1036,7 +1038,7 @@ TEST_CASE("(Error) Version: Missing value 'major'", "[profile]") { "${TESTDIR}/profile/error/version/missing_major.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'version.major' field is missing") + Catch::Matchers::Equals("(profile) 'version.major' field is missing") ); } @@ -1045,7 +1047,7 @@ TEST_CASE("(Error) Version: Missing value 'minor'", "[profile]") { "${TESTDIR}/profile/error/version/missing_minor.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'version.minor' field is missing") + Catch::Matchers::Equals("(profile) 'version.minor' field is missing") ); } @@ -1054,7 +1056,7 @@ TEST_CASE("(Error) Version: Wrong type 'major'", "[profile]") { "${TESTDIR}/profile/error/version/wrongtype_major.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'version.major' must be a number") + Catch::Matchers::Equals("(profile) 'version.major' must be a number") ); } @@ -1063,7 +1065,7 @@ TEST_CASE("(Error) Version: Wrong type 'minor'", "[profile]") { "${TESTDIR}/profile/error/version/wrongtype_minor.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'version.minor' must be a number") + Catch::Matchers::Equals("(profile) 'version.minor' must be a number") ); } @@ -1072,7 +1074,7 @@ TEST_CASE("(Error) Version: Wrong type 'major' and 'minor'", "[profile]") { "${TESTDIR}/profile/error/version/wrongtype_major_minor.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'version.major' must be a number") + Catch::Matchers::Equals("(profile) 'version.major' must be a number") ); } @@ -1086,7 +1088,7 @@ TEST_CASE("(Error) Module: Missing value 'name'", "[profile]") { "${TESTDIR}/profile/error/module/missing_name.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'module.name' field is missing") + Catch::Matchers::Equals("(profile) 'module.name' field is missing") ); } @@ -1095,7 +1097,7 @@ TEST_CASE("(Error) Module: Wrong type 'name'", "[profile]") { "${TESTDIR}/profile/error/module/wrongtype_name.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'module.name' must be a string") + Catch::Matchers::Equals("(profile) 'module.name' must be a string") ); } @@ -1104,7 +1106,7 @@ TEST_CASE("(Error) Module: Wrong type 'loadedInstruction'", "[profile]") { "${TESTDIR}/profile/error/module/wrongtype_loadedInstruction.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'module.loadedInstruction' must be a string") + Catch::Matchers::Equals("(profile) 'module.loadedInstruction' must be a string") ); } @@ -1113,7 +1115,7 @@ TEST_CASE("(Error) Module: Wrong type 'notLoadedInstruction'", "[profile]") { "${TESTDIR}/profile/error/module/wrongtype_notLoadedInstruction.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'module.notLoadedInstruction' must be a string") + Catch::Matchers::Equals("(profile) 'module.notLoadedInstruction' must be a string") ); } @@ -1126,7 +1128,7 @@ TEST_CASE("(Error) Property: Missing value 'name'", "[profile]") { "${TESTDIR}/profile/error/property/missing_name.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'property.name' field is missing") + Catch::Matchers::Equals("(profile) 'property.name' field is missing") ); } @@ -1135,7 +1137,7 @@ TEST_CASE("(Error) Property: Missing value 'value'", "[profile]") { "${TESTDIR}/profile/error/property/missing_value.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'property.value' field is missing") + Catch::Matchers::Equals("(profile) 'property.value' field is missing") ); } @@ -1144,7 +1146,7 @@ TEST_CASE("(Error) Property: Missing value 'name' and 'value'", "[profile]") { "${TESTDIR}/profile/error/property/missing_name_value.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'property.name' field is missing") + Catch::Matchers::Equals("(profile) 'property.name' field is missing") ); } @@ -1153,7 +1155,7 @@ TEST_CASE("(Error) Property: Wrong value 'type'", "[profile]") { "${TESTDIR}/profile/error/property/wrongvalue_type.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("Unknown property set type") + Catch::Matchers::Equals("(profile) Unknown property set type") ); } @@ -1162,7 +1164,7 @@ TEST_CASE("(Error) Property: Wrong type 'name'", "[profile]") { "${TESTDIR}/profile/error/property/wrongtype_name.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'property.name' must be a string") + Catch::Matchers::Equals("(profile) 'property.name' must be a string") ); } @@ -1171,7 +1173,7 @@ TEST_CASE("(Error) Property: Wrong type 'value'", "[profile]") { "${TESTDIR}/profile/error/property/wrongtype_value.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'property.value' must be a string") + Catch::Matchers::Equals("(profile) 'property.value' must be a string") ); } @@ -1184,7 +1186,7 @@ TEST_CASE("(Error) Keybinding: Missing value 'key'", "[profile]") { "${TESTDIR}/profile/error/keybinding/missing_key.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'keybinding.key' field is missing") + Catch::Matchers::Equals("(profile) 'keybinding.key' field is missing") ); } @@ -1193,7 +1195,7 @@ TEST_CASE("(Error) Keybinding: Missing value 'documentation'", "[profile]") { "${TESTDIR}/profile/error/keybinding/missing_documentation.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'keybinding.documentation' field is missing") + Catch::Matchers::Equals("(profile) 'keybinding.documentation' field is missing") ); } @@ -1202,7 +1204,7 @@ TEST_CASE("(Error) Keybinding: Missing value 'name'", "[profile]") { "${TESTDIR}/profile/error/keybinding/missing_name.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'keybinding.name' field is missing") + Catch::Matchers::Equals("(profile) 'keybinding.name' field is missing") ); } @@ -1211,7 +1213,7 @@ TEST_CASE("(Error) Keybinding: Missing value 'gui_path'", "[profile]") { "${TESTDIR}/profile/error/keybinding/missing_guipath.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'keybinding.gui_path' field is missing") + Catch::Matchers::Equals("(profile) 'keybinding.gui_path' field is missing") ); } @@ -1220,7 +1222,7 @@ TEST_CASE("(Error) Keybinding: Missing value 'is_local'", "[profile]") { "${TESTDIR}/profile/error/keybinding/missing_islocal.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'keybinding.is_local' field is missing") + Catch::Matchers::Equals("(profile) 'keybinding.is_local' field is missing") ); } @@ -1229,7 +1231,7 @@ TEST_CASE("(Error) Keybinding: Wrong value 'key'", "[profile]") { "${TESTDIR}/profile/error/keybinding/wrongvalue_key.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("Could not find key for 'F50'") + Catch::Matchers::Equals("Could not find key for 'F50'") ); } @@ -1238,7 +1240,7 @@ TEST_CASE("(Error) Keybinding: Wrong value 'key, modifier'", "[profile]") { "${TESTDIR}/profile/error/keybinding/wrongvalue_modifier.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("Unknown modifier key 'KEYKEY'") + Catch::Matchers::Equals("Unknown modifier key 'KEYKEY'") ); } @@ -1247,7 +1249,7 @@ TEST_CASE("(Error) Keybinding: Wrong type 'documentation'", "[profile]") { "${TESTDIR}/profile/error/keybinding/wrongtype_documentation.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'keybinding.documentation' must be a string") + Catch::Matchers::Equals("(profile) 'keybinding.documentation' must be a string") ); } @@ -1256,7 +1258,7 @@ TEST_CASE("(Error) Keybinding: Wrong type 'gui_path'", "[profile]") { "${TESTDIR}/profile/error/keybinding/wrongtype_guipath.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'keybinding.gui_path' must be a string") + Catch::Matchers::Equals("(profile) 'keybinding.gui_path' must be a string") ); } @@ -1265,7 +1267,7 @@ TEST_CASE("(Error) Keybinding: Wrong type 'is_local'", "[profile]") { "${TESTDIR}/profile/error/keybinding/wrongtype_islocal.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'keybinding.is_local' must be a boolean") + Catch::Matchers::Equals("(profile) 'keybinding.is_local' must be a boolean") ); } @@ -1274,7 +1276,7 @@ TEST_CASE("(Error) Keybinding: Wrong type 'name'", "[profile]") { "${TESTDIR}/profile/error/keybinding/wrongtype_name.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'keybinding.name' must be a string") + Catch::Matchers::Equals("(profile) 'keybinding.name' must be a string") ); } @@ -1283,7 +1285,7 @@ TEST_CASE("(Error) Keybinding: Wrong type 'script'", "[profile]") { "${TESTDIR}/profile/error/keybinding/wrongtype_script.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'keybinding.script' must be a string") + Catch::Matchers::Equals("(profile) 'keybinding.script' must be a string") ); } @@ -1296,7 +1298,7 @@ TEST_CASE("(Error) Time: Wrong value 'type'", "[profile]") { "${TESTDIR}/profile/error/time/wrongvalue_type.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("Unknown time type") + Catch::Matchers::Equals("(profile) Unknown time type") ); } @@ -1305,7 +1307,7 @@ TEST_CASE("(Error) Time (absolute): Missing value 'type'", "[profile]") { "${TESTDIR}/profile/error/time/missing_type.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'time.type' field is missing") + Catch::Matchers::Equals("(profile) 'time.type' field is missing") ); } @@ -1314,7 +1316,7 @@ TEST_CASE("(Error) Time (relative): Missing value 'value'", "[profile]") { "${TESTDIR}/profile/error/time/relative_missing_value.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'time.value' field is missing") + Catch::Matchers::Equals("(profile) 'time.value' field is missing") ); } @@ -1326,7 +1328,7 @@ TEST_CASE("(Error) Deltatimes: Wrong type", "[profile]") { "${TESTDIR}/profile/error/deltatimes/wrongtype_value.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("type must be number, but is string") + Catch::Matchers::ContainsSubstring("type must be number, but is string") ); } @@ -1338,7 +1340,7 @@ TEST_CASE("(Error) Camera: Wrong value 'type'", "[profile]") { "${TESTDIR}/profile/error/camera/wrongvalue_type.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("Unknown camera type") + Catch::Matchers::Equals("(profile) Unknown camera type") ); } @@ -1347,7 +1349,7 @@ TEST_CASE("(Error) Camera (NavState): Missing value 'anchor'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_missing_anchor.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.anchor' field is missing") + Catch::Matchers::Equals("(profile) 'camera.anchor' field is missing") ); } @@ -1356,7 +1358,7 @@ TEST_CASE("(Error) Camera (NavState): Missing value 'frame'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_missing_frame.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.frame' field is missing") + Catch::Matchers::Equals("(profile) 'camera.frame' field is missing") ); } @@ -1365,7 +1367,7 @@ TEST_CASE("(Error) Camera (NavState): Missing value 'position'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_missing_position.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.position' field is missing") + Catch::Matchers::Equals("(profile) 'camera.position' field is missing") ); } @@ -1374,7 +1376,7 @@ TEST_CASE("(Error) Camera (NavState): Wrong type 'anchor'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_wrongtype_anchor.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.anchor' must be a string") + Catch::Matchers::Equals("(profile) 'camera.anchor' must be a string") ); } @@ -1383,7 +1385,7 @@ TEST_CASE("(Error) Camera (NavState): Wrong type 'aim'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_wrongtype_aim.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.aim' must be a string") + Catch::Matchers::Equals("(profile) 'camera.aim' must be a string") ); } @@ -1392,7 +1394,7 @@ TEST_CASE("(Error) Camera (NavState): Wrong type 'frame'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_wrongtype_frame.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.frame' must be a string") + Catch::Matchers::Equals("(profile) 'camera.frame' must be a string") ); } @@ -1401,7 +1403,7 @@ TEST_CASE("(Error) Camera (NavState): Wrong type 'position'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_wrongtype_position.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.position' must be an object") + Catch::Matchers::Equals("(profile) 'camera.position' must be an object") ); } @@ -1410,7 +1412,7 @@ TEST_CASE("(Error) Camera (NavState): Missing value 'position.x'", "[profile]") "${TESTDIR}/profile/error/camera/navstate_missing_position_x.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.position.x' field is missing") + Catch::Matchers::Equals("(profile) 'camera.position.x' field is missing") ); } @@ -1419,7 +1421,7 @@ TEST_CASE("(Error) Camera (NavState): Wrong type 'position.x'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_wrongtype_position_x.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.position.x' must be a number") + Catch::Matchers::Equals("(profile) 'camera.position.x' must be a number") ); } @@ -1428,7 +1430,7 @@ TEST_CASE("(Error) Camera (NavState): Missing value 'position.y'", "[profile]") "${TESTDIR}/profile/error/camera/navstate_missing_position_y.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.position.y' field is missing") + Catch::Matchers::Equals("(profile) 'camera.position.y' field is missing") ); } @@ -1437,7 +1439,7 @@ TEST_CASE("(Error) Camera (NavState): Wrong type 'position.y'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_wrongtype_position_y.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.position.y' must be a number") + Catch::Matchers::Equals("(profile) 'camera.position.y' must be a number") ); } @@ -1446,7 +1448,7 @@ TEST_CASE("(Error) Camera (NavState): Missing value 'position.z'", "[profile]") "${TESTDIR}/profile/error/camera/navstate_missing_position_z.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.position.z' field is missing") + Catch::Matchers::Equals("(profile) 'camera.position.z' field is missing") ); } @@ -1455,7 +1457,7 @@ TEST_CASE("(Error) Camera (NavState): Wrong type 'position.z'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_wrongtype_position_z.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.position.z' must be a number") + Catch::Matchers::Equals("(profile) 'camera.position.z' must be a number") ); } @@ -1464,7 +1466,7 @@ TEST_CASE("(Error) Camera (NavState): Wrong type 'up'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_wrongtype_up.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.up' must be an object") + Catch::Matchers::Equals("(profile) 'camera.up' must be an object") ); } @@ -1473,7 +1475,7 @@ TEST_CASE("(Error) Camera (NavState): Missing value 'up.x'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_missing_up_x.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.up.x' field is missing") + Catch::Matchers::Equals("(profile) 'camera.up.x' field is missing") ); } @@ -1482,7 +1484,7 @@ TEST_CASE("(Error) Camera (NavState): Wrong type 'up.x'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_wrongtype_up_x.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.up.x' must be a number") + Catch::Matchers::Equals("(profile) 'camera.up.x' must be a number") ); } @@ -1491,7 +1493,7 @@ TEST_CASE("(Error) Camera (NavState): Missing value 'up.y'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_missing_up_y.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.up.y' field is missing") + Catch::Matchers::Equals("(profile) 'camera.up.y' field is missing") ); } @@ -1500,7 +1502,7 @@ TEST_CASE("(Error) Camera (NavState): Wrong type 'up.y'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_wrongtype_up_y.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.up.y' must be a number") + Catch::Matchers::Equals("(profile) 'camera.up.y' must be a number") ); } @@ -1509,7 +1511,7 @@ TEST_CASE("(Error) Camera (NavState): Missing value 'up.z'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_missing_up_z.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.up.z' field is missing") + Catch::Matchers::Equals("(profile) 'camera.up.z' field is missing") ); } @@ -1518,7 +1520,7 @@ TEST_CASE("(Error) Camera (NavState): Wrong type 'up.z'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_wrongtype_up_z.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.up.z' must be a number") + Catch::Matchers::Equals("(profile) 'camera.up.z' must be a number") ); } @@ -1527,7 +1529,7 @@ TEST_CASE("(Error) Camera (NavState): Wrong type 'yaw'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_wrongtype_yaw.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.yaw' must be a number") + Catch::Matchers::Equals("(profile) 'camera.yaw' must be a number") ); } @@ -1536,7 +1538,7 @@ TEST_CASE("(Error) Camera (NavState): Wrong type 'pitch'", "[profile]") { "${TESTDIR}/profile/error/camera/navstate_wrongtype_pitch.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("camera.pitch' must be a number") + Catch::Matchers::Equals("(profile) 'camera.pitch' must be a number") ); } @@ -1545,7 +1547,7 @@ TEST_CASE("(Error) Camera (GoToGeo): Missing value 'anchor'", "[profile]") { "${TESTDIR}/profile/error/camera/gotogeo_missing_anchor.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.anchor' field is missing") + Catch::Matchers::Equals("(profile) 'camera.anchor' field is missing") ); } @@ -1554,7 +1556,7 @@ TEST_CASE("(Error) Camera (GoToGeo): Missing value 'latitude'", "[profile]") { "${TESTDIR}/profile/error/camera/gotogeo_missing_latitude.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.latitude' field is missing") + Catch::Matchers::Equals("(profile) 'camera.latitude' field is missing") ); } @@ -1563,7 +1565,7 @@ TEST_CASE("(Error) Camera (GoToGeo): Missing value 'longitude'", "[profile]") { "${TESTDIR}/profile/error/camera/gotogeo_missing_longitude.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.longitude' field is missing") + Catch::Matchers::Equals("(profile) 'camera.longitude' field is missing") ); } @@ -1572,7 +1574,7 @@ TEST_CASE("(Error) Camera (GoToGeo): Wrong type 'anchor'", "[profile]") { "${TESTDIR}/profile/error/camera/gotogeo_wrongtype_anchor.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.anchor' must be a string") + Catch::Matchers::Equals("(profile) 'camera.anchor' must be a string") ); } @@ -1581,7 +1583,7 @@ TEST_CASE("(Error) Camera (GoToGeo): Wrong type 'latitude'", "[profile]") { "${TESTDIR}/profile/error/camera/gotogeo_wrongtype_latitude.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.latitude' must be a number") + Catch::Matchers::Equals("(profile) 'camera.latitude' must be a number") ); } @@ -1590,7 +1592,7 @@ TEST_CASE("(Error) Camera (GoToGeo): Wrong type 'longitude'", "[profile]") { "${TESTDIR}/profile/error/camera/gotogeo_wrongtype_longitude.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.longitude' must be a number") + Catch::Matchers::Equals("(profile) 'camera.longitude' must be a number") ); } @@ -1599,6 +1601,6 @@ TEST_CASE("(Error) Camera (GoToGeo): Wrong type 'altitude'", "[profile]") { "${TESTDIR}/profile/error/camera/gotogeo_wrongtype_altitude.profile"; CHECK_THROWS_WITH( loadProfile(absPath(TestFile)), - Catch::Matchers::Contains("'camera.altitude' must be a number") + Catch::Matchers::Equals("(profile) 'camera.altitude' must be a number") ); } diff --git a/tests/test_rawvolumeio.cpp b/tests/test_rawvolumeio.cpp index e3134f780b..7f390c52a2 100644 --- a/tests/test_rawvolumeio.cpp +++ b/tests/test_rawvolumeio.cpp @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include #include #include diff --git a/tests/test_scriptscheduler.cpp b/tests/test_scriptscheduler.cpp index f5f17146c9..2dbcac374a 100644 --- a/tests/test_scriptscheduler.cpp +++ b/tests/test_scriptscheduler.cpp @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include #include #include diff --git a/tests/test_spicemanager.cpp b/tests/test_spicemanager.cpp index 180d1da253..debf12a936 100644 --- a/tests/test_spicemanager.cpp +++ b/tests/test_spicemanager.cpp @@ -22,7 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include +#include #include #include @@ -238,7 +239,7 @@ TEST_CASE("SpiceManager: Get Value From ID 1D", "[spicemanager]") { std::string target = "EARTH"; std::string value1D = "MAG_NORTH_POLE_LAT"; - double return1D; + double return1D = 0.0; CHECK_NOTHROW(openspace::SpiceManager::ref().getValue(target, value1D, return1D)); CHECK(return1D == 78.565); @@ -290,8 +291,8 @@ TEST_CASE("SpiceManager: String To Ephemeris Time", "[spicemanager]") { loadLSKKernel(); - double ephemerisTime; - double control_ephemerisTime; + double ephemerisTime = -1.0; + double control_ephemerisTime = 0.0; char date[SRCLEN] = "Thu Mar 20 12:53:29 PST 1997"; str2et_c(date, &control_ephemerisTime); @@ -332,9 +333,9 @@ TEST_CASE("SpiceManager: Get Target Position", "[spicemanager]") { ); }() ); - CHECK(pos[0] == Approx(targetPosition[0])); - CHECK(pos[1] == Approx(targetPosition[1])); - CHECK(pos[2] == Approx(targetPosition[2])); + CHECK(pos[0] == Catch::Approx(targetPosition[0])); + CHECK(pos[1] == Catch::Approx(targetPosition[1])); + CHECK(pos[2] == Catch::Approx(targetPosition[2])); openspace::SpiceManager::deinitialize(); } @@ -365,8 +366,8 @@ TEST_CASE("SpiceManager: Get Target State", "[spicemanager]") { // x,y,z for (int i = 0; i < 3; i++){ - CHECK(state[i] == Approx(res.position[i])); - CHECK(state[i+3] == Approx(res.velocity[i])); + CHECK(state[i] == Catch::Approx(res.position[i])); + CHECK(state[i+3] == Catch::Approx(res.velocity[i])); } openspace::SpiceManager::deinitialize(); @@ -395,7 +396,7 @@ TEST_CASE("SpiceManager: Transform matrix", "[spicemanager]") { // check for matrix consistency for (int i = 0; i < 6; i++) { for (int j = 0; j < 6; j++) { - CHECK(referenceMatrix[i][j] == Approx(stateMatrix[i * 6 + j])); + CHECK(referenceMatrix[i][j] == Catch::Approx(stateMatrix[i * 6 + j])); } } @@ -429,7 +430,7 @@ TEST_CASE("SpiceManager: Get Position Transform Matrix", "[spicemanager]") { // check for matrix consistency for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { - CHECK(referenceMatrix[i][j] == Approx(positionMatrix[j][i])); + CHECK(referenceMatrix[i][j] == Catch::Approx(positionMatrix[j][i])); } } @@ -453,7 +454,7 @@ TEST_CASE("SpiceManager: Get Position Transform Matrix", "[spicemanager]") { position = positionMatrix * position; // check transformed values match for (int i = 0; i < 3; i++) { - CHECK(position[i] == Approx(state_t[i])); + CHECK(position[i] == Catch::Approx(state_t[i])); } openspace::SpiceManager::deinitialize(); @@ -489,7 +490,7 @@ TEST_CASE("SpiceManager: Get Field Of View", "[spicemanager]") { for (size_t i = 0; i < res.bounds.size(); i++) { for (size_t j = 0; j < 3; j++) { CHECK( - bounds_ref[i][j] == Approx(res.bounds[i][static_cast(j)]) + bounds_ref[i][j] == Catch::Approx(res.bounds[i][static_cast(j)]) ); } } diff --git a/tests/test_timeconversion.cpp b/tests/test_timeconversion.cpp index b892c1926c..9931326327 100644 --- a/tests/test_timeconversion.cpp +++ b/tests/test_timeconversion.cpp @@ -22,7 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include +#include #include @@ -134,92 +135,92 @@ TEST_CASE("TimeConversion: Simplify Time Round", "[timeconversion]") { TEST_CASE("TimeConversion: Simplify Time Fractional", "[timeconversion]") { { std::pair p = simplifyTime(32e-10, false); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "nanoseconds"); } { std::pair p = simplifyTime(32e-10, true); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "nanosecond"); } { std::pair p = simplifyTime(32e-7, false); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "microseconds"); } { std::pair p = simplifyTime(32e-7, true); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "microsecond"); } { std::pair p = simplifyTime(32e-4, false); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "milliseconds"); } { std::pair p = simplifyTime(32e-4, true); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "millisecond"); } { std::pair p = simplifyTime(3.2, false); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "seconds"); } { std::pair p = simplifyTime(3.2, true); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "second"); } { std::pair p = simplifyTime(192.0, false); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "minutes"); } { std::pair p = simplifyTime(192.0, true); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "minute"); } { std::pair p = simplifyTime(11520.0, false); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "hours"); } { std::pair p = simplifyTime(11520.0, true); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "hour"); } { std::pair p = simplifyTime(276480.0, false); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "days"); } { std::pair p = simplifyTime(276480.0, true); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "day"); } { std::pair p = simplifyTime(8415187.2, false); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "months"); } { std::pair p = simplifyTime(8415187.2, true); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "month"); } { std::pair p = simplifyTime(100982246.4, false); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "years"); } { std::pair p = simplifyTime(100982246.4, true); - CHECK(Approx(p.first) == 3.2); + CHECK(Catch::Approx(p.first) == 3.2); CHECK(p.second == "year"); } } @@ -351,37 +352,37 @@ TEST_CASE("TimeConversion: Split Time Fractional", "[timeconversion]") { { std::vector> p = splitTime(32e-10, false); REQUIRE(p.size() == 1); - CHECK(Approx(p[0].first) == 3.2); + CHECK(Catch::Approx(p[0].first) == 3.2); CHECK(p[0].second == "nanoseconds"); } { std::vector> p = splitTime(32e-10, true); REQUIRE(p.size() == 1); - CHECK(Approx(p[0].first) == 3.2); + CHECK(Catch::Approx(p[0].first) == 3.2); CHECK(p[0].second == "nanosecond"); } { std::vector> p = splitTime(32e-7, false); REQUIRE(p.size() == 2); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "microseconds"); - CHECK(Approx(p[1].first) == 200.0); + CHECK(Catch::Approx(p[1].first) == 200.0); CHECK(p[1].second == "nanoseconds"); } { std::vector> p = splitTime(32e-7, true); REQUIRE(p.size() == 2); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "microsecond"); - CHECK(Approx(p[1].first) == 200.0); + CHECK(Catch::Approx(p[1].first) == 200.0); CHECK(p[1].second == "nanosecond"); } { std::vector> p = splitTime(32e-4, false); REQUIRE(p.size() == 3); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "milliseconds"); - CHECK(Approx(p[1].first) == 200.0); + CHECK(Catch::Approx(p[1].first) == 200.0); CHECK(p[1].second == "microseconds"); // This is some floating point inaccuracy CHECK(p[2].first < 1e-3); @@ -390,9 +391,9 @@ TEST_CASE("TimeConversion: Split Time Fractional", "[timeconversion]") { { std::vector> p = splitTime(32e-4, true); REQUIRE(p.size() == 3); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "millisecond"); - CHECK(Approx(p[1].first) == 200.0); + CHECK(Catch::Approx(p[1].first) == 200.0); CHECK(p[1].second == "microsecond"); // This is some floating point inaccuracy CHECK(p[2].first < 1e-3); @@ -401,9 +402,9 @@ TEST_CASE("TimeConversion: Split Time Fractional", "[timeconversion]") { { std::vector> p = splitTime(3.2, false); REQUIRE(p.size() == 3); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "seconds"); - CHECK(Approx(p[1].first) == 200.0); + CHECK(Catch::Approx(p[1].first) == 200.0); CHECK(p[1].second == "milliseconds"); // This is some floating point inaccuracy CHECK(p[2].first < 1e-3); @@ -412,9 +413,9 @@ TEST_CASE("TimeConversion: Split Time Fractional", "[timeconversion]") { { std::vector> p = splitTime(3.2, true); REQUIRE(p.size() == 3); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "second"); - CHECK(Approx(p[1].first) == 200.0); + CHECK(Catch::Approx(p[1].first) == 200.0); CHECK(p[1].second == "millisecond"); // This is some floating point inaccuracy CHECK(p[2].first < 1e-3); @@ -423,145 +424,145 @@ TEST_CASE("TimeConversion: Split Time Fractional", "[timeconversion]") { { std::vector> p = splitTime(192.0, false); REQUIRE(p.size() == 2); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "minutes"); - CHECK(Approx(p[1].first) == 12.0); + CHECK(Catch::Approx(p[1].first) == 12.0); CHECK(p[1].second == "seconds"); } { std::vector> p = splitTime(192.0, true); REQUIRE(p.size() == 2); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "minute"); - CHECK(Approx(p[1].first) == 12.0); + CHECK(Catch::Approx(p[1].first) == 12.0); CHECK(p[1].second == "second"); } { std::vector> p = splitTime(11520.0, false); REQUIRE(p.size() == 2); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "hours"); - CHECK(Approx(p[1].first) == 12.0); + CHECK(Catch::Approx(p[1].first) == 12.0); CHECK(p[1].second == "minutes"); } { std::vector> p = splitTime(11520.0, true); REQUIRE(p.size() == 2); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "hour"); - CHECK(Approx(p[1].first) == 12.0); + CHECK(Catch::Approx(p[1].first) == 12.0); CHECK(p[1].second == "minute"); } { std::vector> p = splitTime(276480.0, false); REQUIRE(p.size() == 3); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "days"); - CHECK(Approx(p[1].first) == 4); + CHECK(Catch::Approx(p[1].first) == 4); CHECK(p[1].second == "hours"); - CHECK(Approx(p[2].first) == 48); + CHECK(Catch::Approx(p[2].first) == 48); CHECK(p[2].second == "minutes"); } { std::vector> p = splitTime(276480.0, true); REQUIRE(p.size() == 3); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "day"); - CHECK(Approx(p[1].first) == 4); + CHECK(Catch::Approx(p[1].first) == 4); CHECK(p[1].second == "hour"); - CHECK(Approx(p[2].first) == 48); + CHECK(Catch::Approx(p[2].first) == 48); CHECK(p[2].second == "minute"); } { std::vector> p = splitTime(8414838.0, false); REQUIRE(p.size() == 3); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "months"); - CHECK(Approx(p[1].first) == 6.0); + CHECK(Catch::Approx(p[1].first) == 6.0); CHECK(p[1].second == "days"); - CHECK(Approx(p[2].first) == 2.0); + CHECK(Catch::Approx(p[2].first) == 2.0); CHECK(p[2].second == "hours"); } { std::vector> p = splitTime(8414838.0, true); REQUIRE(p.size() == 3); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "month"); - CHECK(Approx(p[1].first) == 6.0); + CHECK(Catch::Approx(p[1].first) == 6.0); CHECK(p[1].second == "day"); - CHECK(Approx(p[2].first) == 2.0); + CHECK(Catch::Approx(p[2].first) == 2.0); CHECK(p[2].second == "hour"); } { std::vector> p = splitTime(100981548.0, false); REQUIRE(p.size() == 4); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "years"); - CHECK(Approx(p[1].first) == 2.0); + CHECK(Catch::Approx(p[1].first) == 2.0); CHECK(p[1].second == "months"); - CHECK(Approx(p[2].first) == 12.0); + CHECK(Catch::Approx(p[2].first) == 12.0); CHECK(p[2].second == "days"); - CHECK(Approx(p[3].first) == 4.0); + CHECK(Catch::Approx(p[3].first) == 4.0); CHECK(p[3].second == "hours"); } { std::vector> p = splitTime(100981548.0, true); REQUIRE(p.size() == 4); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "year"); - CHECK(Approx(p[1].first) == 2.0); + CHECK(Catch::Approx(p[1].first) == 2.0); CHECK(p[1].second == "month"); - CHECK(Approx(p[2].first) == 12.0); + CHECK(Catch::Approx(p[2].first) == 12.0); CHECK(p[2].second == "day"); - CHECK(Approx(p[3].first) == 4.0); + CHECK(Catch::Approx(p[3].first) == 4.0); CHECK(p[3].second == "hour"); } { std::vector> p = splitTime(100981676.388, false); REQUIRE(p.size() == 9); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "years"); - CHECK(Approx(p[1].first) == 2.0); + CHECK(Catch::Approx(p[1].first) == 2.0); CHECK(p[1].second == "months"); - CHECK(Approx(p[2].first) == 12.0); + CHECK(Catch::Approx(p[2].first) == 12.0); CHECK(p[2].second == "days"); - CHECK(Approx(p[3].first) == 4.0); + CHECK(Catch::Approx(p[3].first) == 4.0); CHECK(p[3].second == "hours"); - CHECK(Approx(p[4].first) == 2.0); + CHECK(Catch::Approx(p[4].first) == 2.0); CHECK(p[4].second == "minutes"); - CHECK(Approx(p[5].first) == 8.0); + CHECK(Catch::Approx(p[5].first) == 8.0); CHECK(p[5].second == "seconds"); - CHECK(Approx(p[6].first) == 387.0); + CHECK(Catch::Approx(p[6].first) == 387.0); CHECK(p[6].second == "milliseconds"); - CHECK(Approx(p[7].first) == 999.0); + CHECK(Catch::Approx(p[7].first) == 999.0); CHECK(p[7].second == "microseconds"); - CHECK(Approx(p[8].first) == 996.54293059); + CHECK(Catch::Approx(p[8].first) == 996.54293059); CHECK(p[8].second == "nanoseconds"); } { std::vector> p = splitTime(100981676.388, true); REQUIRE(p.size() == 9); - CHECK(Approx(p[0].first) == 3.0); + CHECK(Catch::Approx(p[0].first) == 3.0); CHECK(p[0].second == "year"); - CHECK(Approx(p[1].first) == 2.0); + CHECK(Catch::Approx(p[1].first) == 2.0); CHECK(p[1].second == "month"); - CHECK(Approx(p[2].first) == 12.0); + CHECK(Catch::Approx(p[2].first) == 12.0); CHECK(p[2].second == "day"); - CHECK(Approx(p[3].first) == 4.0); + CHECK(Catch::Approx(p[3].first) == 4.0); CHECK(p[3].second == "hour"); - CHECK(Approx(p[4].first) == 2.0); + CHECK(Catch::Approx(p[4].first) == 2.0); CHECK(p[4].second == "minute"); - CHECK(Approx(p[5].first) == 8.0); + CHECK(Catch::Approx(p[5].first) == 8.0); CHECK(p[5].second == "second"); - CHECK(Approx(p[6].first) == 387.0); + CHECK(Catch::Approx(p[6].first) == 387.0); CHECK(p[6].second == "millisecond"); - CHECK(Approx(p[7].first) == 999.0); + CHECK(Catch::Approx(p[7].first) == 999.0); CHECK(p[7].second == "microsecond"); - CHECK(Approx(p[8].first) == 996.54293059); + CHECK(Catch::Approx(p[8].first) == 996.54293059); CHECK(p[8].second == "nanosecond"); } } diff --git a/tests/test_timeline.cpp b/tests/test_timeline.cpp index 492be167e4..5e770cae5d 100644 --- a/tests/test_timeline.cpp +++ b/tests/test_timeline.cpp @@ -22,7 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include +#include #include #include @@ -42,13 +43,13 @@ TEST_CASE("TimeLine: Query Keyframes", "[timeline]") { REQUIRE(timeline.nKeyframes() == 2); - CHECK(timeline.firstKeyframeAfter(0.0)->data == Approx(1.f)); - CHECK(timeline.firstKeyframeAfter(0.0, false)->data == Approx(1.f)); - CHECK(timeline.firstKeyframeAfter(0.0, true)->data == Approx(0.f)); + CHECK(timeline.firstKeyframeAfter(0.0)->data == Catch::Approx(1.f)); + CHECK(timeline.firstKeyframeAfter(0.0, false)->data == Catch::Approx(1.f)); + CHECK(timeline.firstKeyframeAfter(0.0, true)->data == Catch::Approx(0.f)); - CHECK(timeline.lastKeyframeBefore(1.0)->data == Approx(0.f)); - CHECK(timeline.lastKeyframeBefore(1.0, false)->data == Approx(0.f)); - CHECK(timeline.lastKeyframeBefore(1.0, true)->data == Approx(1.f)); + CHECK(timeline.lastKeyframeBefore(1.0)->data == Catch::Approx(0.f)); + CHECK(timeline.lastKeyframeBefore(1.0, false)->data == Catch::Approx(0.f)); + CHECK(timeline.lastKeyframeBefore(1.0, true)->data == Catch::Approx(1.f)); } TEST_CASE("TimeLine: Remove Keyframes", "[timeline]") { diff --git a/tests/test_timequantizer.cpp b/tests/test_timequantizer.cpp index b4868e585f..2a83989100 100644 --- a/tests/test_timequantizer.cpp +++ b/tests/test_timequantizer.cpp @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "catch2/catch.hpp" +#include #include "modules/globebrowsing/src/timequantizer.h" #include diff --git a/tests/visual/apollo/11landing.ostest b/tests/visual/apollo/11landing.ostest index 6b4d8d9e99..5094ebb57d 100644 --- a/tests/visual/apollo/11landing.ostest +++ b/tests/visual/apollo/11landing.ostest @@ -1,8 +1,10 @@ [ { "type": "pause", "value": "true"}, - { "type": "keys", - "value": "F11"}, + { "type": "action", + "value": "profile.setup.apollo11"}, + { "type": "wait", + "value": "10"}, { "type": "time", "value": "1969-07-20T20:15:50.00"}, { "type": "navigationstate", diff --git a/tests/visual/apollo/11landingsite.ostest b/tests/visual/apollo/11landingsite.ostest index 8c0d09495c..4d74cd1470 100644 --- a/tests/visual/apollo/11landingsite.ostest +++ b/tests/visual/apollo/11landingsite.ostest @@ -1,8 +1,10 @@ [ { "type": "pause", "value": "true"}, - { "type": "keys", - "value": "F11"}, + { "type": "action", + "value": "profile.setup.apollo11"}, + { "type": "wait", + "value": "10"}, { "type": "navigationstate", "value": "{Anchor='Apollo11LemPosition',Pitch=-0.275871E-1,Position={-3.291966E2,7.262499E2,-7.671269E2},ReferenceFrame='Root',Up={-0.833341E0,-0.532887E0,-0.146881E0},Yaw=-0.141130E-3}"}, { "type": "wait", diff --git a/tests/visual/apollo/11orbits.ostest b/tests/visual/apollo/11orbits.ostest index d9467dc754..08e56740a6 100644 --- a/tests/visual/apollo/11orbits.ostest +++ b/tests/visual/apollo/11orbits.ostest @@ -1,8 +1,10 @@ [ { "type": "pause", "value": "true"}, - { "type": "keys", - "value": "F11"}, + { "type": "action", + "value": "profile.setup.apollo11"}, + { "type": "wait", + "value": "10"}, { "type": "navigationstate", "value": "{Anchor='Apollo11LemPosition',Pitch=0.776040E-2,Position={-7.113493E5,2.688364E6,5.393341E5},ReferenceFrame='Root',Up={-0.382741E0,0.833124E-1,-0.920091E0},Yaw=0.288877E-2}"}, { "type": "wait", diff --git a/tests/visual/apollo/17landingsite.ostest b/tests/visual/apollo/17landingsite.ostest index 7f8b07213a..b6370de010 100644 --- a/tests/visual/apollo/17landingsite.ostest +++ b/tests/visual/apollo/17landingsite.ostest @@ -1,8 +1,8 @@ [ { "type": "pause", "value": "true"}, - { "type": "keys", - "value": "F7"}, + { "type": "action", + "value": "profile.setup.apollo17"}, { "type": "navigationstate", "value": "{Anchor='Moon',Pitch=0.191313E0,Position={1.403983E6,8.358961E5,6.005625E5},Up={-0.316846E0,-0.141630E0,0.937843E0},Yaw=-0.143901E0}"}, { "type": "wait", diff --git a/tests/visual/apollo/preearthrise.ostest b/tests/visual/apollo/preearthrise.ostest index 48acd5fff4..201cfc444d 100644 --- a/tests/visual/apollo/preearthrise.ostest +++ b/tests/visual/apollo/preearthrise.ostest @@ -1,8 +1,8 @@ [ { "type": "pause", "value": "true"}, - { "type": "keys", - "value": "e"}, + { "type": "action", + "value": "profile.setup.earthrise"}, { "type": "wait", "value": "60"}, { "type": "screenshot", diff --git a/tests/visual/default/DefaultSolarSystem.ostest b/tests/visual/default/DefaultSolarSystem.ostest index 8607fd5d16..6b187524ef 100644 --- a/tests/visual/default/DefaultSolarSystem.ostest +++ b/tests/visual/default/DefaultSolarSystem.ostest @@ -2,7 +2,7 @@ { "type": "time", "value": "2019-01-01T00:00:00.00"}, { "type": "recording", - "value": "RecordingDefaultSolarSystem"}, + "value": "RecordingDefaultSolarSystem.osrec"}, { "type": "wait", "value": "2"}, { "type": "screenshot", diff --git a/tests/visual/default/MarsHiRISE.ostest b/tests/visual/default/MarsHiRISE.ostest index fefb5f4042..4a3571bbdd 100644 --- a/tests/visual/default/MarsHiRISE.ostest +++ b/tests/visual/default/MarsHiRISE.ostest @@ -3,8 +3,8 @@ "value": "true"}, { "type": "time", "value": "2019-01-01T05:00:00.00"}, - { "type": "keys", - "value": "h"}, + { "type": "action", + "value": "os.fade_down_trails"}, { "type": "navigationstate", "value": "{Anchor='Mars',Pitch=1.327145E0,Position={7.622104E5,-3.288462E6,-3.857782E5},Up={-0.485709E-1,-0.127474E0,0.990652E0},Yaw=0.224817E-1}"}, { "type": "script", diff --git a/tests/visual/mars/insightlanded.ostest b/tests/visual/mars/insightlanded.ostest index 15242f44a0..8304167fd8 100644 --- a/tests/visual/mars/insightlanded.ostest +++ b/tests/visual/mars/insightlanded.ostest @@ -5,8 +5,8 @@ "value": "2018-11-26T19:46:00.00"}, { "type": "navigationstate", "value": "{Anchor='Insight',Pitch=-0.100135E0,Position={9.763474E0,-1.377502E0,1.668823E0},ReferenceFrame='Root',Up={-0.910753E-1,0.437979E0,0.894360E0},Yaw=0.939157E-1}"}, - { "type": "keys", - "value": "h"}, + { "type": "action", + "value": "os.fade_down_trails"}, { "type": "script", "value": "openspace.setPropertyValueSingle('Scene.InsightTrail.Renderable.Enabled', false)"}, { "type": "wait", diff --git a/tests/visual/mars/insightparachute.ostest b/tests/visual/mars/insightparachute.ostest index 1f9b5158d2..ba0c4c739e 100644 --- a/tests/visual/mars/insightparachute.ostest +++ b/tests/visual/mars/insightparachute.ostest @@ -5,8 +5,8 @@ "value": "2018-11-26T19:44:00.00"}, { "type": "navigationstate", "value": "{Anchor='Insight',Pitch=-0.101682E0,Position={-4.087723E0,-4.039124E0,-8.183899E0},ReferenceFrame='Root',Up={0.827895E0,0.213243E0,-0.518765E0},Yaw=-0.398734E0}"}, - { "type": "keys", - "value": "h"}, + { "type": "action", + "value": "os.fade_down_trails"}, { "type": "script", "value": "openspace.setPropertyValueSingle('Scene.InsightTrail.Renderable.Enabled', false)"}, { "type": "wait", diff --git a/tests/visual/newhorizons/RecordingNewHorizionsModel.osrecording b/tests/visual/newhorizons/RecordingNewHorizionsModel.osrec similarity index 100% rename from tests/visual/newhorizons/RecordingNewHorizionsModel.osrecording rename to tests/visual/newhorizons/RecordingNewHorizionsModel.osrec diff --git a/tests/visual/osirisrex/osirisrexmodel.ostest b/tests/visual/osirisrex/osirisrexmodel.ostest index 76ed110161..af5045d3d2 100644 --- a/tests/visual/osirisrex/osirisrexmodel.ostest +++ b/tests/visual/osirisrex/osirisrexmodel.ostest @@ -5,8 +5,8 @@ "value": "2018-10-30T23:00:00.00"}, { "type": "navigationstate", "value": "{Anchor='OsirisRex',Pitch=-0.274542E-5,Position={-3.894924E0,-9.051193E0,5.720444E0},ReferenceFrame='Root',Up={-0.911098E0,0.149229E0,-0.384228E0},Yaw=0.270290E-4}"}, - { "type": "keys", - "value": "h"}, + { "type": "action", + "value": "os.fade_down_trails"}, { "type": "script", "value": "openspace.setPropertyValueSingle('Scene.OsirisRexTrailBennu.Renderable.Enabled', false)"}, { "type": "wait", diff --git a/tests/visual/osirisrex/osirisrexprojection.ostest b/tests/visual/osirisrex/osirisrexprojection.ostest index 3357a7d3fd..eadb2ab557 100644 --- a/tests/visual/osirisrex/osirisrexprojection.ostest +++ b/tests/visual/osirisrex/osirisrexprojection.ostest @@ -5,8 +5,8 @@ "value": "2019-01-13T19:18:20.00"}, { "type": "navigationstate", "value": "{Anchor='BennuBarycenter',Pitch=-0.249726E-1,Position={6.343195E2,-7.381825E1,-2.105395E2},ReferenceFrame='Root',Up={0.260217E0,-0.340701E0,0.903444E0},Yaw=0.593456E-1}"}, - { "type": "keys", - "value": "h"}, + { "type": "action", + "value": "os.fade_down_trails"}, { "type": "script", "value": "openspace.setPropertyValueSingle('Scene.POLYCAM FOV.Renderable.Enabled', false)"}, { "type": "script", diff --git a/tests/visual/rosetta/rosettamodel.ostest b/tests/visual/rosetta/rosettamodel.ostest index 67614f5318..068bf45f24 100644 --- a/tests/visual/rosetta/rosettamodel.ostest +++ b/tests/visual/rosetta/rosettamodel.ostest @@ -5,8 +5,8 @@ "value": "2014-08-01T00:00:00.00"}, { "type": "navigationstate", "value": "{Anchor='Rosetta',Pitch=-0.741904E-1,Position={-1.384875E1,-5.509888E0,1.692047E0},ReferenceFrame='Root',Up={0.377490E0,-0.812217E0,0.444752E0},Yaw=-0.388182E-1}"}, - { "type": "keys", - "value": "h"}, + { "type": "action", + "value": "os.fade_down_trails"}, { "type": "script", "value": "openspace.setPropertyValueSingle('Scene.NAVCAM_FOV.Renderable.Enabled', false)"}, { "type": "wait", diff --git a/tests/visual/rosetta/rosettaprojection.ostest b/tests/visual/rosetta/rosettaprojection.ostest index 28552a6439..2b3549b119 100644 --- a/tests/visual/rosetta/rosettaprojection.ostest +++ b/tests/visual/rosetta/rosettaprojection.ostest @@ -5,8 +5,8 @@ "value": "2014-08-06T23:07:00.00"}, { "type": "navigationstate", "value": "{Anchor='67P',Pitch=-0.608276E-2,Position={1.035920E3,1.090395E4,6.708170E3},Up={-0.972426E0,0.182052E0,-0.145753E0},Yaw=0.475854E-2}"}, - { "type": "keys", - "value": "h"}, + { "type": "action", + "value": "os.fade_down_trails"}, { "type": "script", "value": "openspace.setPropertyValueSingle('Scene.NAVCAM_FOV.Renderable.Enabled', false)"}, { "type": "pause", diff --git a/tests/visual/voyager/voyager1model.ostest b/tests/visual/voyager/voyager1model.ostest index 98bbbfb594..e5a5a9ce4b 100644 --- a/tests/visual/voyager/voyager1model.ostest +++ b/tests/visual/voyager/voyager1model.ostest @@ -5,10 +5,10 @@ "value": "1977-09-10T12:00:00.00"}, { "type": "navigationstate", "value": "{Anchor='Voyager_1',Pitch=0.289491E-1,Position={9.291557E0,3.604126E0,0.823166E0},ReferenceFrame='Root',Up={0.130390E0,-0.527836E0,0.839278E0},Yaw=-0.997966E-2}"}, - { "type": "keys", - "value": "h"}, + { "type": "action", + "value": "os.fade_down_trails"}, { "type": "script", - "value": "openspace.setPropertyValue('Scene.Voyager_*_Trail_*.Enabled',false);"}, + "value": "openspace.setPropertyValue('Scene.Voyager_1_Trail_*.Enabled',false);"}, { "type": "wait", "value": "2"}, { "type": "screenshot", diff --git a/tests/visual/voyager/voyagers2020.ostest b/tests/visual/voyager/voyagers2020.ostest index 609a178fa0..d25af3dfd9 100644 --- a/tests/visual/voyager/voyagers2020.ostest +++ b/tests/visual/voyager/voyagers2020.ostest @@ -5,8 +5,8 @@ "value": "2020-01-01T00:00:00.00"}, { "type": "navigationstate", "value": "{Anchor='Sun',Pitch=-0.296905E-2,Position={-5.701493E12,2.431929E13,-4.495678E13},ReferenceFrame='Root',Up={-0.117936E0,0.867082E0,0.484003E0},Yaw=-0.189846E-1}"}, - { "type": "keys", - "value": "h"}, + { "type": "action", + "value": "os.fade_down_trails"}, { "type": "wait", "value": "2"}, { "type": "screenshot",