diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a629217..5dec843b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,28 @@ If a copy of the MPL was not distributed with this file, You can obtain one at h --> +## [1.8.0] Free Tagging System, Lua Logging, Linkable Struct Uniforms, Misc Bugfixes +* **File version number has changed. Files saved with RaCo 1.8.0 cannot be opened by previous versions.** + +### Added +* Introduced free tagging system by adding a `userTags` property to all object types. + * The user tags are independent of the normal `tags` property controlling the render setup. + * They can be accessed in the Python API using the new `getUserTags`/`setUserTags` functions analogous to the normal `setTags`/`getTags` functions. + * Added filtering by user tags to the tree views. +* A facility generating custom log messages from LuaScripts, LuaInterfaces, and LuaScriptModules using the `rl_logInfo`, `rl_logWarn`, and `rl_logError` functions has been added. + * Calling these functions will result in a log message being generated by the LogicEngine with the string argument of the function as message. + * The logging facility is enabled in normal operation in RamsesComposer but will be disabled during export. This may lead to export failing if the logging functions are called. +* Added full support for linkable struct uniforms. Instead of a flattened property structure for struct and array of struct uniforms the application now builds the same recursive property structure as for LuaScripts. This makes uniforms structs linkable as a whole. +* Added support for the lua saving mode in the export dialog and the Python API. The lua saving mode can be also specified using the '-s' command line option in the headless application. + +### Fixes +* "Save As with new ID" will now change all object IDs in the saved project. It is therefore possible to use objects from both the original and the copy as external references in the same project. The `save` function of the Python API had to remove the 'setNewID' flag and doesn't support "Save As with new ID" anymore. +* Fixed missing link validity update for links starting at external objects and ending on local objects when the set of properties of the starting object has changed in the external project. +* Fixed category names for BlitPass and RenderBufferMS types in the resource view. +* Fixed crash when moving multiple interlinked objects out of a Prefab. +* Fixed Ctrl+C shortcut to consistently copy the selection from the Python Runner and the Property Browser. Removed Copy and Paste commands from Main Menu, because they are now pane-specific. + + ## [1.7.0] External Textures * **File version number has changed. Files saved with RaCo 1.7.0 cannot be opened by previous versions.** diff --git a/CMakeLists.txt b/CMakeLists.txt index 8cbc313a..68bd89ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,7 @@ cmake_minimum_required(VERSION 3.19) SET(CMAKE_CONFIGURATION_TYPES "Debug;RelWithDebInfo") -project(RaCoOS VERSION 1.7.0) +project(RaCoOS VERSION 1.8.0) SET(RACO_RELEASE_DIRECTORY ${CMAKE_BINARY_DIR}/release) diff --git a/EditorApp/EditMenu.cpp b/EditorApp/EditMenu.cpp index e21fbe12..301d0604 100644 --- a/EditorApp/EditMenu.cpp +++ b/EditorApp/EditMenu.cpp @@ -9,15 +9,10 @@ */ #include "EditMenu.h" -#include "common_widgets/RaCoClipboard.h" #include "object_tree_view/ObjectTreeDock.h" #include "object_tree_view/ObjectTreeDockManager.h" -#include "object_tree_view/ObjectTreeView.h" -#include #include -#include -#include EditMenu::EditMenu(raco::application::RaCoApplication* racoApplication, raco::object_tree::view::ObjectTreeDockManager* objectTreeDockManager, QMenu* menu) : QObject{menu} { QObject::connect(menu, &QMenu::aboutToShow, this, [this, racoApplication, objectTreeDockManager, menu]() { @@ -39,32 +34,6 @@ EditMenu::EditMenu(raco::application::RaCoApplication* racoApplication, raco::ob redoAction->setEnabled(racoApplication->activeRaCoProject().undoStack()->canRedo()); undoAction->setEnabled(racoApplication->activeRaCoProject().undoStack()->canUndo()); }); - - menu->addSeparator(); - - auto* copyAction = menu->addAction("Copy"); - copyAction->setShortcut(QKeySequence::Copy); - auto* pasteAction = menu->addAction("Paste"); - pasteAction->setShortcut(QKeySequence::Paste); - auto activeObjectTreeDockWithSelection = objectTreeDockManager->getActiveDockWithSelection(); - if (!activeObjectTreeDockWithSelection) { - copyAction->setEnabled(false); - pasteAction->setEnabled(raco::RaCoClipboard::hasEditorObject()); - } else { - auto focusedTreeView = activeObjectTreeDockWithSelection->getActiveTreeView(); - auto selectedIndices = focusedTreeView->getSelectedIndices(); - auto pasteIndex = focusedTreeView->getSelectedInsertionTargetIndex(); - copyAction->setEnabled(focusedTreeView->canCopyAtIndices(selectedIndices)); - pasteAction->setEnabled(focusedTreeView->canPasteIntoIndex(pasteIndex, false) || focusedTreeView->canPasteIntoIndex({}, false)); - } - - QObject::connect(copyAction, &QAction::triggered, [racoApplication, objectTreeDockManager]() { - globalCopyCallback(racoApplication, objectTreeDockManager); - }); - - QObject::connect(pasteAction, &QAction::triggered, [racoApplication, objectTreeDockManager]() { - globalPasteCallback(racoApplication, objectTreeDockManager); - }); }); QObject::connect(menu, &QMenu::aboutToHide, this, [this, menu]() { while (menu->actions().size() > 0) { @@ -85,26 +54,3 @@ void EditMenu::globalRedoCallback(raco::application::RaCoApplication* racoApplic racoApplication->activeRaCoProject().undoStack()->redo(); } } - -void EditMenu::globalCopyCallback(raco::application::RaCoApplication* racoApplication, raco::object_tree::view::ObjectTreeDockManager* objectTreeDockManager) { - if (auto activeObjectTreeDockWithSelection = objectTreeDockManager->getActiveDockWithSelection()) { - auto focusedTreeView = activeObjectTreeDockWithSelection->getActiveTreeView(); - focusedTreeView->globalCopyCallback(); - } -} - -void EditMenu::globalPasteCallback(raco::application::RaCoApplication* racoApplication, raco::object_tree::view::ObjectTreeDockManager* objectTreeDockManager) { - if (auto activeObjectTreeDockWithSelection = objectTreeDockManager->getActiveDockWithSelection()) { - auto focusedTreeView = activeObjectTreeDockWithSelection->getActiveTreeView(); - - focusedTreeView->globalPasteCallback(focusedTreeView->getSelectedInsertionTargetIndex()); - } else { - auto copiedObjs = raco::RaCoClipboard::get(); - try { - racoApplication->activeRaCoProject().commandInterface()->pasteObjects(copiedObjs); - } - catch (std::exception& error) { - // Just ignore a failed paste - } - } -} diff --git a/EditorApp/EditMenu.h b/EditorApp/EditMenu.h index 2f6dd06f..e2931ba3 100644 --- a/EditorApp/EditMenu.h +++ b/EditorApp/EditMenu.h @@ -28,8 +28,6 @@ class EditMenu final : public QObject { static void globalUndoCallback(raco::application::RaCoApplication* racoApplication); static void globalRedoCallback(raco::application::RaCoApplication* racoApplication); - static void globalCopyCallback(raco::application::RaCoApplication* racoApplication, raco::object_tree::view::ObjectTreeDockManager* objectTreeDockManager); - static void globalPasteCallback(raco::application::RaCoApplication* racoApplication, raco::object_tree::view::ObjectTreeDockManager* objectTreeDockManager); private: raco::components::Subscription sub_; diff --git a/EditorApp/mainwindow.cpp b/EditorApp/mainwindow.cpp index 6d29838c..86054d7d 100644 --- a/EditorApp/mainwindow.cpp +++ b/EditorApp/mainwindow.cpp @@ -413,16 +413,6 @@ MainWindow::MainWindow(raco::application::RaCoApplication* racoApplication, raco EditMenu::globalRedoCallback(racoApplication_); }); - auto copyShortcut = new QShortcut(QKeySequence::Copy, this, nullptr, nullptr, Qt::ApplicationShortcut); - QObject::connect(copyShortcut, &QShortcut::activated, this, [this]() { - EditMenu::globalCopyCallback(racoApplication_, &treeDockManager_); - }); - - auto pasteShortcut = new QShortcut(QKeySequence::Paste, this, nullptr, nullptr, Qt::ApplicationShortcut); - QObject::connect(pasteShortcut, &QShortcut::activated, this, [this]() { - EditMenu::globalPasteCallback(racoApplication_, &treeDockManager_); - }); - ui->actionSave->setShortcut(QKeySequence::Save); ui->actionSave->setShortcutContext(Qt::ApplicationShortcut); QObject::connect(ui->actionSave, &QAction::triggered, this, &MainWindow::saveActiveProject); @@ -585,7 +575,7 @@ void MainWindow::restoreSettings() { } } -void MainWindow::openProject(const QString& file, int featureLevel) { +void MainWindow::openProject(const QString& file, int featureLevel, bool generateNewObjectIDs) { auto fileString = file.toStdString(); if (!fileString.empty() && (!raco::utils::u8path(fileString).exists() || !raco::utils::u8path(fileString).userHasReadAccess())) { QMessageBox::warning(this, "File Load Error", fmt::format("Project file {} is not available for loading.\n\nCheck whether the file at the specified path still exists and that you have read access to that file.", fileString).c_str(), QMessageBox::Close); @@ -637,7 +627,7 @@ void MainWindow::openProject(const QString& file, int featureLevel) { int loadFeatureLevel = featureLevel; while (true) { try { - racoApplication_->switchActiveRaCoProject(file, relinkCallback, true, loadFeatureLevel); + racoApplication_->switchActiveRaCoProject(file, relinkCallback, true, loadFeatureLevel, generateNewObjectIDs); break; } catch (const ExtrefError& error) { if (auto flError = racoApplication_->getFlError()) { @@ -751,14 +741,32 @@ bool MainWindow::saveAsActiveProject(bool newID) { } if (!newPath.endsWith(".rca")) newPath += ".rca"; std::string errorMsg; - if (racoApplication_->activeRaCoProject().saveAs(newPath, errorMsg, setProjectName, newID)) { - updateActiveProjectConnection(); - updateProjectSavedConnection(); - updateUpgradeMenu(); - return true; + if (newID) { + if (racoApplication_->activeRaCoProject().saveAs(newPath, errorMsg, setProjectName)) { + openProject(QString::fromStdString(racoApplication_->activeProjectPath()), -1, true); + if (racoApplication_->activeRaCoProject().save(errorMsg)) { + updateActiveProjectConnection(); + updateProjectSavedConnection(); + updateUpgradeMenu(); + return true; + } else { + updateApplicationTitle(); + QMessageBox::critical(this, "Save Error", fmt::format("Can not save project: Writing the project file '{}' failed with error '{}'", racoApplication_->activeProjectPath(), errorMsg).c_str(), QMessageBox::Ok); + } + } else { + updateApplicationTitle(); + QMessageBox::critical(this, "Save Error", fmt::format("Can not save project: Writing the project file '{}' failed with error '{}'", racoApplication_->activeProjectPath(), errorMsg).c_str(), QMessageBox::Ok); + } } else { - updateApplicationTitle(); - QMessageBox::critical(this, "Save Error", fmt::format("Can not save project: Writing the project file '{}' failed with error '{}'", racoApplication_->activeProjectPath(), errorMsg).c_str(), QMessageBox::Ok); + if (racoApplication_->activeRaCoProject().saveAs(newPath, errorMsg, setProjectName)) { + updateActiveProjectConnection(); + updateProjectSavedConnection(); + updateUpgradeMenu(); + return true; + } else { + updateApplicationTitle(); + QMessageBox::critical(this, "Save Error", fmt::format("Can not save project: Writing the project file '{}' failed with error '{}'", racoApplication_->activeProjectPath(), errorMsg).c_str(), QMessageBox::Ok); + } } } else { QMessageBox::warning(this, "Save Error", fmt::format("Can not save project: externally referenced projects not clean.").c_str(), QMessageBox::Ok); diff --git a/EditorApp/mainwindow.h b/EditorApp/mainwindow.h index f210fb11..8708ee64 100644 --- a/EditorApp/mainwindow.h +++ b/EditorApp/mainwindow.h @@ -83,7 +83,7 @@ public Q_SLOTS: void saveDockManagerCustomLayouts(); protected Q_SLOTS: - void openProject(const QString& file = {}, int featureLevel = -1); + void openProject(const QString& file = {}, int featureLevel = -1, bool generateNewObjectIDs = false); bool saveActiveProject(); bool upgradeActiveProject(int newFeatureLevel); bool saveAsActiveProject(bool newID = false); diff --git a/HeadlessApp/main.cpp b/HeadlessApp/main.cpp index f62a4c8c..b35eadbd 100644 --- a/HeadlessApp/main.cpp +++ b/HeadlessApp/main.cpp @@ -34,8 +34,8 @@ class Worker : public QObject { Q_OBJECT public: - Worker(QObject* parent, QString& projectFile, QString& exportPath, QString& pythonScriptPath, QStringList& pythonSearchPaths, bool compressExport, QStringList positionalArguments, int featureLevel) - : QObject(parent), projectFile_(projectFile), exportPath_(exportPath), pythonScriptPath_(pythonScriptPath), pythonSearchPaths_(pythonSearchPaths), compressExport_(compressExport), positionalArguments_(positionalArguments), featureLevel_(featureLevel) { + Worker(QObject* parent, QString& projectFile, QString& exportPath, QString& pythonScriptPath, QStringList& pythonSearchPaths, bool compressExport, QStringList positionalArguments, int featureLevel, raco::application::ELuaSavingMode luaSavingMode) + : QObject(parent), projectFile_(projectFile), exportPath_(exportPath), pythonScriptPath_(pythonScriptPath), pythonSearchPaths_(pythonSearchPaths), compressExport_(compressExport), positionalArguments_(positionalArguments), featureLevel_(featureLevel), luaSavingMode_(luaSavingMode) { } public Q_SLOTS: @@ -89,7 +89,7 @@ public Q_SLOTS: QString logicPath = exportPath_ + "." + raco::names::FILE_EXTENSION_LOGIC_EXPORT; std::string error; - if (!app->exportProject(ramsesPath.toStdString(), logicPath.toStdString(), compressExport_, error)) { + if (!app->exportProject(ramsesPath.toStdString(), logicPath.toStdString(), compressExport_, error, false, luaSavingMode_)) { LOG_ERROR(raco::log_system::COMMON, "error exporting to {}\n{}", ramsesPath.toStdString(), error.c_str()); exitCode_ = 1; } @@ -110,6 +110,7 @@ public Q_SLOTS: bool compressExport_; QStringList positionalArguments_; int featureLevel_; + raco::application::ELuaSavingMode luaSavingMode_; int exitCode_ = 0; }; @@ -196,6 +197,11 @@ int main(int argc, char* argv[]) { "Directory to add to python module search path.", "python-path" ); + QCommandLineOption luaSavingModeOption( + QStringList() << "s" + << "luasavingmode", + "Lua script saving mode. Possible options: source_code, byte_code, source_and_byte_code.", + "lua-saving-mode"); parser.addOption(loadProjectAction); parser.addOption(exportProjectAction); @@ -206,6 +212,7 @@ int main(int argc, char* argv[]) { parser.addOption(logFileOutputOption); parser.addOption(ramsesLogicFeatureLevel); parser.addOption(pythonPathOption); + parser.addOption(luaSavingModeOption); // application must be instantiated before parsing command line QCoreApplication a(argc, argv); @@ -303,7 +310,22 @@ int main(int argc, char* argv[]) { } } - Worker* task = new Worker(&a, projectFile, exportPath, pythonScriptPath, pythonSearchPaths, compressExport, parser.positionalArguments(), featureLevel); + auto luaSavingMode = raco::application::ELuaSavingMode::SourceCodeOnly; + if (parser.isSet(luaSavingModeOption)) { + auto option = parser.value(luaSavingModeOption); + if (option == "byte_code") { + luaSavingMode = raco::application::ELuaSavingMode::ByteCodeOnly; + } else if (option == "source_code") { + luaSavingMode = raco::application::ELuaSavingMode::SourceCodeOnly; + } else if (option == "source_and_byte_code") { + luaSavingMode = raco::application::ELuaSavingMode::SourceAndByteCode; + } else { + LOG_ERROR(raco::log_system::COMMON, fmt::format("Invalid lua saving mode: {}. Possible values are: source_code (default), byte_code, source_and_byte_code.", option.toStdString())); + exit(1); + } + } + + Worker* task = new Worker(&a, projectFile, exportPath, pythonScriptPath, pythonSearchPaths, compressExport, parser.positionalArguments(), featureLevel, luaSavingMode); QObject::connect(task, &Worker::finished, &QCoreApplication::exit); QTimer::singleShot(0, task, &Worker::run); diff --git a/HeadlessApp/tests/CMakeLists.txt b/HeadlessApp/tests/CMakeLists.txt index a3c41561..d77b1d88 100644 --- a/HeadlessApp/tests/CMakeLists.txt +++ b/HeadlessApp/tests/CMakeLists.txt @@ -38,3 +38,10 @@ add_racocommand_test(RaCoHeadless_load_multi_file_zip "${CMAKE_CURRENT_BINARY_DI set_tests_properties(RaCoHeadless_load_multi_file_zip PROPERTIES WILL_FAIL True) add_racocommand_test(RaCoHeadless_load_success "${CMAKE_CURRENT_BINARY_DIR}" "-p" "${CMAKE_SOURCE_DIR}/resources/example_scene.rca") + +add_racocommand_test(RaCoHeadless_export_lua_saving_mode_source_code_success "${CMAKE_CURRENT_BINARY_DIR}" "-p" "${CMAKE_SOURCE_DIR}/resources/example_scene.rca" "-e" "lua_saving_mode_source" "-s" "source_code") +add_racocommand_test(RaCoHeadless_export_lua_saving_mode_byte_code_fl2_success "${CMAKE_CURRENT_BINARY_DIR}" "-p" "${CMAKE_SOURCE_DIR}/resources/example_scene.rca" "-e" "lua_saving_mode_byte_fl2" "-s" "byte_code" "-f" "2") +add_racocommand_test(RaCoHeadless_export_lua_saving_mode_source_and_byte_code_fl2_success "${CMAKE_CURRENT_BINARY_DIR}" "-p" "${CMAKE_SOURCE_DIR}/resources/example_scene.rca" "-e" "lua_saving_mode_source_byte_fl2" "-s" "source_and_byte_code" "-f" "2") +add_racocommand_test(RaCoHeadless_export_lua_saving_mode_long_option "${CMAKE_CURRENT_BINARY_DIR}" "-p" "${CMAKE_SOURCE_DIR}/resources/example_scene.rca" "-e" "lua_saving_mode_long_option_source" "--luasavingmode" "source_code") +add_racocommand_test(RaCoHeadless_export_lua_saving_mode_fail "${CMAKE_CURRENT_BINARY_DIR}" "-p" "${CMAKE_SOURCE_DIR}/resources/example_scene.rca" "-e" "lua_saving_mode_fail" "-s" "invalid_setting") +set_tests_properties(RaCoHeadless_export_lua_saving_mode_fail PROPERTIES WILL_FAIL True) diff --git a/PyAPITests/pyt_general.py b/PyAPITests/pyt_general.py index ef782bf1..6fd89eb1 100644 --- a/PyAPITests/pyt_general.py +++ b/PyAPITests/pyt_general.py @@ -443,12 +443,12 @@ def test_prop_set_top_fail(self): def test_set_int_enum_fail(self): material = raco.create("Material", "my_mat") - self.assertEqual(material.options.cullmode.value(), 2) + self.assertEqual(material.options.cullmode.value(), raco.ECullMode.Back) material.options.cullmode = 1 - self.assertEqual(material.options.cullmode.value(), 1) + self.assertEqual(material.options.cullmode.value(), raco.ECullMode.Front) with self.assertRaises(RuntimeError): material.options.cullmode = 42 - self.assertEqual(material.options.cullmode.value(), 1) + self.assertEqual(material.options.cullmode.value(), raco.ECullMode.Front) def test_set_int_enum(self): material = raco.create("Material", "my_mat") @@ -1073,6 +1073,17 @@ def test_setRenderableTags(self): self.assertEqual(layer.renderableTags.red.value(), 1) self.assertEqual(layer.renderableTags.blue.value(), 3) + def test_setUserTags(self): + # Check type that also has 'tags' property + node = raco.create("Node", "node") + node.setUserTags(['foo', 'bar']) + self.assertEqual(node.getUserTags(), ['foo', 'bar']) + + # Check type that does not have 'tags' property, only 'userTags' + texture = raco.create("Texture", "texture") + texture.setUserTags(['foo', 'bar']) + self.assertEqual(texture.getUserTags(), ['foo', 'bar']) + def test_feature_level_3_render_order(self): lua = raco.create("LuaScript", "lua") lua.uri = self.cwd() + R"/../resources/scripts/types-scalar.lua" @@ -1141,3 +1152,51 @@ def test_add_external_references_multiple_times_same_types_should_work(self): raco.addExternalReferences(self.cwd() + R"/../resources/example_scene.rca", "Texture") second_result = raco.addExternalReferences(self.cwd() + R"/../resources/example_scene.rca", "Texture") self.assertEqual(0, len(second_result)) + + # Export with specified lua save mode, assert success and cleanup + def export(self, name, save_mode): + out_dir = self.cwd() + logic_file = os.path.join(out_dir, f'{name}.rlogic') + ramses_file = os.path.join(out_dir, f'{name}.ramses') + if os.path.exists(logic_file): + os.remove(logic_file) + try: + raco.export( + ramses_file, + logic_file, + False, + save_mode) + self.assertEqual(os.path.exists(logic_file), True) + except RuntimeError: + raise + finally: + if os.path.exists(logic_file): + os.remove(logic_file) + if os.path.exists(ramses_file): + os.remove(ramses_file) + + def test_feature_level_2_export_lua_save_mode(self): + # Add a lua script to project + lua = raco.create("LuaScript", "lua") + lua.uri = self.cwd() + R"/../resources/scripts/types-scalar.lua" + + # All available modes are supported starting from Feature Level 2 + self.export("lua_SourceCodeOnly", raco.ELuaSavingMode.SourceCodeOnly) + self.export("lua_ByteCodeOnly", raco.ELuaSavingMode.ByteCodeOnly) + self.export("lua_SourceAndByteCode", raco.ELuaSavingMode.SourceAndByteCode) + + def test_feature_level_1_export_lua_save_mode(self): + raco.reset(1) + + # Add a lua script to project + lua = raco.create("LuaScript", "lua") + lua.uri = self.cwd() + R"/../resources/scripts/types-scalar.lua" + + # In Feature Level 1 only Source Code lua saving mode is supported + self.export("lua_SourceCodeOnly_FL1", raco.ELuaSavingMode.SourceCodeOnly) + # Ramses Logic treats SourceAndByteCode as SourceCodeOnly and exports successfully + self.export("lua_SourceAndByteCode_FL1", raco.ELuaSavingMode.SourceAndByteCode) + + # Ramses Logic rejects ByteCodeOnly + with self.assertRaises(RuntimeError): + self.export("lua_ByteCodeOnly_FL1", raco.ELuaSavingMode.ByteCodeOnly) diff --git a/components/libApplication/include/application/RaCoApplication.h b/components/libApplication/include/application/RaCoApplication.h index 7d66cfcc..3e85d91e 100644 --- a/components/libApplication/include/application/RaCoApplication.h +++ b/components/libApplication/include/application/RaCoApplication.h @@ -50,6 +50,13 @@ struct RaCoApplicationLaunchSettings { bool runningInUI; }; +// Lua script saving mode. Wraps rlogic::ELuaSavingMode. +enum class ELuaSavingMode { + SourceCodeOnly = 0, + ByteCodeOnly, + SourceAndByteCode +}; + class RaCoApplication { public: explicit RaCoApplication(ramses_base::BaseEngineBackend& engine, const RaCoApplicationLaunchSettings& settings = {}); @@ -65,7 +72,19 @@ class RaCoApplication { // featureLevel // - new scene: setup scene with given feature level; -1 = application feature level // - loading scene: -1 = load with feature level in project file; >0 migrate scene to specified feature level - void switchActiveRaCoProject(const QString& file, std::function relinkCallback, bool createDefaultScene = true, int featureLevel = -1); + void switchActiveRaCoProject(const QString& file, std::function relinkCallback, bool createDefaultScene = true, int featureLevel = -1, bool generateNewObjectIDs = false); + + /** + * @brief Save project in new file while changing project ID and all object IDs. + * + * This will perform a saveAs, load, save sequence. + * + * @param fileName New filename. + * @param outError Returns error message in case of failure. + * @param setProjectName Will set project name from filename if current project name is empty and flag is set. + * @return True is successful, otherwise outError will contain the error message. + */ + bool saveAsWithNewIDs(const QString& fileName, std::string& outError, bool setProjectName = false); // Get scene description and Ramses/RamsesLogic validation status and error message with the scene // being setup as if exported. @@ -77,8 +96,9 @@ class RaCoApplication { const std::string& ramsesExport, const std::string& logicExport, bool compress, - std::string& outError, - bool forceExportWithErrors = false); + std::string& outError, + bool forceExportWithErrors = false, + ELuaSavingMode luaSavingMode = ELuaSavingMode::SourceCodeOnly); void doOneLoop(); @@ -121,7 +141,7 @@ class RaCoApplication { // Needs to access externalProjectsStore_ directly: friend class ::ObjectTreeViewExternalProjectModelTest; - bool exportProjectImpl(const std::string& ramsesExport, const std::string& logicExport, bool compress, std::string& outError, bool forceExportWithErrors) const; + bool exportProjectImpl(const std::string& ramsesExport, const std::string& logicExport, bool compress, std::string& outError, bool forceExportWithErrors, ELuaSavingMode luaSavingMode) const; void setupScene(bool optimizedForExport); diff --git a/components/libApplication/include/application/RaCoProject.h b/components/libApplication/include/application/RaCoProject.h index b7d26af6..22291eba 100644 --- a/components/libApplication/include/application/RaCoProject.h +++ b/components/libApplication/include/application/RaCoProject.h @@ -73,13 +73,13 @@ class RaCoProject : public QObject { * @exception FutureFileVersion when the loaded file contains a file version which is bigger than the known versions * @exception ExtrefError */ - static std::unique_ptr loadFromFile(const QString& filename, RaCoApplication* app, core::LoadContext& loadContext, bool logErrors = true, int featureLevel = -1); + static std::unique_ptr loadFromFile(const QString& filename, RaCoApplication* app, core::LoadContext& loadContext, bool logErrors = true, int featureLevel = -1, bool generateNewObjectIDs = false); QString name() const; bool dirty() const noexcept; bool save(std::string &outError); - bool saveAs(const QString& fileName, std::string& outError, bool setProjectName = false, bool setNewID = false); + bool saveAs(const QString& fileName, std::string& outError, bool setProjectName = false); // @exception ExtrefError void updateExternalReferences(core::LoadContext& loadContext); diff --git a/components/libApplication/src/RaCoApplication.cpp b/components/libApplication/src/RaCoApplication.cpp index edc1dccd..4f3e1194 100644 --- a/components/libApplication/src/RaCoApplication.cpp +++ b/components/libApplication/src/RaCoApplication.cpp @@ -116,7 +116,7 @@ void RaCoApplication::setupScene(bool optimizeForExport) { scenesBackend_->setScene(activeRaCoProject().project(), activeRaCoProject().errors(), optimizeForExport); } -void RaCoApplication::switchActiveRaCoProject(const QString& file, std::function relinkCallback, bool createDefaultScene, int featureLevel) { +void RaCoApplication::switchActiveRaCoProject(const QString& file, std::function relinkCallback, bool createDefaultScene, int featureLevel, bool generateNewObjectIDs) { externalProjectsStore_.clear(); WithRelinkCallback withRelinkCallback(externalProjectsStore_, relinkCallback); @@ -137,7 +137,7 @@ void RaCoApplication::switchActiveRaCoProject(const QString& file, std::function if (file.isEmpty()) { activeProject_ = RaCoProject::createNew(this, createDefaultScene, static_cast(featureLevel == -1 ? applicationFeatureLevel_ : featureLevel)); } else { - activeProject_ = RaCoProject::loadFromFile(file, this, loadContext, false, featureLevel); + activeProject_ = RaCoProject::loadFromFile(file, this, loadContext, false, featureLevel, generateNewObjectIDs); } externalProjectsStore_.setActiveProject(activeProject_.get()); @@ -155,6 +155,16 @@ void RaCoApplication::switchActiveRaCoProject(const QString& file, std::function activeProject_->errors()->logAllErrors(); } +bool RaCoApplication::saveAsWithNewIDs(const QString& newPath, std::string& outError, bool setProjectName) { + if (activeRaCoProject().saveAs(newPath, outError, setProjectName)) { + switchActiveRaCoProject(QString::fromStdString(activeProjectPath()), {}, true, -1, true); + if (activeRaCoProject().save(outError)) { + return true; + } + } + return false; +} + core::ErrorLevel RaCoApplication::getExportSceneDescriptionAndStatus(std::vector& outDescription, std::string& outMessage) { setupScene(true); logicEngineNeedsUpdate_ = true; @@ -176,12 +186,12 @@ core::ErrorLevel RaCoApplication::getExportSceneDescriptionAndStatus(std::vector return errorLevel; } -bool RaCoApplication::exportProject(const std::string& ramsesExport, const std::string& logicExport, bool compress, std::string& outError, bool forceExportWithErrors) { +bool RaCoApplication::exportProject(const std::string& ramsesExport, const std::string& logicExport, bool compress, std::string& outError, bool forceExportWithErrors, ELuaSavingMode luaSavingMode) { setupScene(true); logicEngineNeedsUpdate_ = true; doOneLoop(); - bool status = exportProjectImpl(ramsesExport, logicExport, compress, outError, forceExportWithErrors); + bool status = exportProjectImpl(ramsesExport, logicExport, compress, outError, forceExportWithErrors, luaSavingMode); setupScene(false); logicEngineNeedsUpdate_ = true; @@ -190,7 +200,7 @@ bool RaCoApplication::exportProject(const std::string& ramsesExport, const std:: return status; } -bool RaCoApplication::exportProjectImpl(const std::string& ramsesExport, const std::string& logicExport, bool compress, std::string& outError, bool forceExportWithErrors) const { +bool RaCoApplication::exportProjectImpl(const std::string& ramsesExport, const std::string& logicExport, bool compress, std::string& outError, bool forceExportWithErrors, ELuaSavingMode luaSavingMode) const { // Flushing the scene prevents inconsistent states being saved which could lead to unexpected bevahiour after loading the scene: scenesBackend_->flush(); @@ -229,6 +239,8 @@ bool RaCoApplication::exportProjectImpl(const std::string& ramsesExport, const s QCoreApplication::applicationName().toStdString())); metadata.setExporterVersion(RACO_VERSION_MAJOR, RACO_VERSION_MINOR, RACO_VERSION_PATCH, raco::serialization::RAMSES_PROJECT_FILE_VERSION); + metadata.setLuaSavingMode(static_cast(luaSavingMode)); + if (!engine_->logicEngine().saveToFile(logicExport.c_str(), metadata)) { if (engine_->logicEngine().getErrors().size() > 0) { outError = engine_->logicEngine().getErrors().at(0).message; diff --git a/components/libApplication/src/RaCoProject.cpp b/components/libApplication/src/RaCoProject.cpp index 7b0f1c58..59a5c310 100644 --- a/components/libApplication/src/RaCoProject.cpp +++ b/components/libApplication/src/RaCoProject.cpp @@ -301,7 +301,7 @@ std::unique_ptr RaCoProject::createNew(RaCoApplication* app, bool c return result; } -std::unique_ptr RaCoProject::loadFromFile(const QString& filename, RaCoApplication* app, LoadContext& loadContext, bool logErrors, int featureLevel) { +std::unique_ptr RaCoProject::loadFromFile(const QString& filename, RaCoApplication* app, LoadContext& loadContext, bool logErrors, int featureLevel, bool generateNewObjectIDs) { LOG_INFO(raco::log_system::PROJECT, "Loading project from {}", filename.toLatin1()); QFileInfo path(filename); @@ -355,11 +355,17 @@ std::unique_ptr RaCoProject::loadFromFile(const QString& filename, auto result{raco::serialization::deserializeProject(document, absPath.toStdString())}; - Project p{result.objects}; - p.setCurrentPath(absPath.toStdString()); for (const auto& instance : result.objects) { instance->onAfterDeserialization(); } + + // Ordering constraint: generateNewObjectIDs needs the pointers created by the onAfterDeserialization handlers above. + if (generateNewObjectIDs) { + BaseContext::generateNewObjectIDs(result.objects); + } + + Project p{result.objects}; + p.setCurrentPath(absPath.toStdString()); for (const auto& link : result.links) { p.addLink(link); } @@ -687,38 +693,19 @@ bool RaCoProject::save(std::string& outError) { return true; } -bool RaCoProject::saveAs(const QString& fileName, std::string& outError, bool setProjectName, bool setNewID) { +bool RaCoProject::saveAs(const QString& fileName, std::string& outError, bool setProjectName) { auto oldPath = project_.currentPath(); auto oldProjectFolder = project_.currentFolder(); QString absPath = QFileInfo(fileName).absoluteFilePath(); auto newPath = absPath.toStdString(); - if ((newPath == oldPath) && (!setNewID)) { + if (newPath == oldPath) { return save(outError); } else { // Note on the undo stack: - // both the creation of a new ProjectSettings object and the project name change will be recorded in the change recorder - // by the context operations, but no undo stack entry will be created. - // But we need an undo stack entry since the save below wil performa a restore from the undo stack. + // The project name change will be recorded in the change recorder by the context operations, but no undo stack entry will be created. + // But we need an undo stack entry since the save below wil perform a restore from the undo stack. // However the onAfterProjectPathChange will perform an unconditional undo stack push. // This means that using the context in the operations below is OK as long as we perform the onAfterProjectPathChange afterwards. - if (setNewID) { - // We can't change the id of an object so we need some trickery here: - // Create a new ProjectSettings object, copy the properties from the old one (except objectID) and then delete the old object - auto newProjectSettingsObject = context_->createObject(ProjectSettings::typeDescription.typeName, project_.settings()->objectName()); - auto translateRef = [this](SEditorObject srcObj) -> SEditorObject { - return srcObj; - }; - DataChangeRecorder localChanges; - UndoHelpers::updateEditorObject( - project_.settings().get(), newProjectSettingsObject, translateRef, - [](const std::string& propName) { - return propName == "objectID"; - }, - *context_->objectFactory(), - &localChanges, true, false); - - context_->deleteObjects(std::vector{project_.settings()}); - } if (setProjectName) { auto projName = raco::utils::u8path(newPath).stem().string(); auto settings = project_.settings(); diff --git a/components/libApplication/tests/RaCoApplication_test.cpp b/components/libApplication/tests/RaCoApplication_test.cpp index c63970df..954dfc21 100644 --- a/components/libApplication/tests/RaCoApplication_test.cpp +++ b/components/libApplication/tests/RaCoApplication_test.cpp @@ -137,6 +137,52 @@ TEST_F(RaCoApplicationFixture, export_interface_link_opt_4) { EXPECT_FALSE(application.exportProject((test_path() / "export-interface-link-opt-4.ramses").string(), (test_path() / "export-interface-link-opt-4.rlogic").string(), false, error, false)); } +TEST_F(RaCoApplicationFixture, export_with_lua_save_mode_for_feature_level_1) { + // Feature Level 1 only supports ELuaSavingMode::SourceCodeOnly. + application.switchActiveRaCoProject({}, {}, true, 1); + application.doOneLoop(); + + std::string error; + EXPECT_TRUE(application.exportProject( + (test_path() / "SourceCodeOnly.ramses").string(), + (test_path() / "SourceCodeOnly.logic").string(), + false, + error, + false, + raco::application::ELuaSavingMode::SourceCodeOnly)); +} + +TEST_F(RaCoApplicationFixture, export_with_lua_save_modes) { + // Feature Level 2 is required for all lua save modes. + application.switchActiveRaCoProject({}, {}, true, 2); + application.doOneLoop(); + + std::string error; + EXPECT_TRUE(application.exportProject( + (test_path() / "ByteCodeOnly.ramses").string(), + (test_path() / "ByteCodeOnly.logic").string(), + false, + error, + false, + raco::application::ELuaSavingMode::ByteCodeOnly)); + + EXPECT_TRUE(application.exportProject( + (test_path() / "SourceCodeOnly.ramses").string(), + (test_path() / "SourceCodeOnly.logic").string(), + false, + error, + false, + raco::application::ELuaSavingMode::SourceCodeOnly)); + + EXPECT_TRUE(application.exportProject( + (test_path() / "SourceAndByteCode.ramses").string(), + (test_path() / "SourceAndByteCode.logic").string(), + false, + error, + false, + raco::application::ELuaSavingMode::SourceAndByteCode)); +} + TEST_F(RaCoApplicationFixture, cant_delete_ProjectSettings) { auto* commandInterface = application.activeRaCoProject().commandInterface(); commandInterface->deleteObjects(application.activeRaCoProject().project()->instances()); diff --git a/components/libApplication/tests/RaCoProject_test.cpp b/components/libApplication/tests/RaCoProject_test.cpp index b171738d..3f89bc20 100644 --- a/components/libApplication/tests/RaCoProject_test.cpp +++ b/components/libApplication/tests/RaCoProject_test.cpp @@ -35,6 +35,9 @@ using raco::application::RaCoApplication; using raco::application::RaCoApplicationLaunchSettings; using raco::names::PROJECT_FILE_EXTENSION; +using namespace raco::core; +using namespace raco::user_types; + TEST_F(RaCoProjectFixture, saveLoadWithLink) { { RaCoApplication app{backend}; @@ -421,7 +424,7 @@ TEST_F(RaCoProjectFixture, saveAsWithNewID) { RaCoApplication app{backend}; std::string msg; const auto objectInitID = app.activeRaCoProject().project()->settings()->objectID(); - ASSERT_TRUE(app.activeRaCoProject().saveAs((test_path() / "project.rca").string().c_str(), msg, false, true)); + ASSERT_TRUE(app.saveAsWithNewIDs((test_path() / "project.rca").string().c_str(), msg, false)); const auto objectNewID = app.activeRaCoProject().project()->settings()->objectID(); ASSERT_NE(objectInitID, objectNewID); @@ -434,19 +437,97 @@ TEST_F(RaCoProjectFixture, saveAsWithNewIDSamePath) { RaCoApplication app{backend}; std::string msg; const auto objectInitID = app.activeRaCoProject().project()->settings()->objectID(); - ASSERT_TRUE(app.activeRaCoProject().saveAs((test_path() / "project.rca").string().c_str(), msg, false, true)); + ASSERT_TRUE(app.saveAsWithNewIDs((test_path() / "project.rca").string().c_str(), msg, false)); const auto objectNewID1 = app.activeRaCoProject().project()->settings()->objectID(); ASSERT_NE(objectNewID1, objectInitID); - ASSERT_TRUE(app.activeRaCoProject().saveAs((test_path() / "project.rca").string().c_str(), msg, false, true)); + ASSERT_TRUE(app.saveAsWithNewIDs((test_path() / "project.rca").string().c_str(), msg, false)); const auto objectNewID2 = app.activeRaCoProject().project()->settings()->objectID(); ASSERT_NE(objectNewID1, objectNewID2); } + +TEST_F(RaCoProjectFixture, save_as_with_new_id_preserves_prefab_id_structure_nested) { + RaCoApplication app{backend}; + auto& cmd = *app.activeRaCoProject().commandInterface(); + + // prefab_2 inst_2 + // prefab inst_1 inst_3 + // lua lua_1 lua_2 + + app.activeRaCoProject().project()->setCurrentPath((test_path() / "project.rca").string()); + + auto prefab = cmd.createObject(raco::user_types::Prefab::typeDescription.typeName, "prefab"); + auto lua = cmd.createObject(raco::user_types::LuaScript::typeDescription.typeName, "lua"); + cmd.moveScenegraphChildren({lua}, prefab); + + auto prefab_2 = cmd.createObject(raco::user_types::Prefab::typeDescription.typeName, "prefab2"); + auto inst_1 = cmd.createObject(raco::user_types::PrefabInstance::typeDescription.typeName, "inst"); + cmd.moveScenegraphChildren({inst_1}, prefab_2); + cmd.set({inst_1, &raco::user_types::PrefabInstance::template_}, prefab); + + EXPECT_EQ(inst_1->children_->size(), 1); + auto lua_1 = inst_1->children_->asVector()[0]; + + auto inst_2 = cmd.createObject(raco::user_types::PrefabInstance::typeDescription.typeName, "inst2"); + cmd.set({inst_2, &raco::user_types::PrefabInstance::template_}, prefab_2); + EXPECT_EQ(inst_2->children_->size(), 1); + auto inst_3 = inst_2->children_->asVector()[0]; + EXPECT_EQ(inst_3->children_->size(), 1); + auto lua_2 = inst_3->children_->asVector()[0]; + + EXPECT_EQ(lua_1->objectID(), EditorObject::XorObjectIDs(lua->objectID(), inst_1->objectID())); + EXPECT_EQ(inst_3->objectID(), EditorObject::XorObjectIDs(inst_1->objectID(), inst_2->objectID())); + EXPECT_EQ(lua_2->objectID(), EditorObject::XorObjectIDs(lua_1->objectID(), inst_2->objectID())); + EXPECT_EQ(lua_2->objectID(), EditorObject::XorObjectIDs(lua->objectID(), inst_3->objectID())); + + std::string prefab_id = prefab->objectID(); + std::string prefab_2_id = prefab_2->objectID(); + std::string inst_1_id = inst_1->objectID(); + std::string inst_2_id = inst_2->objectID(); + std::string inst_3_id = inst_3->objectID(); + std::string lua_id = lua->objectID(); + std::string lua_1_id = lua_1->objectID(); + std::string lua_2_id = lua_2->objectID(); + + std::string msg; + ASSERT_TRUE(app.saveAsWithNewIDs((test_path() / "project.rca").string().c_str(), msg, false)); + auto& instances = app.activeRaCoProject().project()->instances(); + + { + auto prefab = raco::select(instances, "prefab"); + auto lua = prefab->children_->asVector()[0]; + + auto prefab_2 = raco::select(instances, "prefab2"); + auto inst_1 = prefab_2->children_->asVector()[0]; + auto lua_1 = inst_1->children_->asVector()[0]; + + auto inst_2 = raco::select(instances, "inst2"); + auto inst_3 = inst_2->children_->asVector()[0]; + auto lua_2 = inst_3->children_->asVector()[0]; + + EXPECT_NE(prefab_id, prefab->objectID()); + EXPECT_NE(prefab_2_id, prefab_2->objectID()); + + EXPECT_NE(inst_1_id, inst_1->objectID()); + EXPECT_NE(inst_2_id, inst_2->objectID()); + EXPECT_NE(inst_3_id, inst_3->objectID()); + + EXPECT_NE(lua_id, lua->objectID()); + EXPECT_NE(lua_1_id, lua_1->objectID()); + EXPECT_NE(lua_2_id, lua_2->objectID()); + + EXPECT_EQ(lua_1->objectID(), EditorObject::XorObjectIDs(lua->objectID(), inst_1->objectID())); + EXPECT_EQ(inst_3->objectID(), EditorObject::XorObjectIDs(inst_1->objectID(), inst_2->objectID())); + EXPECT_EQ(lua_2->objectID(), EditorObject::XorObjectIDs(lua_1->objectID(), inst_2->objectID())); + EXPECT_EQ(lua_2->objectID(), EditorObject::XorObjectIDs(lua->objectID(), inst_3->objectID())); + } +} + TEST_F(RaCoProjectFixture, saveAsSetProjectName) { RaCoApplication app{backend}; std::string msg; ASSERT_TRUE(app.activeRaCoProject().project()->settings()->objectName().empty()); - ASSERT_TRUE(app.activeRaCoProject().saveAs((test_path() / "project.rca").string().c_str(), msg, true, false)); + ASSERT_TRUE(app.activeRaCoProject().saveAs((test_path() / "project.rca").string().c_str(), msg, true)); ASSERT_EQ("project", app.activeRaCoProject().project()->settings()->objectName()); raco::core::LoadContext loadContext; @@ -576,7 +657,7 @@ TEST_F(RaCoProjectFixture, saveAs_set_path_updates_cached_path) { RaCoApplication app{backend}; std::string msg; - ASSERT_TRUE(app.activeRaCoProject().saveAs((test_path() / "project.rca").string().c_str(), msg, false, false)); + ASSERT_TRUE(app.activeRaCoProject().saveAs((test_path() / "project.rca").string().c_str(), msg, false)); const auto& settings = app.activeRaCoProject().project()->settings(); const auto& commandInterface = app.activeRaCoProject().commandInterface(); @@ -608,7 +689,7 @@ TEST_F(RaCoProjectFixture, saveAs_with_new_id_set_path_updates_cached_path) { RaCoApplication app{backend}; std::string msg; - ASSERT_TRUE(app.activeRaCoProject().saveAs((test_path() / "project.rca").string().c_str(), msg, false, true)); + ASSERT_TRUE(app.saveAsWithNewIDs((test_path() / "project.rca").string().c_str(), msg, false)); const auto& settings = app.activeRaCoProject().project()->settings(); const auto& commandInterface = app.activeRaCoProject().commandInterface(); diff --git a/components/libPythonAPI/CMakeLists.txt b/components/libPythonAPI/CMakeLists.txt index 159558e0..95b71fda 100644 --- a/components/libPythonAPI/CMakeLists.txt +++ b/components/libPythonAPI/CMakeLists.txt @@ -19,7 +19,6 @@ target_link_libraries(libPythonAPI PUBLIC raco::ApplicationLib PRIVATE - raco::RamsesBase raco::pybind11 ) diff --git a/components/libPythonAPI/src/PythonAPI.cpp b/components/libPythonAPI/src/PythonAPI.cpp index 4f278a02..b2b7abcf 100644 --- a/components/libPythonAPI/src/PythonAPI.cpp +++ b/components/libPythonAPI/src/PythonAPI.cpp @@ -36,9 +36,6 @@ #include "user_types/PrefabInstance.h" #include "user_types/RenderLayer.h" -#include -#include - #include #include @@ -50,46 +47,48 @@ raco::application::RaCoApplication* app; raco::python_api::PythonRunStatus currentRunStatus; py::object python_get_scalar_value(raco::core::ValueHandle handle) { + using namespace raco::user_types; + switch (handle.type()) { case raco::data_storage::PrimitiveType::Bool: return py::cast(handle.asBool()); break; case raco::data_storage::PrimitiveType::Int: if (auto anno = handle.query()) { - switch (static_cast(anno->type_.asInt())) { - case raco::core::EngineEnumeration::CullMode: - return py::cast(static_cast(handle.asInt())); + switch (static_cast(anno->type_.asInt())) { + case raco::core::EUserTypeEnumerations::CullMode: + return py::cast(static_cast(handle.asInt())); - case raco::core::EngineEnumeration::BlendOperation: - return py::cast(static_cast(handle.asInt())); + case raco::core::EUserTypeEnumerations::BlendOperation: + return py::cast(static_cast(handle.asInt())); - case raco::core::EngineEnumeration::BlendFactor: - return py::cast(static_cast(handle.asInt())); + case raco::core::EUserTypeEnumerations::BlendFactor: + return py::cast(static_cast(handle.asInt())); - case raco::core::EngineEnumeration::DepthFunction: - return py::cast(static_cast(handle.asInt())); + case raco::core::EUserTypeEnumerations::DepthFunction: + return py::cast(static_cast(handle.asInt())); - case raco::core::EngineEnumeration::TextureAddressMode: - return py::cast(static_cast(handle.asInt())); + case raco::core::EUserTypeEnumerations::TextureAddressMode: + return py::cast(static_cast(handle.asInt())); - case raco::core::EngineEnumeration::TextureMinSamplingMethod: - case raco::core::EngineEnumeration::TextureMagSamplingMethod: - return py::cast(static_cast(handle.asInt())); + case raco::core::EUserTypeEnumerations::TextureMinSamplingMethod: + case raco::core::EUserTypeEnumerations::TextureMagSamplingMethod: + return py::cast(static_cast(handle.asInt())); - case raco::core::EngineEnumeration::TextureFormat: - return py::cast(static_cast(handle.asInt())); + case raco::core::EUserTypeEnumerations::TextureFormat: + return py::cast(static_cast(handle.asInt())); - case raco::core::EngineEnumeration::RenderBufferFormat: - return py::cast(static_cast(handle.asInt())); + case raco::core::EUserTypeEnumerations::RenderBufferFormat: + return py::cast(static_cast(handle.asInt())); - case raco::core::EngineEnumeration::RenderLayerOrder: - return py::cast(static_cast(handle.asInt())); + case raco::core::EUserTypeEnumerations::RenderLayerOrder: + return py::cast(static_cast(handle.asInt())); - case raco::core::EngineEnumeration::RenderLayerMaterialFilterMode: - return py::cast(static_cast(handle.asInt())); + case raco::core::EUserTypeEnumerations::RenderLayerMaterialFilterMode: + return py::cast(static_cast(handle.asInt())); - case raco::core::EngineEnumeration::FrustumType: - return py::cast(static_cast(handle.asInt())); + case raco::core::EUserTypeEnumerations::FrustumType: + return py::cast(static_cast(handle.asInt())); default: assert(false); @@ -295,7 +294,7 @@ std::vector getTags(raco::core::SEditorObject obj, std::string tagP raco::core::PropertyDescriptor desc(obj, {tagPropertyName}); checkHiddenProperty(desc); raco::core::ValueHandle handle(desc); - if (handle.query()) { + if (handle.query() || handle.query()) { return handle.constValueRef()->asTable().asVector(); } else { throw std::runtime_error(fmt::format("Property '{}' is not a tag container.", desc.getPropertyPath())); @@ -307,7 +306,7 @@ void setTags(raco::core::SEditorObject obj, std::vector tags, std:: raco::core::PropertyDescriptor desc(obj, {tagPropertyName}); checkHiddenProperty(desc); raco::core::ValueHandle handle(desc); - if (handle.query()) { + if (handle.query() || handle.query()) { app->activeRaCoProject().commandInterface()->setTags(handle, tags); app->doOneLoop(); } else { @@ -354,115 +353,124 @@ PYBIND11_EMBEDDED_MODULE(raco_py_io, m) { }); } + PYBIND11_EMBEDDED_MODULE(raco, m) { - py::enum_(m, "ECullMode") - .value("Disabled", ramses::ECullMode_Disabled) - .value("Front", ramses::ECullMode_FrontFacing) - .value("Back", ramses::ECullMode_BackFacing) - .value("FrontAndBack", ramses::ECullMode_FrontAndBackFacing); - - py::enum_(m, "EBlendOperation") - .value("Disabled", ramses::EBlendOperation_Disabled) - .value("Add", ramses::EBlendOperation_Add) - .value("Subtract", ramses::EBlendOperation_Subtract) - .value("ReverseSubtract", ramses::EBlendOperation_ReverseSubtract) - .value("Min", ramses::EBlendOperation_Min) - .value("Max", ramses::EBlendOperation_Max); - - py::enum_(m, "EBlendFactor") - .value("Zero", ramses::EBlendFactor_Zero) - .value("One", ramses::EBlendFactor_One) - .value("SrcAlpha", ramses::EBlendFactor_SrcAlpha) - .value("OneMinusSrcAlpha", ramses::EBlendFactor_OneMinusSrcAlpha) - .value("DstAlpha", ramses::EBlendFactor_DstAlpha) - .value("OneMinusDstAlpha", ramses::EBlendFactor_OneMinusDstAlpha) - .value("SrcColor", ramses::EBlendFactor_SrcColor) - .value("OneMinusSrcColor", ramses::EBlendFactor_OneMinusSrcColor) - .value("DstColor", ramses::EBlendFactor_DstColor) - .value("OneMinusDstColor", ramses::EBlendFactor_OneMinusDstColor) - .value("ConstColor", ramses::EBlendFactor_ConstColor) - .value("OneMinusConstColor", ramses::EBlendFactor_OneMinusConstColor) - .value("ConstAlpha", ramses::EBlendFactor_ConstAlpha) - .value("OneMinusConstAlpha", ramses::EBlendFactor_OneMinusConstAlpha) - .value("AlphaSaturate", ramses::EBlendFactor_AlphaSaturate); - - py::enum_(m, "EDepthFunction") - .value("Disabled", ramses::EDepthFunc_Disabled) - .value("Greater", ramses::EDepthFunc_Greater) - .value("GreaterEqual", ramses::EDepthFunc_GreaterEqual) - .value("Less", ramses::EDepthFunc_Less) - .value("LessEqual", ramses::EDepthFunc_LessEqual) - .value("Equal", ramses::EDepthFunc_Equal) - .value("NotEqual", ramses::EDepthFunc_NotEqual) - .value("Always", ramses::EDepthFunc_Always) - .value("Never", ramses::EDepthFunc_Never); - - py::enum_(m, "ETextureAddressMode") - .value("Clamp", ramses::ETextureAddressMode_Clamp) - .value("Repeat", ramses::ETextureAddressMode_Repeat) - .value("Mirror", ramses::ETextureAddressMode_Mirror); - - py::enum_(m, "ETextureSamplingMethod") - .value("Nearest", ramses::ETextureSamplingMethod_Nearest) - .value("Linear", ramses::ETextureSamplingMethod_Linear) - .value("Nearest_MipMapNearest", ramses::ETextureSamplingMethod_Nearest_MipMapNearest) - .value("Nearest_MipMapLinear", ramses::ETextureSamplingMethod_Nearest_MipMapLinear) - .value("Linear_MipMapNearest", ramses::ETextureSamplingMethod_Linear_MipMapNearest) - .value("Linear_MipMapLinear", ramses::ETextureSamplingMethod_Linear_MipMapLinear); - - py::enum_(m, "ETextureFormat") - .value("R8", ramses::ETextureFormat::R8) - .value("RG8", ramses::ETextureFormat::RG8) - .value("RGB8", ramses::ETextureFormat::RGB8) - .value("RGBA8", ramses::ETextureFormat::RGBA8) - .value("RGB16F", ramses::ETextureFormat::RGB16F) - .value("RGBA16F", ramses::ETextureFormat::RGBA16F) - .value("SRGB8", ramses::ETextureFormat::SRGB8) - .value("SRGB8_ALPHA8", ramses::ETextureFormat::SRGB8_ALPHA8); - - py::enum_(m, "ERenderBufferFormat") - .value("RGBA4", ramses::ERenderBufferFormat_RGBA4) - .value("R8", ramses::ERenderBufferFormat_R8) - .value("RG8", ramses::ERenderBufferFormat_RG8) - .value("RGB8", ramses::ERenderBufferFormat_RGB8) - .value("RGBA8", ramses::ERenderBufferFormat_RGBA8) - .value("R16F", ramses::ERenderBufferFormat_R16F) - .value("R32F", ramses::ERenderBufferFormat_R32F) - .value("RG16F", ramses::ERenderBufferFormat_RG16F) - .value("RG32F", ramses::ERenderBufferFormat_RG32F) - .value("RGB16F", ramses::ERenderBufferFormat_RGB16F) - .value("RGB32F", ramses::ERenderBufferFormat_RGB32F) - .value("RGBA16F", ramses::ERenderBufferFormat_RGBA16F) - .value("RGBA32F", ramses::ERenderBufferFormat_RGBA32F) - - .value("Depth24", ramses::ERenderBufferFormat_Depth24) - .value("Depth24_Stencil8", ramses::ERenderBufferFormat_Depth24_Stencil8); - - py::enum_(m, "ERenderLayerOrder") - .value("Manual", raco::user_types::ERenderLayerOrder::Manual) - .value("SceneGraph", raco::user_types::ERenderLayerOrder::SceneGraph); - - py::enum_(m, "ERenderLayerMaterialFilterMode") - .value("Inclusive", raco::user_types::ERenderLayerMaterialFilterMode::Inclusive) - .value("Exclusive", raco::user_types::ERenderLayerMaterialFilterMode::Exclusive); - - py::enum_(m, "EFrustumType") - .value("Aspect_FoV", raco::user_types::EFrustumType::Aspect_FieldOfView) - .value("Planes", raco::user_types::EFrustumType::Planes); - - py::enum_(m, "ErrorCategory") - .value("GENERAL", raco::core::ErrorCategory::GENERAL) - .value("PARSING", raco::core::ErrorCategory::PARSING) - .value("FILESYSTEM", raco::core::ErrorCategory::FILESYSTEM) - .value("RAMSES_LOGIC_RUNTIME", raco::core::ErrorCategory::RAMSES_LOGIC_RUNTIME) - .value("EXTERNAL_REFERENCE", raco::core::ErrorCategory::EXTERNAL_REFERENCE) - .value("MIGRATION", raco::core::ErrorCategory::MIGRATION); - - py::enum_(m, "ErrorLevel") - .value("NONE", raco::core::ErrorLevel::NONE) - .value("INFORMATION", raco::core::ErrorLevel::INFORMATION) - .value("WARNING", raco::core::ErrorLevel::WARNING) - .value("ERROR", raco::core::ErrorLevel::ERROR); + using namespace raco::user_types; + + py::enum_(m, "ECullMode") + .value("Disabled", ECullMode::Disabled) + .value("Front", ECullMode::FrontFacing) + .value("Back", ECullMode::BackFacing) + .value("FrontAndBack", ECullMode::FrontAndBackFacing); + + py::enum_(m, "EBlendOperation") + .value("Disabled", EBlendOperation::Disabled) + .value("Add", EBlendOperation::Add) + .value("Subtract", EBlendOperation::Subtract) + .value("ReverseSubtract", EBlendOperation::ReverseSubtract) + .value("Min", EBlendOperation::Min) + .value("Max", EBlendOperation::Max); + + py::enum_(m, "EBlendFactor") + .value("Zero", EBlendFactor::Zero) + .value("One", EBlendFactor::One) + .value("SrcAlpha", EBlendFactor::SrcAlpha) + .value("OneMinusSrcAlpha", EBlendFactor::OneMinusSrcAlpha) + .value("DstAlpha", EBlendFactor::DstAlpha) + .value("OneMinusDstAlpha", EBlendFactor::OneMinusDstAlpha) + .value("SrcColor", EBlendFactor::SrcColor) + .value("OneMinusSrcColor", EBlendFactor::OneMinusSrcColor) + .value("DstColor", EBlendFactor::DstColor) + .value("OneMinusDstColor", EBlendFactor::OneMinusDstColor) + .value("ConstColor", EBlendFactor::ConstColor) + .value("OneMinusConstColor", EBlendFactor::OneMinusConstColor) + .value("ConstAlpha", EBlendFactor::ConstAlpha) + .value("OneMinusConstAlpha", EBlendFactor::OneMinusConstAlpha) + .value("AlphaSaturate", EBlendFactor::AlphaSaturate); + + py::enum_(m, "EDepthFunction") + .value("Disabled", EDepthFunc::Disabled) + .value("Greater", EDepthFunc::Greater) + .value("GreaterEqual", EDepthFunc::GreaterEqual) + .value("Less", EDepthFunc::Less) + .value("LessEqual", EDepthFunc::LessEqual) + .value("Equal", EDepthFunc::Equal) + .value("NotEqual", EDepthFunc::NotEqual) + .value("Always", EDepthFunc::Always) + .value("Never", EDepthFunc::Never); + + py::enum_(m, "ETextureAddressMode") + .value("Clamp", ETextureAddressMode::Clamp) + .value("Repeat", ETextureAddressMode::Repeat) + .value("Mirror", ETextureAddressMode::Mirror); + + py::enum_(m, "ETextureSamplingMethod") + .value("Nearest", ETextureSamplingMethod::Nearest) + .value("Linear", ETextureSamplingMethod::Linear) + .value("Nearest_MipMapNearest", ETextureSamplingMethod::Nearest_MipMapNearest) + .value("Nearest_MipMapLinear", ETextureSamplingMethod::Nearest_MipMapLinear) + .value("Linear_MipMapNearest", ETextureSamplingMethod::Linear_MipMapNearest) + .value("Linear_MipMapLinear", ETextureSamplingMethod::Linear_MipMapLinear); + + py::enum_(m, "ETextureFormat") + .value("R8", ETextureFormat::R8) + .value("RG8", ETextureFormat::RG8) + .value("RGB8", ETextureFormat::RGB8) + .value("RGBA8", ETextureFormat::RGBA8) + .value("RGB16F", ETextureFormat::RGB16F) + .value("RGBA16F", ETextureFormat::RGBA16F) + .value("SRGB8", ETextureFormat::SRGB8) + .value("SRGB8_ALPHA8", ETextureFormat::SRGB8_ALPHA8); + + py::enum_(m, "ERenderBufferFormat") + .value("RGBA4", ERenderBufferFormat::RGBA4) + .value("R8", ERenderBufferFormat::R8) + .value("RG8", ERenderBufferFormat::RG8) + .value("RGB8", ERenderBufferFormat::RGB8) + .value("RGBA8", ERenderBufferFormat::RGBA8) + .value("R16F", ERenderBufferFormat::R16F) + .value("R32F", ERenderBufferFormat::R32F) + .value("RG16F", ERenderBufferFormat::RG16F) + .value("RG32F", ERenderBufferFormat::RG32F) + .value("RGB16F", ERenderBufferFormat::RGB16F) + .value("RGB32F", ERenderBufferFormat::RGB32F) + .value("RGBA16F", ERenderBufferFormat::RGBA16F) + .value("RGBA32F", ERenderBufferFormat::RGBA32F) + + .value("Depth24", ERenderBufferFormat::Depth24) + .value("Depth24_Stencil8", ERenderBufferFormat::Depth24_Stencil8); + + py::enum_(m, "ERenderLayerOrder") + .value("Manual", ERenderLayerOrder::Manual) + .value("SceneGraph", ERenderLayerOrder::SceneGraph); + + py::enum_(m, "ERenderLayerMaterialFilterMode") + .value("Inclusive", ERenderLayerMaterialFilterMode::Inclusive) + .value("Exclusive", ERenderLayerMaterialFilterMode::Exclusive); + + py::enum_(m, "EFrustumType") + .value("Aspect_FoV", EFrustumType::Aspect_FieldOfView) + .value("Planes", EFrustumType::Planes); + + py::enum_(m, "ErrorCategory") + .value("GENERAL", ErrorCategory::GENERAL) + .value("PARSING", ErrorCategory::PARSING) + .value("FILESYSTEM", ErrorCategory::FILESYSTEM) + .value("RAMSES_LOGIC_RUNTIME", ErrorCategory::RAMSES_LOGIC_RUNTIME) + .value("EXTERNAL_REFERENCE", ErrorCategory::EXTERNAL_REFERENCE) + .value("MIGRATION", ErrorCategory::MIGRATION); + + py::enum_(m, "ErrorLevel") + .value("NONE", ErrorLevel::NONE) + .value("INFORMATION", ErrorLevel::INFORMATION) + .value("WARNING", ErrorLevel::WARNING) + .value("ERROR", ErrorLevel::ERROR); + + py::enum_(m, "ELuaSavingMode") + .value("SourceCodeOnly", raco::application::ELuaSavingMode::SourceCodeOnly) + .value("ByteCodeOnly", raco::application::ELuaSavingMode::ByteCodeOnly) + .value("SourceAndByteCode", raco::application::ELuaSavingMode::SourceAndByteCode); + m.def("load", [](std::string path) { python_load_project(path, -1); @@ -499,10 +507,20 @@ PYBIND11_EMBEDDED_MODULE(raco, m) { } }); - m.def("save", [](std::string path, bool setNewID) { + m.def("save", [](std::string path, bool setNewIDs) { + if (app->isRunningInUI()) { + throw std::runtime_error(fmt::format("Can not load project: project-switching Python functions currently not allowed in UI.")); + } + if (app->canSaveActiveProject()) { std::string errorMsg; - if (!app->activeRaCoProject().saveAs(QString::fromStdString(path), errorMsg, app->activeProjectPath().empty(), setNewID)) { + bool success; + if (setNewIDs) { + success = app->saveAsWithNewIDs(QString::fromStdString(path), errorMsg, app->activeProjectPath().empty()); + } else { + success = app->activeRaCoProject().saveAs(QString::fromStdString(path), errorMsg, app->activeProjectPath().empty()); + } + if (!success) { throw std::runtime_error(fmt::format("Saving project to '{}' failed with error '{}'.", path, errorMsg)); } } else { @@ -540,6 +558,13 @@ PYBIND11_EMBEDDED_MODULE(raco, m) { } }); + m.def("export", [](std::string ramsesExport, std::string logicExport, bool compress, raco::application::ELuaSavingMode luaSavingMode) { + std::string outError; + if (!app->exportProject(ramsesExport, logicExport, compress, outError, false, luaSavingMode)) { + throw std::runtime_error(fmt::format(("Export failed: {}", outError))); + } + }); + m.def("isRunningInUi", []() { return app->isRunningInUI(); }); @@ -710,7 +735,7 @@ PYBIND11_EMBEDDED_MODULE(raco, m) { }) .def("getTags", [](raco::core::SEditorObject obj) -> std::vector { return getTags(obj, "tags"); - }) + }) .def("setTags", [](raco::core::SEditorObject obj, std::vector tags) { setTags(obj, tags, "tags"); }) @@ -720,6 +745,12 @@ PYBIND11_EMBEDDED_MODULE(raco, m) { .def("setMaterialFilterTags", [](raco::core::SEditorObject obj, std::vector tags) { setTags(obj, tags, "materialFilterTags"); }) + .def("getUserTags", [](raco::core::SEditorObject obj) -> std::vector { + return getTags(obj, "userTags"); + }) + .def("setUserTags", [](raco::core::SEditorObject obj, std::vector tags) { + setTags(obj, tags, "userTags"); + }) .def("getRenderableTags", [](raco::core::SEditorObject obj) -> std::vector> { checkTypedObject(obj); raco::core::ValueHandle handle(obj, &raco::user_types::RenderLayer::renderableTags_); diff --git a/components/libRamsesBase/CMakeLists.txt b/components/libRamsesBase/CMakeLists.txt index bab91daf..1901b082 100644 --- a/components/libRamsesBase/CMakeLists.txt +++ b/components/libRamsesBase/CMakeLists.txt @@ -21,12 +21,12 @@ add_library(libRamsesBase include/ramses_base/BaseEngineBackend.h src/ramses_base/BaseEngineBackend.cpp include/ramses_base/BuildOptions.h include/ramses_base/CoreInterfaceImpl.h src/ramses_base/CoreInterfaceImpl.cpp + include/ramses_base/EnumerationTranslations.h src/ramses_base/EnumerationTranslations.cpp include/ramses_base/HeadlessEngineBackend.h src/ramses_base/HeadlessEngineBackend.cpp include/ramses_base/LogicEngine.h include/ramses_base/RamsesHandles.h include/ramses_base/RamsesFormatter.h include/ramses_base/Utils.h src/ramses_base/Utils.cpp - src/ramses_base/EnumerationDescriptions.h include/ramses_adaptor/AnchorPointAdaptor.h src/ramses_adaptor/AnchorPointAdaptor.cpp include/ramses_adaptor/AnimationAdaptor.h src/ramses_adaptor/AnimationAdaptor.cpp diff --git a/components/libRamsesBase/include/ramses_adaptor/LinkAdaptor.h b/components/libRamsesBase/include/ramses_adaptor/LinkAdaptor.h index 15a04aad..6d513a70 100644 --- a/components/libRamsesBase/include/ramses_adaptor/LinkAdaptor.h +++ b/components/libRamsesBase/include/ramses_adaptor/LinkAdaptor.h @@ -40,7 +40,8 @@ class LinkAdaptor { void readDataFromEngine(core::DataChangeRecorder &recorder); protected: - void connectHelper(const core::PropertyDescriptor& start, const rlogic::Property& endEngineProp, bool isWeak); + void connectHelper(const core::ValueHandle& start, const core::ValueHandle& end, bool isWeak); + void readFromEngineRecursive(core::DataChangeRecorder& recorder, const core::ValueHandle& property); SceneAdaptor* sceneAdaptor_; core::LinkDescriptor editorLink_; diff --git a/components/libRamsesBase/include/ramses_adaptor/SceneAdaptor.h b/components/libRamsesBase/include/ramses_adaptor/SceneAdaptor.h index 4a259e4c..6d691dcb 100644 --- a/components/libRamsesBase/include/ramses_adaptor/SceneAdaptor.h +++ b/components/libRamsesBase/include/ramses_adaptor/SceneAdaptor.h @@ -63,6 +63,7 @@ class SceneAdaptor { rlogic::EFeatureLevel featureLevel() const; private: + bool needAdaptor(SEditorObject object); void createLink(const core::LinkDescriptor& link); void changeLinkValidity(const core::LinkDescriptor& link, bool isValid); void removeLink(const core::LinkDescriptor& link); @@ -110,7 +111,7 @@ class SceneAdaptor { }; LinkAdaptorContainer links_; - std::vector newLinks_{}; + std::set newLinks_{}; components::Subscription subscription_; components::Subscription childrenSubscription_; diff --git a/components/libRamsesBase/include/ramses_adaptor/utilities.h b/components/libRamsesBase/include/ramses_adaptor/utilities.h index 2ac7515e..5ea90db4 100644 --- a/components/libRamsesBase/include/ramses_adaptor/utilities.h +++ b/components/libRamsesBase/include/ramses_adaptor/utilities.h @@ -19,8 +19,10 @@ #include "data_storage/Value.h" #include "ramses_adaptor/BuildOptions.h" #include "ramses_adaptor/SceneAdaptor.h" +#include "ramses_base/EnumerationTranslations.h" #include "ramses_base/RamsesHandles.h" #include "user_types/EngineTypeAnnotation.h" +#include "user_types/Enumerations.h" #include "user_types/Material.h" #include "user_types/Node.h" #include "utils/MathUtils.h" @@ -91,6 +93,9 @@ struct Vec3f { bool operator==(const Vec3f& other) const { return x == other.x && y == other.y && z == other.z; } + bool operator==(const std::array& other) const { + return x == other[0] && y == other[1] && z == other[2]; + } bool operator!=(const Vec3f& other) const { return x != other.x || y != other.y || z != other.z; } @@ -126,7 +131,7 @@ struct Translation final : public Vec3f { auto status = target.setTranslation(value.x, value.y, value.z); assert(status == ramses::StatusOK); } - static Translation from(ramses::Node& node) { + static Translation from(const ramses::Node& node) { Translation result; auto status = node.getTranslation(result.x, result.y, result.z); assert(status == ramses::StatusOK); @@ -241,7 +246,6 @@ inline bool setLuaInputInEngine(rlogic::Property* property, const core::ValueHan return success; } - void getOutputFromEngine(const rlogic::Property& property, const core::ValueHandle& valueHandle, core::DataChangeRecorder& recorder); inline void getComplexLuaOutputFromEngine(const rlogic::Property& property, const core::ValueHandle& valueHandle, core::DataChangeRecorder& recorder) { @@ -307,136 +311,14 @@ inline void getOutputFromEngine(const rlogic::Property& property, const core::Va auto [i1, i2, i3, i4] = property.get().value(); core::CodeControlledPropertyModifier::setVec4i(valueHandle, i1, i2, i3, i4, recorder); } else { - getComplexLuaOutputFromEngine(property, valueHandle, recorder); + getComplexLuaOutputFromEngine(property, valueHandle, recorder); } break; } case PrimitiveType::Table: { getComplexLuaOutputFromEngine(property, valueHandle, recorder); - break; - } - } -} - -template -std::vector flattenUniformArrayOfVector(const core::ValueHandle& handle, int numComponents) { - std::vector values; - for (size_t index = 0; index < handle.size(); index++) { - for (size_t component = 0; component < numComponents; component++) { - values.emplace_back(handle[index][component].as()); - } - } - return values; -} - -inline void setUniform(ramses::Appearance* appearance, const core::ValueHandle& valueHandle) { - using core::PrimitiveType; - ramses::UniformInput input; - appearance->getEffect().findUniformInput(valueHandle.getPropName().c_str(), input); - - auto engineTypeAnno = valueHandle.query(); - switch (engineTypeAnno->type()) { - case core::EnginePrimitive::Double: - appearance->setInputValueFloat(input, valueHandle.as()); break; - case core::EnginePrimitive::Int32: - case core::EnginePrimitive::UInt16: - case core::EnginePrimitive::UInt32: - appearance->setInputValueInt32(input, static_cast(valueHandle.as())); - break; - - case core::EnginePrimitive::Vec2f: - appearance->setInputValueVector2f(input, valueHandle[0].as(), valueHandle[1].as()); - break; - - case core::EnginePrimitive::Vec3f: - appearance->setInputValueVector3f(input, valueHandle[0].as(), valueHandle[1].as(), valueHandle[2].as()); - break; - - case core::EnginePrimitive::Vec4f: - appearance->setInputValueVector4f(input, valueHandle[0].as(), valueHandle[1].as(), valueHandle[2].as(), valueHandle[3].as()); - break; - - case core::EnginePrimitive::Vec2i: - appearance->setInputValueVector2i(input, static_cast(valueHandle[0].as()), static_cast(valueHandle[1].as())); - break; - - case core::EnginePrimitive::Vec3i: - appearance->setInputValueVector3i(input, static_cast(valueHandle[0].as()), static_cast(valueHandle[1].as()), static_cast(valueHandle[2].as())); - break; - - case core::EnginePrimitive::Vec4i: - appearance->setInputValueVector4i(input, static_cast(valueHandle[0].as()), static_cast(valueHandle[1].as()), static_cast(valueHandle[2].as()), static_cast(valueHandle[3].as())); - break; - - case core::EnginePrimitive::Array: { - assert(valueHandle.size() >= 1); - - auto elementAnno = valueHandle[0].query(); - switch (elementAnno->type()) { - case core::EnginePrimitive::Double: { - std::vector values; - for (size_t index = 0; index < valueHandle.size(); index++) { - values.emplace_back(valueHandle[index].as()); - } - appearance->setInputValueFloat(input, values.size(), values.data()); - break; - } - - case core::EnginePrimitive::Int32: - case core::EnginePrimitive::UInt16: - case core::EnginePrimitive::UInt32: { - std::vector values; - for (size_t index = 0; index < valueHandle.size(); index++) { - values.emplace_back(valueHandle[index].as()); - } - appearance->setInputValueInt32(input, values.size(), values.data()); - break; - } - - case core::EnginePrimitive::Vec2f: { - auto values{flattenUniformArrayOfVector(valueHandle, 2)}; - appearance->setInputValueVector2f(input, valueHandle.size(), values.data()); - break; - } - - case core::EnginePrimitive::Vec3f: { - auto values{flattenUniformArrayOfVector(valueHandle, 3)}; - appearance->setInputValueVector3f(input, valueHandle.size(), values.data()); - break; - } - - case core::EnginePrimitive::Vec4f: { - auto values{flattenUniformArrayOfVector(valueHandle, 4)}; - appearance->setInputValueVector4f(input, valueHandle.size(), values.data()); - break; - } - - case core::EnginePrimitive::Vec2i: { - auto values{flattenUniformArrayOfVector(valueHandle, 2)}; - appearance->setInputValueVector2i(input, valueHandle.size(), values.data()); - break; - } - - case core::EnginePrimitive::Vec3i: { - auto values{flattenUniformArrayOfVector(valueHandle, 3)}; - appearance->setInputValueVector3i(input, valueHandle.size(), values.data()); - break; - } - - case core::EnginePrimitive::Vec4i: { - auto values{flattenUniformArrayOfVector(valueHandle, 4)}; - appearance->setInputValueVector4i(input, valueHandle.size(), values.data()); - break; - } - - default: - break; - } } - - default: - break; } } @@ -445,9 +327,8 @@ inline void setDepthWrite(ramses::Appearance* appearance, const core::ValueHandl } inline void setDepthFunction(ramses::Appearance* appearance, const core::ValueHandle& valueHandle) { - assert(valueHandle.type() == raco::core::PrimitiveType::Int); - assert(valueHandle.asInt() >= 0 && valueHandle.asInt() < ramses::EDepthFunc_NUMBER_OF_ELEMENTS); - appearance->setDepthFunction(static_cast(valueHandle.asInt())); + auto ramsesDepthFunc = ramses_base::enumerationTranslationsDepthFunc.at(static_cast(valueHandle.asInt())); + appearance->setDepthFunction(ramsesDepthFunc); } inline ramses::EDepthWrite getDepthWriteMode(const ramses::Appearance* appearance) { @@ -458,24 +339,24 @@ inline ramses::EDepthWrite getDepthWriteMode(const ramses::Appearance* appearanc inline void setBlendMode(ramses::Appearance* appearance, const core::ValueHandle& options) { int colorOp = options.get("blendOperationColor").as(); - assert(colorOp >= 0 && colorOp < ramses::EBlendOperation_NUMBER_OF_ELEMENTS); + auto ramsesColorOp = ramses_base::enumerationTranslationsBlendOperation.at(static_cast(colorOp)); int alphaOp = options.get("blendOperationAlpha").as(); - assert(alphaOp >= 0 && alphaOp < ramses::EBlendOperation_NUMBER_OF_ELEMENTS); - appearance->setBlendingOperations(static_cast(colorOp), static_cast(alphaOp)); + auto ramsesAlphaOp = ramses_base::enumerationTranslationsBlendOperation.at(static_cast(alphaOp)); + appearance->setBlendingOperations(ramsesColorOp, ramsesAlphaOp); int srcColor = options.get("blendFactorSrcColor").as(); - assert(srcColor >= 0 && srcColor < ramses::EBlendFactor_NUMBER_OF_ELEMENTS); + auto ramsesSrcColor = ramses_base::enumerationTranslationsBlendFactor.at(static_cast(srcColor)); + int destColor = options.get("blendFactorDestColor").as(); - assert(destColor >= 0 && destColor < ramses::EBlendFactor_NUMBER_OF_ELEMENTS); + auto ramsesDestColor = ramses_base::enumerationTranslationsBlendFactor.at(static_cast(destColor)); + int srcAlpha = options.get("blendFactorSrcAlpha").as(); - assert(srcAlpha >= 0 && srcAlpha < ramses::EBlendFactor_NUMBER_OF_ELEMENTS); + auto ramsesSrcAlpha = ramses_base::enumerationTranslationsBlendFactor.at(static_cast(srcAlpha)); + int destAlpha = options.get("blendFactorDestAlpha").as(); - assert(destAlpha >= 0 && destAlpha < ramses::EBlendFactor_NUMBER_OF_ELEMENTS); - appearance->setBlendingFactors( - static_cast(srcColor), - static_cast(destColor), - static_cast(srcAlpha), - static_cast(destAlpha)); + auto ramsesDestAlpha = ramses_base::enumerationTranslationsBlendFactor.at(static_cast(destAlpha)); + + appearance->setBlendingFactors(ramsesSrcColor, ramsesDestColor, ramsesSrcAlpha, ramsesDestAlpha); } inline void setBlendColor(ramses::Appearance* appearance, const core::ValueHandle& color) { @@ -487,9 +368,8 @@ inline void setBlendColor(ramses::Appearance* appearance, const core::ValueHandl } inline void setCullMode(ramses::Appearance* appearance, const core::ValueHandle& valueHandle) { - assert(valueHandle.type() == raco::core::PrimitiveType::Int); - assert(valueHandle.asInt() >= 0 && valueHandle.asInt() < ramses::ECullMode::ECullMode_NUMBER_OF_ELEMENTS); - appearance->setCullingMode(static_cast(valueHandle.asInt())); + auto ramsesCullMode = ramses_base::enumerationTranslationsCullMode.at(static_cast(valueHandle.asInt())); + appearance->setCullingMode(ramsesCullMode); } inline bool isArrayOfStructs(const rlogic::Property& property) { diff --git a/components/libRamsesBase/include/ramses_base/CoreInterfaceImpl.h b/components/libRamsesBase/include/ramses_base/CoreInterfaceImpl.h index 34dad6dc..8a2e0426 100644 --- a/components/libRamsesBase/include/ramses_base/CoreInterfaceImpl.h +++ b/components/libRamsesBase/include/ramses_base/CoreInterfaceImpl.h @@ -27,7 +27,6 @@ class CoreInterfaceImpl final : public raco::core::EngineInterface { bool parseLuaInterface(const std::string& interfaceText, const std::vector& stdModules, const raco::data_storage::Table& modules, bool useModules, PropertyInterfaceList& outInputs, std::string& outError) override; bool parseLuaScriptModule(raco::core::SEditorObject object, const std::string& luaScriptModule, const std::string& moduleName, const std::vector& stdModules, std::string& outError) override; bool extractLuaDependencies(const std::string& luaScript, std::vector& moduleList, std::string& outError) override; - const std::map& enumerationDescription(raco::core::EngineEnumeration type) const override; std::string luaNameForPrimitiveType(raco::core::EnginePrimitive engineType) const override; void removeModuleFromCache(raco::core::SCEditorObject object) override; diff --git a/components/libRamsesBase/include/ramses_base/EnumerationTranslations.h b/components/libRamsesBase/include/ramses_base/EnumerationTranslations.h new file mode 100644 index 00000000..704f752e --- /dev/null +++ b/components/libRamsesBase/include/ramses_base/EnumerationTranslations.h @@ -0,0 +1,37 @@ +/* + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of Ramses Composer + * (see https://github.com/bmwcarit/ramses-composer). + * + * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + * If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include "user_types/Enumerations.h" + +#include +#include + +#include +#include + +namespace raco::ramses_base { +extern std::map enumerationTranslationsCullMode; + +extern std::map enumerationTranslationsDepthFunc; + +extern std::map enumerationTranslationsBlendOperation; + +extern std::map enumerationTranslationsBlendFactor; + +extern std::map enumerationTranslationRenderBufferFormat; + +extern std::map enumerationTranslationTextureFormat; + +extern std::map enumerationTranslationTextureAddressMode; +extern std::map enumerationTranslationTextureSamplingMethod; + + +} // namespace raco::ramses_base diff --git a/components/libRamsesBase/include/ramses_base/Utils.h b/components/libRamsesBase/include/ramses_base/Utils.h index e9affce2..57e8856b 100644 --- a/components/libRamsesBase/include/ramses_base/Utils.h +++ b/components/libRamsesBase/include/ramses_base/Utils.h @@ -77,4 +77,9 @@ int clipAndCheckIntProperty(const raco::core::ValueHandle value, core::Errors* e ramses::ERenderBufferType ramsesRenderBufferTypeFromFormat(ramses::ERenderBufferFormat format); + +std::vector getRamsesUniformPropertyNames(core::ValueHandle uniformContainerHandle, const std::vector& propertyNames, size_t startIndex = 0); + +std::string getRamsesUniformPropertyName(core::ValueHandle uniformContainerHandle, core::ValueHandle uniformHandle); + }; // namespace raco::ramses_base diff --git a/components/libRamsesBase/src/ramses_adaptor/CubeMapAdaptor.cpp b/components/libRamsesBase/src/ramses_adaptor/CubeMapAdaptor.cpp index e714421d..0972b4d6 100644 --- a/components/libRamsesBase/src/ramses_adaptor/CubeMapAdaptor.cpp +++ b/components/libRamsesBase/src/ramses_adaptor/CubeMapAdaptor.cpp @@ -87,7 +87,8 @@ raco::ramses_base::RamsesTextureCube CubeMapAdaptor::createTexture(core::Errors* mipData["uriBack"].data())); } - auto selectedTextureFormat = static_cast((*editorObject()->textureFormat_)); + auto format = static_cast((*editorObject()->textureFormat_)); + auto ramsesFormat = ramses_base::enumerationTranslationTextureFormat.at(format); std::string infoText = "CubeMap information\n\n"; infoText.append(fmt::format("Width: {} px\n", decodingInfo.width)); @@ -100,7 +101,7 @@ raco::ramses_base::RamsesTextureCube CubeMapAdaptor::createTexture(core::Errors* errors->addError(core::ErrorCategory::GENERAL, core::ErrorLevel::INFORMATION, {editorObject()->shared_from_this()}, infoText); - return raco::ramses_base::ramsesTextureCube(sceneAdaptor_->scene(), selectedTextureFormat, decodingInfo.width, *editorObject()->mipmapLevel_, mipDatas.data(), *editorObject()->generateMipmaps_, {}, ramses::ResourceCacheFlag_DoNotCache); + return raco::ramses_base::ramsesTextureCube(sceneAdaptor_->scene(), ramsesFormat, decodingInfo.width, *editorObject()->mipmapLevel_, mipDatas.data(), *editorObject()->generateMipmaps_, {}, ramses::ResourceCacheFlag_DoNotCache); } raco::ramses_base::RamsesTextureCube CubeMapAdaptor::fallbackCube() { @@ -158,11 +159,24 @@ bool CubeMapAdaptor::sync(core::Errors* errors) { if (textureData_) { textureData_->setName(createDefaultTextureDataName().c_str()); + + auto wrapUMode = static_cast(*editorObject()->wrapUMode_); + auto ramsesWrapUMode = ramses_base::enumerationTranslationTextureAddressMode.at(wrapUMode); + + auto wrapVMode = static_cast(*editorObject()->wrapVMode_); + auto ramsesWrapVMode = ramses_base::enumerationTranslationTextureAddressMode.at(wrapVMode); + + auto minSamplMethod = static_cast(*editorObject()->minSamplingMethod_); + auto ramsesMinSamplMethod = ramses_base::enumerationTranslationTextureSamplingMethod.at(minSamplMethod); + + auto magSamplMethod = static_cast(*editorObject()->magSamplingMethod_); + auto ramsesMagSamplMethod = ramses_base::enumerationTranslationTextureSamplingMethod.at(magSamplMethod); + auto textureSampler = raco::ramses_base::ramsesTextureSampler(sceneAdaptor_->scene(), - static_cast(*editorObject()->wrapUMode_), - static_cast(*editorObject()->wrapVMode_), - static_cast(*editorObject()->minSamplingMethod_), - static_cast(*editorObject()->magSamplingMethod_), + ramsesWrapUMode, + ramsesWrapVMode, + ramsesMinSamplMethod, + ramsesMagSamplMethod, textureData_, (*editorObject()->anisotropy_ >= 1 ? *editorObject()->anisotropy_ : 1)); reset(std::move(textureSampler)); diff --git a/components/libRamsesBase/src/ramses_adaptor/LinkAdaptor.cpp b/components/libRamsesBase/src/ramses_adaptor/LinkAdaptor.cpp index 70b8c4d7..ffe5a14e 100644 --- a/components/libRamsesBase/src/ramses_adaptor/LinkAdaptor.cpp +++ b/components/libRamsesBase/src/ramses_adaptor/LinkAdaptor.cpp @@ -14,8 +14,9 @@ #include "core/Queries.h" #include "log_system/log.h" #include "ramses_adaptor/ObjectAdaptor.h" -#include "user_types/SyncTableWithEngineInterface.h" +#include "user_types/EngineTypeAnnotation.h" #include "user_types/LuaInterface.h" +#include "user_types/SyncTableWithEngineInterface.h" namespace raco::ramses_adaptor { @@ -67,7 +68,15 @@ std::optional followLinkChain(const core::Project& pro return prop; } -}// namespace +// Figure out if a data model property corresponds to a primitive type in the LogicEngine +bool isEnginePrimitive(const core::ValueHandle& prop) { + auto type = prop.type(); + return type != core::PrimitiveType::Table && + (type != core::PrimitiveType::Struct || + prop.isVec2f() || prop.isVec3f() || prop.isVec4f() || prop.isVec2i() || prop.isVec3i() || prop.isVec4i()); +} + +} // namespace LinkAdaptor::LinkAdaptor(const core::LinkDescriptor& link, SceneAdaptor* sceneAdaptor) : editorLink_{link}, sceneAdaptor_{sceneAdaptor} { connect(); @@ -78,35 +87,32 @@ void LinkAdaptor::lift() { engineLinks_.clear(); } -void LinkAdaptor::connectHelper(const core::PropertyDescriptor& start, const rlogic::Property& endEngineProp, bool isWeak) { - core::ValueHandle startHandle(start); - - auto engineType = endEngineProp.getType(); - if (engineType == rlogic::EPropertyType::Struct || engineType == rlogic::EPropertyType::Array) { - for (size_t index = 0; index < endEngineProp.getChildCount(); index++) { - auto endChild = endEngineProp.getChild(index); - std::string propName = user_types::dataModelPropNameForLogicEnginePropName(std::string(endChild->getName()), index); - connectHelper(start.child(propName), *endChild, isWeak); +void LinkAdaptor::connectHelper(const core::ValueHandle& start, const core::ValueHandle& end, bool isWeak) { + if (!isEnginePrimitive(end)) { + for (size_t index = 0; index < end.size(); index++) { + auto endChild = end[index]; + connectHelper(start.get(endChild.getPropName()), endChild, isWeak); } } else { - std::optional startPropOpt = start; + std::optional startPropOpt = start.getDescriptor(); if (sceneAdaptor_->optimizeForExport()) { - startPropOpt = followLinkChain(sceneAdaptor_->project(), start); + startPropOpt = followLinkChain(sceneAdaptor_->project(), start.getDescriptor()); } if (startPropOpt) { auto startProp = startPropOpt.value(); - auto startAdaptor(sceneAdaptor_->lookupAdaptor(startProp.object())); - if (startAdaptor) { - auto startEngineProp = dynamic_cast(startAdaptor)->getProperty(startProp.propertyNames()); - if (startEngineProp) { - auto engineLink = createEngineLink(&sceneAdaptor_->logicEngine(), *startEngineProp, endEngineProp, isWeak); - if (engineLink) { - engineLinks_.emplace_back(std::move(engineLink)); + if (auto startAdaptor = sceneAdaptor_->lookupAdaptor(startProp.object())) { + if (auto startEngineProp = dynamic_cast(startAdaptor)->getProperty(startProp.propertyNames())) { + if (auto endAdaptor = sceneAdaptor_->lookupAdaptor(editorLink_.end.object())) { + if (auto endEngineProp = dynamic_cast(endAdaptor)->getProperty(end.getPropertyNamesVector())) { + if (auto engineLink = createEngineLink(&sceneAdaptor_->logicEngine(), *startEngineProp, *endEngineProp, isWeak)) { + engineLinks_.emplace_back(std::move(engineLink)); + } + } } } } } - } + } } void LinkAdaptor::connect() { @@ -117,24 +123,30 @@ void LinkAdaptor::connect() { return; } - auto destAdaptor{sceneAdaptor_->lookupAdaptor(editorLink_.end.object())}; + if (editorLink_.isValid) { + connectHelper(core::ValueHandle(editorLink_.start), core::ValueHandle(editorLink_.end), editorLink_.isWeak); + } +} - if (editorLink_.isValid && destAdaptor) { - auto endEngineProp = dynamic_cast(destAdaptor)->getProperty(editorLink_.end.propertyNames()); - if (endEngineProp) { - connectHelper(editorLink_.start, *endEngineProp, editorLink_.isWeak); +void LinkAdaptor::readFromEngineRecursive(core::DataChangeRecorder& recorder, const core::ValueHandle& property) { + if (property) { + if (!isEnginePrimitive(property)) { + for (size_t index = 0; index < property.size(); index++) { + readFromEngineRecursive(recorder, property[index]); + } + } else { + if (auto adaptor = sceneAdaptor_->lookupAdaptor(property.rootObject())) { + if (auto engineProp = dynamic_cast(adaptor)->getProperty(property.getPropertyNamesVector())) { + getOutputFromEngine(*engineProp, property, recorder); + } + } } } } void LinkAdaptor::readDataFromEngine(core::DataChangeRecorder& recorder) { - auto destAdaptor{sceneAdaptor_->lookupAdaptor(editorLink_.end.object())}; - raco::core::ValueHandle destHandle{editorLink_.end}; - if (destAdaptor && destHandle && editorLink_.isValid) { - auto endProp = dynamic_cast(destAdaptor)->getProperty(editorLink_.end.propertyNames()); - if (endProp) { - getOutputFromEngine(*endProp, destHandle, recorder); - } + if (editorLink_.isValid) { + readFromEngineRecursive(recorder, core::ValueHandle(editorLink_.end)); } } diff --git a/components/libRamsesBase/src/ramses_adaptor/LuaInterfaceAdaptor.cpp b/components/libRamsesBase/src/ramses_adaptor/LuaInterfaceAdaptor.cpp index 64703404..73740cf3 100644 --- a/components/libRamsesBase/src/ramses_adaptor/LuaInterfaceAdaptor.cpp +++ b/components/libRamsesBase/src/ramses_adaptor/LuaInterfaceAdaptor.cpp @@ -132,6 +132,9 @@ bool LuaInterfaceAdaptor::sync(core::Errors* errors) { if (sceneAdaptor_->featureLevel() >= 5) { std::vector modules; auto luaConfig = raco::ramses_base::createLuaConfig(editorObject_->stdModules_->activeModules()); + if (!sceneAdaptor_->optimizeForExport()) { + luaConfig.enableDebugLogFunctions(); + } const auto& moduleDeps = editorObject_->luaModules_.asTable(); for (auto i = 0; i < moduleDeps.size(); ++i) { if (auto moduleRef = moduleDeps.get(i)->asRef()) { diff --git a/components/libRamsesBase/src/ramses_adaptor/LuaScriptAdaptor.cpp b/components/libRamsesBase/src/ramses_adaptor/LuaScriptAdaptor.cpp index e2c60849..e16b751b 100644 --- a/components/libRamsesBase/src/ramses_adaptor/LuaScriptAdaptor.cpp +++ b/components/libRamsesBase/src/ramses_adaptor/LuaScriptAdaptor.cpp @@ -94,6 +94,9 @@ bool LuaScriptAdaptor::sync(core::Errors* errors) { if (!scriptContent.empty()) { std::vector modules; auto luaConfig = raco::ramses_base::createLuaConfig(editorObject_->stdModules_->activeModules()); + if (!sceneAdaptor_->optimizeForExport()) { + luaConfig.enableDebugLogFunctions(); + } const auto& moduleDeps = editorObject_->luaModules_.asTable(); for (auto i = 0; i < moduleDeps.size(); ++i) { if (auto moduleRef = moduleDeps.get(i)->asRef()) { diff --git a/components/libRamsesBase/src/ramses_adaptor/LuaScriptModuleAdaptor.cpp b/components/libRamsesBase/src/ramses_adaptor/LuaScriptModuleAdaptor.cpp index 1c1a53d7..bb347afc 100644 --- a/components/libRamsesBase/src/ramses_adaptor/LuaScriptModuleAdaptor.cpp +++ b/components/libRamsesBase/src/ramses_adaptor/LuaScriptModuleAdaptor.cpp @@ -36,6 +36,9 @@ bool LuaScriptModuleAdaptor::sync(core::Errors* errors) { if (editorObject_->isValid()) { const auto& scriptContents = editorObject_->currentScriptContents(); auto luaConfig = raco::ramses_base::createLuaConfig(editorObject_->stdModules_->activeModules()); + if (!sceneAdaptor_->optimizeForExport()) { + luaConfig.enableDebugLogFunctions(); + } module_ = raco::ramses_base::ramsesLuaModule(scriptContents, &sceneAdaptor_->logicEngine(), luaConfig, editorObject_->objectName(), editorObject_->objectIDAsRamsesLogicID()); assert(module_ != nullptr); } else { diff --git a/components/libRamsesBase/src/ramses_adaptor/MaterialAdaptor.cpp b/components/libRamsesBase/src/ramses_adaptor/MaterialAdaptor.cpp index a7271277..fcaf0a98 100644 --- a/components/libRamsesBase/src/ramses_adaptor/MaterialAdaptor.cpp +++ b/components/libRamsesBase/src/ramses_adaptor/MaterialAdaptor.cpp @@ -16,14 +16,16 @@ #include "ramses_adaptor/RenderBufferAdaptor.h" #include "ramses_adaptor/RenderBufferMSAdaptor.h" #include "ramses_adaptor/SceneAdaptor.h" -#include "ramses_adaptor/TextureSamplerAdaptor.h" #include "ramses_adaptor/TextureExternalAdaptor.h" +#include "ramses_adaptor/TextureSamplerAdaptor.h" #include "ramses_base/Utils.h" -#include "user_types/EngineTypeAnnotation.h" #include "user_types/Material.h" #include "user_types/RenderBuffer.h" #include "user_types/RenderBufferMS.h" #include "utils/FileUtils.h" +#include "ramses_base/Utils.h" + +#include "user_types/EngineTypeAnnotation.h" namespace raco::ramses_adaptor { @@ -109,7 +111,8 @@ void MaterialAdaptor::getLogicNodes(std::vector& logicNodes) const rlogic::Property* MaterialAdaptor::getProperty(const std::vector& names) { if (appearanceBinding_ && names.size() > 1 && names[0] == "uniforms") { - return ILogicPropertyProvider::getPropertyRecursive(appearanceBinding_->getInputs(), names, 1); + auto ramsesPropNames = ramses_base::getRamsesUniformPropertyNames(core::ValueHandle(editorObject(), &raco::user_types::Material::uniforms_), names, 1); + return ILogicPropertyProvider::getPropertyRecursive(appearanceBinding_->getInputs(), ramsesPropNames, 0); } return nullptr; } @@ -138,16 +141,236 @@ std::vector MaterialAdaptor::getExportInformation() const { return result; } +template +std::vector flattenUniformArrayOfVector(const core::ValueHandle& handle, int numComponents) { + std::vector values; + for (size_t index = 0; index < handle.size(); index++) { + for (size_t component = 0; component < numComponents; component++) { + values.emplace_back(handle[index][component].as()); + } + } + return values; +} + +inline void setUniform(core::Errors* errors, SceneAdaptor* sceneAdaptor, ramses::Appearance* appearance, const core::ValueHandle& valueHandle, + const std::string& uniformEngineName, + std::vector newSamplers, + std::vector newSamplersMS, + std::vector newSamplersExternal) { + + ramses::UniformInput input; + appearance->getEffect().findUniformInput(uniformEngineName.c_str(), input); + + auto engineTypeAnno = valueHandle.query(); + switch (engineTypeAnno->type()) { + case core::EnginePrimitive::Double: + appearance->setInputValueFloat(input, valueHandle.as()); + break; + case core::EnginePrimitive::Int32: + case core::EnginePrimitive::UInt16: + case core::EnginePrimitive::UInt32: + appearance->setInputValueInt32(input, static_cast(valueHandle.as())); + break; + + case core::EnginePrimitive::Vec2f: + appearance->setInputValueVector2f(input, valueHandle[0].as(), valueHandle[1].as()); + break; + + case core::EnginePrimitive::Vec3f: + appearance->setInputValueVector3f(input, valueHandle[0].as(), valueHandle[1].as(), valueHandle[2].as()); + break; + + case core::EnginePrimitive::Vec4f: + appearance->setInputValueVector4f(input, valueHandle[0].as(), valueHandle[1].as(), valueHandle[2].as(), valueHandle[3].as()); + break; + + case core::EnginePrimitive::Vec2i: + appearance->setInputValueVector2i(input, static_cast(valueHandle[0].as()), static_cast(valueHandle[1].as())); + break; + + case core::EnginePrimitive::Vec3i: + appearance->setInputValueVector3i(input, static_cast(valueHandle[0].as()), static_cast(valueHandle[1].as()), static_cast(valueHandle[2].as())); + break; + + case core::EnginePrimitive::Vec4i: + appearance->setInputValueVector4i(input, static_cast(valueHandle[0].as()), static_cast(valueHandle[1].as()), static_cast(valueHandle[2].as()), static_cast(valueHandle[3].as())); + break; + + case core::EnginePrimitive::Array: { + assert(valueHandle.size() >= 1); + + auto elementAnno = valueHandle[0].query(); + switch (elementAnno->type()) { + case core::EnginePrimitive::Double: { + std::vector values; + for (size_t index = 0; index < valueHandle.size(); index++) { + values.emplace_back(valueHandle[index].as()); + } + appearance->setInputValueFloat(input, values.size(), values.data()); + break; + } + + case core::EnginePrimitive::Int32: + case core::EnginePrimitive::UInt16: + case core::EnginePrimitive::UInt32: { + std::vector values; + for (size_t index = 0; index < valueHandle.size(); index++) { + values.emplace_back(valueHandle[index].as()); + } + appearance->setInputValueInt32(input, values.size(), values.data()); + break; + } + + case core::EnginePrimitive::Vec2f: { + auto values{flattenUniformArrayOfVector(valueHandle, 2)}; + appearance->setInputValueVector2f(input, valueHandle.size(), values.data()); + break; + } + + case core::EnginePrimitive::Vec3f: { + auto values{flattenUniformArrayOfVector(valueHandle, 3)}; + appearance->setInputValueVector3f(input, valueHandle.size(), values.data()); + break; + } + + case core::EnginePrimitive::Vec4f: { + auto values{flattenUniformArrayOfVector(valueHandle, 4)}; + appearance->setInputValueVector4f(input, valueHandle.size(), values.data()); + break; + } + + case core::EnginePrimitive::Vec2i: { + auto values{flattenUniformArrayOfVector(valueHandle, 2)}; + appearance->setInputValueVector2i(input, valueHandle.size(), values.data()); + break; + } + + case core::EnginePrimitive::Vec3i: { + auto values{flattenUniformArrayOfVector(valueHandle, 3)}; + appearance->setInputValueVector3i(input, valueHandle.size(), values.data()); + break; + } + + case core::EnginePrimitive::Vec4i: { + auto values{flattenUniformArrayOfVector(valueHandle, 4)}; + appearance->setInputValueVector4i(input, valueHandle.size(), values.data()); + break; + } + + default: + break; + } + } break; + + case raco::core::EnginePrimitive::TextureSampler2DMS: { + if (auto buffer = valueHandle.asTypedRef()) { + if (auto adaptor = sceneAdaptor->lookup(buffer)) { + if (auto samplerMS = adaptor->getRamsesObjectPointer()) { + appearance->setInputTexture(input, *samplerMS); + newSamplersMS.emplace_back(samplerMS); + } else { + errors->addError(raco::core::ErrorCategory::GENERAL, raco::core::ErrorLevel::ERROR, valueHandle, "Sampler for this RenderBufferMS not available."); + } + } + } else { + errors->addError(raco::core::ErrorCategory::GENERAL, raco::core::ErrorLevel::ERROR, valueHandle, "RenderBufferMS needed for this uniform."); + } + } break; + + case raco::core::EnginePrimitive::TextureSamplerExternal: { + if (auto texture = valueHandle.asTypedRef()) { + if (auto adaptor = sceneAdaptor->lookup(texture)) { + if (auto sampler = adaptor->getRamsesObjectPointer()) { + appearance->setInputTexture(input, *sampler); + newSamplersExternal.emplace_back(sampler); + } else { + errors->addError(raco::core::ErrorCategory::GENERAL, raco::core::ErrorLevel::ERROR, valueHandle, "Sampler for this TextureExternal not available."); + } + } + } else { + errors->addError(raco::core::ErrorCategory::GENERAL, raco::core::ErrorLevel::ERROR, valueHandle, "TextureExternal needed for this uniform."); + } + } break; + + case raco::core::EnginePrimitive::TextureSampler2D: { + raco::ramses_base::RamsesTextureSampler sampler = nullptr; + if (auto texture = valueHandle.asTypedRef()) { + if (auto adaptor = sceneAdaptor->lookup(texture)) { + sampler = adaptor->getRamsesObjectPointer(); + } + } else if (auto buffer = valueHandle.asTypedRef()) { + if (auto adaptor = sceneAdaptor->lookup(buffer)) { + sampler = adaptor->getRamsesObjectPointer(); + if (!sampler) { + errors->addError(raco::core::ErrorCategory::GENERAL, raco::core::ErrorLevel::ERROR, valueHandle, "Sampler for this RenderBuffer not available."); + } + } + } else { + errors->addError(raco::core::ErrorCategory::GENERAL, raco::core::ErrorLevel::ERROR, valueHandle, "Texture or RenderBuffer needed for this uniform."); + } + if (sampler) { + appearance->setInputTexture(input, *sampler); + newSamplers.emplace_back(sampler); + } + } break; + + case raco::core::EnginePrimitive::TextureSamplerCube: { + if (auto texture = valueHandle.asTypedRef()) { + if (auto adaptor = sceneAdaptor->lookup(texture)) { + if (auto sampler = adaptor->getRamsesObjectPointer()) { + appearance->setInputTexture(input, *sampler); + newSamplers.emplace_back(sampler); + } + } + } else { + errors->addError(raco::core::ErrorCategory::GENERAL, raco::core::ErrorLevel::ERROR, valueHandle, "CubeMap needed for this uniform."); + } + } break; + + default: + break; + } +} + +inline void setUniformRecursive(core::Errors* errors, SceneAdaptor* sceneAdaptor, ramses::Appearance* appearance, const core::ValueHandle& uniformContainerHandle, const core::ValueHandle& handle, + std::vector newSamplers, + std::vector newSamplersMS, + std::vector newSamplersExternal) { + auto engineTypeAnno = handle.query(); + switch (engineTypeAnno->type()) { + case core::EnginePrimitive::Struct: + for (size_t index = 0; index < handle.size(); index++) { + setUniformRecursive(errors, sceneAdaptor, appearance, uniformContainerHandle, handle[index], newSamplers, newSamplersMS, newSamplersExternal); + } + break; + + case core::EnginePrimitive::Array: { + auto elementAnno = handle[0].query(); + if (elementAnno->type() == core::EnginePrimitive::Struct) { + for (size_t index = 0; index < handle.size(); index++) { + setUniformRecursive(errors, sceneAdaptor, appearance, uniformContainerHandle, handle[index], newSamplers, newSamplersMS, newSamplersExternal); + } + } else { + setUniform(errors, sceneAdaptor, appearance, handle, ramses_base::getRamsesUniformPropertyName(uniformContainerHandle, handle), newSamplers, newSamplersMS, newSamplersExternal); + } + + } break; + + default: + setUniform(errors, sceneAdaptor, appearance, handle, ramses_base::getRamsesUniformPropertyName(uniformContainerHandle, handle), newSamplers, newSamplersMS, newSamplersExternal); + } +} + void updateAppearance(core::Errors* errors, SceneAdaptor* sceneAdaptor, raco::ramses_base::RamsesAppearance appearance, const core::ValueHandle& optionsHandle, const core::ValueHandle& uniformsHandle) { - int colorOp = static_cast(optionsHandle.get("blendOperationColor").as()); - int alphaOp = static_cast(optionsHandle.get("blendOperationAlpha").as()); - if (colorOp == ramses::EBlendOperation::EBlendOperation_Disabled && alphaOp != ramses::EBlendOperation::EBlendOperation_Disabled) { + auto colorOp = static_cast(optionsHandle.get("blendOperationColor").as()); + auto alphaOp = static_cast(optionsHandle.get("blendOperationAlpha").as()); + if (colorOp == user_types::EBlendOperation::Disabled && alphaOp != user_types::EBlendOperation::Disabled) { errors->addError(raco::core::ErrorCategory::GENERAL, raco::core::ErrorLevel::ERROR, optionsHandle.get("blendOperationAlpha"), "Inconsistent Blend Operation settings: Color disabled while Alpha is not."); } else { errors->removeError(optionsHandle.get("blendOperationAlpha")); } - if (colorOp != ramses::EBlendOperation::EBlendOperation_Disabled && alphaOp == ramses::EBlendOperation::EBlendOperation_Disabled) { + if (colorOp != user_types::EBlendOperation::Disabled && alphaOp == user_types::EBlendOperation::Disabled) { errors->addError(raco::core::ErrorCategory::GENERAL, raco::core::ErrorLevel::ERROR, optionsHandle.get("blendOperationColor"), "Inconsistent Blend Operation settings: Alpha disabled while Color is not."); } else { @@ -165,77 +388,7 @@ void updateAppearance(core::Errors* errors, SceneAdaptor* sceneAdaptor, raco::ra std::vector newSamplersExternal; for (size_t i{0}; i < uniformsHandle.size(); i++) { - setUniform(appearance->get(), uniformsHandle[i]); - - if (uniformsHandle[i].type() == core::PrimitiveType::Ref) { - auto anno = uniformsHandle[i].query(); - auto engineType = anno->type(); - - if (engineType == raco::core::EnginePrimitive::TextureSampler2DMS) { - if (auto buffer = uniformsHandle[i].asTypedRef()) { - if (auto adaptor = sceneAdaptor->lookup(buffer)) { - if (auto samplerMS = adaptor->getRamsesObjectPointer()) { - ramses::UniformInput input; - (*appearance)->getEffect().findUniformInput(uniformsHandle[i].getPropName().c_str(), input); - (*appearance)->setInputTexture(input, *samplerMS); - newSamplersMS.emplace_back(samplerMS); - } else { - errors->addError(raco::core::ErrorCategory::GENERAL, raco::core::ErrorLevel::ERROR, uniformsHandle[i], "Sampler for this RenderBufferMS not available."); - } - } - } else { - errors->addError(raco::core::ErrorCategory::GENERAL, raco::core::ErrorLevel::ERROR, uniformsHandle[i], "RenderBufferMS needed for this uniform."); - } - } else if (engineType == raco::core::EnginePrimitive::TextureSamplerExternal) { - if (auto texture = uniformsHandle[i].asTypedRef()) { - if (auto adaptor = sceneAdaptor->lookup(texture)) { - if (auto sampler = adaptor->getRamsesObjectPointer()) { - ramses::UniformInput input; - (*appearance)->getEffect().findUniformInput(uniformsHandle[i].getPropName().c_str(), input); - (*appearance)->setInputTexture(input, *sampler); - newSamplersExternal.emplace_back(sampler); - } else { - errors->addError(raco::core::ErrorCategory::GENERAL, raco::core::ErrorLevel::ERROR, uniformsHandle[i], "Sampler for this TextureExternal not available."); - } - } - } else { - errors->addError(raco::core::ErrorCategory::GENERAL, raco::core::ErrorLevel::ERROR, uniformsHandle[i], "TextureExternal needed for this uniform."); - } - } else { - raco::ramses_base::RamsesTextureSampler sampler = nullptr; - if (engineType == raco::core::EnginePrimitive::TextureSampler2D) { - if (auto texture = uniformsHandle[i].asTypedRef()) { - if (auto adaptor = sceneAdaptor->lookup(texture)) { - sampler = adaptor->getRamsesObjectPointer(); - } - } else if (auto buffer = uniformsHandle[i].asTypedRef()) { - if (auto adaptor = sceneAdaptor->lookup(buffer)) { - sampler = adaptor->getRamsesObjectPointer(); - if (!sampler) { - errors->addError(raco::core::ErrorCategory::GENERAL, raco::core::ErrorLevel::ERROR, uniformsHandle[i], "Sampler for this RenderBuffer not available."); - } - } - } else { - errors->addError(raco::core::ErrorCategory::GENERAL, raco::core::ErrorLevel::ERROR, uniformsHandle[i], "Texture or RenderBuffer needed for this uniform."); - } - } else if (engineType == raco::core::EnginePrimitive::TextureSamplerCube) { - if (auto texture = uniformsHandle[i].asTypedRef()) { - if (auto adaptor = sceneAdaptor->lookup(texture)) { - sampler = adaptor->getRamsesObjectPointer(); - } - } else { - errors->addError(raco::core::ErrorCategory::GENERAL, raco::core::ErrorLevel::ERROR, uniformsHandle[i], "CubeMap needed for this uniform."); - } - } - - if (sampler) { - ramses::UniformInput input; - (*appearance)->getEffect().findUniformInput(uniformsHandle[i].getPropName().c_str(), input); - (*appearance)->setInputTexture(input, *sampler); - newSamplers.emplace_back(sampler); - } - } - } + setUniformRecursive(errors, sceneAdaptor, appearance->get(), uniformsHandle, uniformsHandle[i], newSamplers, newSamplersMS, newSamplersExternal); } appearance->replaceTrackedSamplers(newSamplers, newSamplersMS, newSamplersExternal); } diff --git a/components/libRamsesBase/src/ramses_adaptor/MeshNodeAdaptor.cpp b/components/libRamsesBase/src/ramses_adaptor/MeshNodeAdaptor.cpp index 4a7a53a1..10a6aa0b 100644 --- a/components/libRamsesBase/src/ramses_adaptor/MeshNodeAdaptor.cpp +++ b/components/libRamsesBase/src/ramses_adaptor/MeshNodeAdaptor.cpp @@ -222,7 +222,9 @@ const rlogic::Property* MeshNodeAdaptor::getProperty(const std::vector 1) { if (appearanceBinding_) { // Remove the first 3 nesting levels of the handle: materials/slot #/uniforms container: - return ILogicPropertyProvider::getPropertyRecursive(appearanceBinding_->getInputs(), names, 3); + core::ValueHandle uniformContainerHandle = editorObject()->getUniformContainerHandle(0); + auto ramsesPropNames = ramses_base::getRamsesUniformPropertyNames(uniformContainerHandle, names, 3); + return ILogicPropertyProvider::getPropertyRecursive(appearanceBinding_->getInputs(), ramsesPropNames, 0); } return nullptr; } diff --git a/components/libRamsesBase/src/ramses_adaptor/RenderBufferAdaptor.cpp b/components/libRamsesBase/src/ramses_adaptor/RenderBufferAdaptor.cpp index 186cfc0d..13fefbbf 100644 --- a/components/libRamsesBase/src/ramses_adaptor/RenderBufferAdaptor.cpp +++ b/components/libRamsesBase/src/ramses_adaptor/RenderBufferAdaptor.cpp @@ -9,9 +9,9 @@ */ #include "ramses_adaptor/RenderBufferAdaptor.h" +#include "core/BasicAnnotations.h" #include "ramses_base/RamsesHandles.h" #include "ramses_base/Utils.h" -#include "core/BasicAnnotations.h" namespace raco::ramses_adaptor { @@ -46,8 +46,9 @@ RenderBufferAdaptor::RenderBufferAdaptor(SceneAdaptor* sceneAdaptor, std::shared bool RenderBufferAdaptor::sync(core::Errors* errors) { buffer_.reset(); - ramses::ERenderBufferFormat format = static_cast(*editorObject()->format_); - ramses::ERenderBufferType type = raco::ramses_base::ramsesRenderBufferTypeFromFormat(format); + auto format = static_cast(*editorObject()->format_); + ramses::ERenderBufferFormat ramsesFormat = ramses_base::enumerationTranslationRenderBufferFormat.at(format); + ramses::ERenderBufferType type = raco::ramses_base::ramsesRenderBufferTypeFromFormat(ramsesFormat); bool allValid = true; uint32_t clippedWidth = raco::ramses_base::clipAndCheckIntProperty({editorObject_, &raco::user_types::RenderBuffer::width_}, errors, &allValid); @@ -57,7 +58,7 @@ bool RenderBufferAdaptor::sync(core::Errors* errors) { buffer_ = raco::ramses_base::ramsesRenderBuffer(sceneAdaptor_->scene(), clippedWidth, clippedHeight, type, - format, + ramsesFormat, ramses::ERenderBufferAccessMode_ReadWrite, 0U, (editorObject()->objectName() + "_Buffer").c_str()); @@ -67,14 +68,27 @@ bool RenderBufferAdaptor::sync(core::Errors* errors) { // For depth buffers, the UI does not display the sampler parameters - so force them to default. // Using depth buffers directly as textures is not recommended. ramses_base::RamsesTextureSampler textureSampler; + + auto wrapUMode = static_cast(*editorObject()->wrapUMode_); + auto ramsesWrapUMode = ramses_base::enumerationTranslationTextureAddressMode.at(wrapUMode); + + auto wrapVMode = static_cast(*editorObject()->wrapVMode_); + auto ramsesWrapVMode = ramses_base::enumerationTranslationTextureAddressMode.at(wrapVMode); + + auto minSamplMethod = static_cast(*editorObject()->minSamplingMethod_); + auto ramsesMinSamplMethod = ramses_base::enumerationTranslationTextureSamplingMethod.at(minSamplMethod); + + auto magSamplMethod = static_cast(*editorObject()->magSamplingMethod_); + auto ramsesMagSamplMethod = ramses_base::enumerationTranslationTextureSamplingMethod.at(magSamplMethod); + if (type == ramses::ERenderBufferType_Color) { textureSampler = ramses_base::ramsesTextureSampler(sceneAdaptor_->scene(), - static_cast(*editorObject()->wrapUMode_), - static_cast(*editorObject()->wrapVMode_), - static_cast(*editorObject()->minSamplingMethod_), - static_cast(*editorObject()->magSamplingMethod_), + ramsesWrapUMode, + ramsesWrapVMode, + ramsesMinSamplMethod, + ramsesMagSamplMethod, buffer_, - (*editorObject()->anisotropy_ >= 1 ? *editorObject()->anisotropy_ : 1)); + (*editorObject()->anisotropy_ >= 1 ? *editorObject()->anisotropy_ : 1)); } else { textureSampler = ramses_base::ramsesTextureSampler(sceneAdaptor_->scene(), ramses::ETextureAddressMode_Clamp, @@ -82,7 +96,7 @@ bool RenderBufferAdaptor::sync(core::Errors* errors) { ramses::ETextureSamplingMethod_Nearest, ramses::ETextureSamplingMethod_Nearest, buffer_, - 1); + 1); } reset(std::move(textureSampler)); diff --git a/components/libRamsesBase/src/ramses_adaptor/RenderBufferMSAdaptor.cpp b/components/libRamsesBase/src/ramses_adaptor/RenderBufferMSAdaptor.cpp index 12bafe9d..9e6e14fd 100644 --- a/components/libRamsesBase/src/ramses_adaptor/RenderBufferMSAdaptor.cpp +++ b/components/libRamsesBase/src/ramses_adaptor/RenderBufferMSAdaptor.cpp @@ -10,6 +10,7 @@ #include "ramses_adaptor/RenderBufferMSAdaptor.h" #include "ramses_base/RamsesHandles.h" +#include "ramses_base/EnumerationTranslations.h" #include "core/BasicAnnotations.h" namespace raco::ramses_adaptor { @@ -41,8 +42,9 @@ bool RenderBufferMSAdaptor::sync(core::Errors* errors) { return true; } - ramses::ERenderBufferFormat format = static_cast(*editorObject()->format_); - ramses::ERenderBufferType type = raco::ramses_base::ramsesRenderBufferTypeFromFormat(format); + auto format = static_cast(*editorObject()->format_); + ramses::ERenderBufferFormat ramsesFormat = ramses_base::enumerationTranslationRenderBufferFormat.at(format); + ramses::ERenderBufferType type = raco::ramses_base::ramsesRenderBufferTypeFromFormat(ramsesFormat); bool allValid = true; uint32_t clippedWidth = raco::ramses_base::clipAndCheckIntProperty({editorObject_, &raco::user_types::RenderBufferMS::width_}, errors, &allValid); @@ -52,7 +54,7 @@ bool RenderBufferMSAdaptor::sync(core::Errors* errors) { buffer_ = raco::ramses_base::ramsesRenderBuffer(sceneAdaptor_->scene(), clippedWidth, clippedHeight, type, - format, + ramsesFormat, ramses::ERenderBufferAccessMode_ReadWrite, sampleCount, (editorObject()->objectName() + "_BufferMS").c_str()); diff --git a/components/libRamsesBase/src/ramses_adaptor/SceneAdaptor.cpp b/components/libRamsesBase/src/ramses_adaptor/SceneAdaptor.cpp index f1129cbe..e0df860c 100644 --- a/components/libRamsesBase/src/ramses_adaptor/SceneAdaptor.cpp +++ b/components/libRamsesBase/src/ramses_adaptor/SceneAdaptor.cpp @@ -28,6 +28,7 @@ #include "user_types/BlitPass.h" #include "user_types/MeshNode.h" #include "user_types/Prefab.h" +#include "core/ProjectSettings.h" #include "user_types/RenderPass.h" #include @@ -137,8 +138,13 @@ ramses::sceneId_t SceneAdaptor::sceneId() { return scene_->getSceneId(); } +bool SceneAdaptor::needAdaptor(SEditorObject object) { + return !core::PrefabOperations::findContainingPrefab(object) && !object->isType(); +} + + void SceneAdaptor::createAdaptor(SEditorObject obj) { - if (!core::PrefabOperations::findContainingPrefab(obj)) { + if (needAdaptor(obj)) { auto adaptor = Factories::createAdaptor(this, obj); if (adaptor) { adaptor->tagDirty(); @@ -276,8 +282,8 @@ void SceneAdaptor::readDataFromEngine(core::DataChangeRecorder& recorder) { } } -void SceneAdaptor::createLink(const core::LinkDescriptor& link) { - newLinks_.emplace_back(link); +void SceneAdaptor::createLink(const core::LinkDescriptor& link) { + newLinks_.insert(link); } void SceneAdaptor::changeLinkValidity(const core::LinkDescriptor& link, bool isValid) { @@ -412,12 +418,17 @@ void SceneAdaptor::performBulkEngineUpdate(const core::SEditorObjectSet& changed auto adaptor = lookupAdaptor(object); bool haveAdaptor = adaptor != nullptr; - bool needAdaptor = !core::PrefabOperations::findContainingPrefab(object); - if (haveAdaptor != needAdaptor) { + if (haveAdaptor != needAdaptor(object)) { if (haveAdaptor) { + for (auto link : core::Queries::getLinksConnectedToObject(*project_, object, true, true)) { + removeLink(link->descriptor()); + } removeAdaptor(object); } else { createAdaptor(object); + for (auto link : core::Queries::getLinksConnectedToObject(*project_, object, true, true)) { + createLink(link->descriptor()); + } } } } diff --git a/components/libRamsesBase/src/ramses_adaptor/TextureExternalAdaptor.cpp b/components/libRamsesBase/src/ramses_adaptor/TextureExternalAdaptor.cpp index 9722de86..fccf4412 100644 --- a/components/libRamsesBase/src/ramses_adaptor/TextureExternalAdaptor.cpp +++ b/components/libRamsesBase/src/ramses_adaptor/TextureExternalAdaptor.cpp @@ -28,9 +28,13 @@ TextureExternalAdaptor::TextureExternalAdaptor(SceneAdaptor* sceneAdaptor, std:: } bool TextureExternalAdaptor::sync(core::Errors* errors) { - reset(ramsesTextureSamplerExternal(sceneAdaptor_->scene(), - static_cast(*editorObject()->minSamplingMethod_), - static_cast(*editorObject()->magSamplingMethod_))); + auto minSamplMethod = static_cast(*editorObject()->minSamplingMethod_); + auto ramsesMinSamplMethod = ramses_base::enumerationTranslationTextureSamplingMethod.at(minSamplMethod); + + auto magSamplMethod = static_cast(*editorObject()->magSamplingMethod_); + auto ramsesMagSamplMethod = ramses_base::enumerationTranslationTextureSamplingMethod.at(magSamplMethod); + + reset(ramsesTextureSamplerExternal(sceneAdaptor_->scene(), ramsesMinSamplMethod, ramsesMagSamplMethod)); tagDirty(false); return true; diff --git a/components/libRamsesBase/src/ramses_adaptor/TextureSamplerAdaptor.cpp b/components/libRamsesBase/src/ramses_adaptor/TextureSamplerAdaptor.cpp index 764e8ef8..6297796f 100644 --- a/components/libRamsesBase/src/ramses_adaptor/TextureSamplerAdaptor.cpp +++ b/components/libRamsesBase/src/ramses_adaptor/TextureSamplerAdaptor.cpp @@ -9,15 +9,15 @@ */ #include "ramses_adaptor/TextureSamplerAdaptor.h" #include "core/ErrorItem.h" -#include +#include "lodepng.h" #include "ramses_adaptor/SceneAdaptor.h" #include "ramses_base/RamsesHandles.h" -#include "user_types/Texture.h" #include "user_types/Enumerations.h" +#include "user_types/Texture.h" +#include "utils/FileUtils.h" #include #include -#include "lodepng.h" -#include "utils/FileUtils.h" +#include namespace raco::ramses_adaptor { @@ -25,7 +25,7 @@ using namespace raco::ramses_base; TextureSamplerAdaptor::TextureSamplerAdaptor(SceneAdaptor* sceneAdaptor, std::shared_ptr editorObject) : TypedObjectAdaptor(sceneAdaptor, editorObject, {}), - subscriptions_ {sceneAdaptor->dispatcher()->registerOn(core::ValueHandle{editorObject, &user_types::Texture::wrapUMode_}, [this]() { + subscriptions_{sceneAdaptor->dispatcher()->registerOn(core::ValueHandle{editorObject, &user_types::Texture::wrapUMode_}, [this]() { tagDirty(); }), sceneAdaptor->dispatcher()->registerOn(core::ValueHandle{editorObject, &user_types::Texture::wrapVMode_}, [this]() { @@ -75,7 +75,7 @@ bool TextureSamplerAdaptor::sync(core::Errors* errors) { if (!textureData_) { textureData_ = getFallbackTexture(); } else { - auto selectedTextureFormat = static_cast((*editorObject()->textureFormat_)); + auto selectedTextureFormat = static_cast((*editorObject()->textureFormat_)); std::string infoText = "Texture information\n\n"; infoText.append(fmt::format("Width: {} px\n", textureData_->getWidth())); @@ -90,11 +90,24 @@ bool TextureSamplerAdaptor::sync(core::Errors* errors) { if (textureData_) { textureData_->setName(createDefaultTextureDataName().c_str()); + + auto wrapUMode = static_cast(*editorObject()->wrapUMode_); + auto ramsesWrapUMode = ramses_base::enumerationTranslationTextureAddressMode.at(wrapUMode); + + auto wrapVMode = static_cast(*editorObject()->wrapVMode_); + auto ramsesWrapVMode = ramses_base::enumerationTranslationTextureAddressMode.at(wrapVMode); + + auto minSamplMethod = static_cast(*editorObject()->minSamplingMethod_); + auto ramsesMinSamplMethod = ramses_base::enumerationTranslationTextureSamplingMethod.at(minSamplMethod); + + auto magSamplMethod = static_cast(*editorObject()->magSamplingMethod_); + auto ramsesMagSamplMethod = ramses_base::enumerationTranslationTextureSamplingMethod.at(magSamplMethod); + auto textureSampler = ramsesTextureSampler(sceneAdaptor_->scene(), - static_cast(*editorObject()->wrapUMode_), - static_cast(*editorObject()->wrapVMode_), - static_cast(*editorObject()->minSamplingMethod_), - static_cast(*editorObject()->magSamplingMethod_), + ramsesWrapUMode, + ramsesWrapVMode, + ramsesMinSamplMethod, + ramsesMagSamplMethod, textureData_, (*editorObject()->anisotropy_ >= 1 ? *editorObject()->anisotropy_ : 1)); reset(std::move(textureSampler)); @@ -114,7 +127,8 @@ RamsesTexture2D TextureSamplerAdaptor::createTexture(core::Errors* errors, raco: std::vector> rawMipDatas; std::vector mipDatas; auto mipMapsOk = true; - auto selectedTextureFormat = static_cast((*editorObject()->textureFormat_)); + auto format = static_cast((*editorObject()->textureFormat_)); + auto ramsesFormat = ramses_base::enumerationTranslationTextureFormat.at(format); for (auto level = 1; level <= *editorObject()->mipmapLevel_; ++level) { auto uriPropName = (level > 1) ? fmt::format("level{}{}", level, "uri") : "uri"; @@ -136,12 +150,12 @@ RamsesTexture2D TextureSamplerAdaptor::createTexture(core::Errors* errors, raco: // PNG has top left origin. Flip it vertically if required to match U/V origin if (*editorObject()->flipTexture_) { - flipDecodedPicture(rawMipData, raco::ramses_base::ramsesTextureFormatToChannelAmount(selectedTextureFormat), decodingInfo.width * std::pow(0.5, i), decodingInfo.height * std::pow(0.5, i), decodingInfo.bitdepth); + flipDecodedPicture(rawMipData, raco::ramses_base::ramsesTextureFormatToChannelAmount(ramsesFormat), decodingInfo.width * std::pow(0.5, i), decodingInfo.height * std::pow(0.5, i), decodingInfo.bitdepth); } mipDatas.emplace_back(static_cast(rawMipData.size()), rawMipData.data()); } - return ramses_base::ramsesTexture2D(sceneAdaptor_->scene(), selectedTextureFormat, decodingInfo.width, decodingInfo.height, *editorObject()->mipmapLevel_, mipDatas.data(), *editorObject()->generateMipmaps_, {}, ramses::ResourceCacheFlag_DoNotCache, nullptr); + return ramses_base::ramsesTexture2D(sceneAdaptor_->scene(), ramsesFormat, decodingInfo.width, decodingInfo.height, *editorObject()->mipmapLevel_, mipDatas.data(), *editorObject()->generateMipmaps_, {}, ramses::ResourceCacheFlag_DoNotCache, nullptr); } RamsesTexture2D TextureSamplerAdaptor::getFallbackTexture() { diff --git a/components/libRamsesBase/src/ramses_base/CoreInterfaceImpl.cpp b/components/libRamsesBase/src/ramses_base/CoreInterfaceImpl.cpp index 51a739e8..58c1cd83 100644 --- a/components/libRamsesBase/src/ramses_base/CoreInterfaceImpl.cpp +++ b/components/libRamsesBase/src/ramses_base/CoreInterfaceImpl.cpp @@ -8,8 +8,6 @@ * If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "EnumerationDescriptions.h" - #include "data_storage/Table.h" #include "core/EditorObject.h" @@ -180,43 +178,6 @@ bool CoreInterfaceImpl::extractLuaDependencies(const std::string& luaScript, std return extractStatus; } -const std::map& CoreInterfaceImpl::enumerationDescription(raco::core::EngineEnumeration type) const { - switch (type) { - case raco::core::EngineEnumeration::CullMode: - return enumerationCullMode; - case raco::core::EngineEnumeration::BlendOperation: - return enumerationBlendOperation; - case raco::core::EngineEnumeration::BlendFactor: - return enumerationBlendFactor; - case raco::core::EngineEnumeration::DepthFunction: - return enumerationDepthFunction; - case raco::core::EngineEnumeration::TextureAddressMode: - return enumerationTextureAddressMode; - case raco::core::EngineEnumeration::TextureMinSamplingMethod: - return enumerationTextureMinSamplingMethod; - case raco::core::EngineEnumeration::TextureMagSamplingMethod: - return enumerationTextureMagSamplingMethod; - case raco::core::EngineEnumeration::TextureFormat: - return enumerationTextureFormat; - - case raco::core::EngineEnumeration::RenderBufferFormat: - return enumerationRenderBufferFormat; - - case raco::core::EngineEnumeration::RenderLayerOrder: - return raco::user_types::enumerationRenderLayerOrder; - - case raco::core::EngineEnumeration::RenderLayerMaterialFilterMode: - return raco::user_types::enumerationRenderLayerMaterialFilterMode; - - case raco::core::EngineEnumeration::FrustumType: - return raco::user_types::enumerationFrustumType; - - default: - assert(false); - return enumerationEmpty; - } -} - std::string CoreInterfaceImpl::luaNameForPrimitiveType(raco::core::EnginePrimitive engineType) const { static const std::unordered_map nameMap = {{raco::core::EnginePrimitive::Bool, "Bool"}, diff --git a/components/libRamsesBase/src/ramses_base/EnumerationDescriptions.h b/components/libRamsesBase/src/ramses_base/EnumerationDescriptions.h deleted file mode 100644 index 4699af73..00000000 --- a/components/libRamsesBase/src/ramses_base/EnumerationDescriptions.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - * SPDX-License-Identifier: MPL-2.0 - * - * This file is part of Ramses Composer - * (see https://github.com/bmwcarit/ramses-composer). - * - * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. - * If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -#pragma once - -#include -#include -#include - -#include - -namespace raco::ramses_base { -std::map enumerationEmpty; -std::map enumerationCullMode{ - {ramses::ECullMode_Disabled, "Disabled"}, - {ramses::ECullMode_FrontFacing, "Front"}, - {ramses::ECullMode_BackFacing, "Back"}, - {ramses::ECullMode_FrontAndBackFacing, "Front and Back"}}; -std::map enumerationBlendOperation{ - {ramses::EBlendOperation_Disabled, "Disabled"}, - {ramses::EBlendOperation_Add, "Add"}, - {ramses::EBlendOperation_Subtract, "Subtract"}, - {ramses::EBlendOperation_ReverseSubtract, "Reverse Subtract"}, - {ramses::EBlendOperation_Min, "Min"}, - {ramses::EBlendOperation_Max, "Max"}}; -std::map enumerationBlendFactor{ - {ramses::EBlendFactor_Zero, "Zero"}, - {ramses::EBlendFactor_One, "One"}, - {ramses::EBlendFactor_SrcAlpha, "Src Alpha"}, - {ramses::EBlendFactor_OneMinusSrcAlpha, "One minus Src Alpha"}, - {ramses::EBlendFactor_DstAlpha, "Dst Alpha"}, - {ramses::EBlendFactor_OneMinusDstAlpha, "One minus Dst Alpha"}, - {ramses::EBlendFactor_SrcColor, "Src Color"}, - {ramses::EBlendFactor_OneMinusSrcColor, "One minus Src Color"}, - {ramses::EBlendFactor_DstColor, "Dst Color"}, - {ramses::EBlendFactor_OneMinusDstColor, "One minus Dst Color"}, - {ramses::EBlendFactor_ConstColor, "Const Color"}, - {ramses::EBlendFactor_OneMinusConstColor, "One minus Const Color"}, - {ramses::EBlendFactor_ConstAlpha, "Const Alpha"}, - {ramses::EBlendFactor_OneMinusConstAlpha, "One minus Const Alpha"}, - {ramses::EBlendFactor_AlphaSaturate, "Alpha Saturated"}}; -std::map enumerationDepthFunction{ - {ramses::EDepthFunc_Disabled, "Disabled"}, - {ramses::EDepthFunc_Greater, ">"}, - {ramses::EDepthFunc_GreaterEqual, ">="}, - {ramses::EDepthFunc_Less, "<"}, - {ramses::EDepthFunc_LessEqual, "<="}, - {ramses::EDepthFunc_Equal, "="}, - {ramses::EDepthFunc_NotEqual, "!="}, - {ramses::EDepthFunc_Always, "true"}, - {ramses::EDepthFunc_Never, "false"}}; -std::map enumerationTextureAddressMode{ - {ramses::ETextureAddressMode_Clamp, "Clamp"}, - {ramses::ETextureAddressMode_Repeat, "Repeat"}, - {ramses::ETextureAddressMode_Mirror, "Mirror"}}; -std::map enumerationTextureMinSamplingMethod{ - {ramses::ETextureSamplingMethod_Nearest, "Nearest"}, - {ramses::ETextureSamplingMethod_Linear, "Linear"}, - {ramses::ETextureSamplingMethod_Nearest_MipMapNearest, "Nearest MipMapNearest"}, - {ramses::ETextureSamplingMethod_Nearest_MipMapLinear, "Nearest MipMapLinear"}, - {ramses::ETextureSamplingMethod_Linear_MipMapNearest, "Linear MipMapNearest"}, - {ramses::ETextureSamplingMethod_Linear_MipMapLinear, "Linear MipMapLinear"}}; -std::map enumerationTextureMagSamplingMethod{ - {ramses::ETextureSamplingMethod_Nearest, "Nearest"}, - {ramses::ETextureSamplingMethod_Linear, "Linear"}}; -std::map enumerationTextureFormat{ - // TODO: Enable disabled texture formats once we find a suitable workflow for them. - //{static_cast(ramses::ETextureFormat::Invalid), "Invalid"}, - {static_cast(ramses::ETextureFormat::R8), "R8"}, - {static_cast(ramses::ETextureFormat::RG8), "RG8"}, - {static_cast(ramses::ETextureFormat::RGB8), "RGB8"}, - //{static_cast(ramses::ETextureFormat::RGB565), "RGB565"}, - {static_cast(ramses::ETextureFormat::RGBA8), "RGBA8"}, - //{static_cast(ramses::ETextureFormat::RGBA4), "RGBA4"}, - //{static_cast(ramses::ETextureFormat::RGBA5551), "RGBA5551"}, - //{static_cast(ramses::ETextureFormat::ETC2RGB), "ETC2RGB"}, - //{static_cast(ramses::ETextureFormat::ETC2RGBA), "ETC2RGBA"}, - //{static_cast(ramses::ETextureFormat::R16F), "R16F"}, - //{static_cast(ramses::ETextureFormat::R32F), "R32F"}, - //{static_cast(ramses::ETextureFormat::RG16F), "RG16F"}, - //{static_cast(ramses::ETextureFormat::RG32F), "RG32F"}, - {static_cast(ramses::ETextureFormat::RGB16F), "RGB16F"}, - //{static_cast(ramses::ETextureFormat::RGB32F), "RGB32F"}, - {static_cast(ramses::ETextureFormat::RGBA16F), "RGBA16F"}, - //{static_cast(ramses::ETextureFormat::RGBA32F), "RGBA32F"}, - {static_cast(ramses::ETextureFormat::SRGB8), "SRGB8"}, - {static_cast(ramses::ETextureFormat::SRGB8_ALPHA8), "SRGB8_ALPHA8"}, - //{static_cast(ramses::ETextureFormat::ASTC_RGBA_4x4), "ASTC_RGBA_4x4"}, - //{static_cast(ramses::ETextureFormat::ASTC_RGBA_5x4), "ASTC_RGBA_5x4"}, - //{static_cast(ramses::ETextureFormat::ASTC_RGBA_5x5), "ASTC_RGBA_5x5"}, - //{static_cast(ramses::ETextureFormat::ASTC_RGBA_6x5), "ASTC_RGBA_6x5"}, - //{static_cast(ramses::ETextureFormat::ASTC_RGBA_6x6), "ASTC_RGBA_6x6"}, - //{static_cast(ramses::ETextureFormat::ASTC_RGBA_8x5), "ASTC_RGBA_8x5"}, - //{static_cast(ramses::ETextureFormat::ASTC_RGBA_8x6), "ASTC_RGBA_8x6"}, - //{static_cast(ramses::ETextureFormat::ASTC_RGBA_8x8), "ASTC_RGBA_8x8"}, - //{static_cast(ramses::ETextureFormat::ASTC_RGBA_10x5), "ASTC_RGBA_10x5"}, - //{static_cast(ramses::ETextureFormat::ASTC_RGBA_10x6), "ASTC_RGBA_10x6"}, - //{static_cast(ramses::ETextureFormat::ASTC_RGBA_10x8), "ASTC_RGBA_10x8"}, - //{static_cast(ramses::ETextureFormat::ASTC_RGBA_10x10), "ASTC_RGBA_10x10"}, - //{static_cast(ramses::ETextureFormat::ASTC_RGBA_12x10), "ASTC_RGBA_12x10"}, - //{static_cast(ramses::ETextureFormat::ASTC_RGBA_12x12), "ASTC_RGBA_12x12"}, - //{static_cast(ramses::ETextureFormat::ASTC_SRGBA_4x4), "ASTC_SRGBA_4x4"}, - //{static_cast(ramses::ETextureFormat::ASTC_SRGBA_5x4), "ASTC_SRGBA_5x4"}, - //{static_cast(ramses::ETextureFormat::ASTC_SRGBA_5x5), "ASTC_SRGBA_5x5"}, - //{static_cast(ramses::ETextureFormat::ASTC_SRGBA_6x5), "ASTC_SRGBA_6x5"}, - //{static_cast(ramses::ETextureFormat::ASTC_SRGBA_6x6), "ASTC_SRGBA_6x6"}, - //{static_cast(ramses::ETextureFormat::ASTC_SRGBA_8x5), "ASTC_SRGBA_8x5"}, - //{static_cast(ramses::ETextureFormat::ASTC_SRGBA_8x6), "ASTC_SRGBA_8x6"}, - //{static_cast(ramses::ETextureFormat::ASTC_SRGBA_8x8), "ASTC_SRGBA_8x8"}, - //{static_cast(ramses::ETextureFormat::ASTC_SRGBA_10x5), "ASTC_SRGBA_10x5"}, - //{static_cast(ramses::ETextureFormat::ASTC_SRGBA_10x6), "ASTC_SRGBA_10x6"}, - //{static_cast(ramses::ETextureFormat::ASTC_SRGBA_10x8), "ASTC_SRGBA_10x8"}, - //{static_cast(ramses::ETextureFormat::ASTC_SRGBA_10x10), "ASTC_SRGBA_10x10"}, - //{static_cast(ramses::ETextureFormat::ASTC_SRGBA_12x10), "ASTC_SRGBA_12x12"}, -}; - -std::map enumerationRenderBufferFormat{ - {static_cast(ramses::ERenderBufferFormat_RGBA4), "RGBA4"}, - {static_cast(ramses::ERenderBufferFormat_R8), "R8"}, - {static_cast(ramses::ERenderBufferFormat_RG8), "RG8"}, - {static_cast(ramses::ERenderBufferFormat_RGB8), "RGB8"}, - {static_cast(ramses::ERenderBufferFormat_RGBA8), "RGBA8"}, - {static_cast(ramses::ERenderBufferFormat_R16F), "R16F"}, - {static_cast(ramses::ERenderBufferFormat_R32F), "R32F"}, - {static_cast(ramses::ERenderBufferFormat_RG16F), "RG16F"}, - {static_cast(ramses::ERenderBufferFormat_RG32F), "RG32F"}, - {static_cast(ramses::ERenderBufferFormat_RGB16F), "RGB16F"}, - {static_cast(ramses::ERenderBufferFormat_RGB32F), "RGB32F"}, - {static_cast(ramses::ERenderBufferFormat_RGBA16F), "RGBA16F"}, - {static_cast(ramses::ERenderBufferFormat_RGBA32F), "RGBA32F"}, - - {static_cast(ramses::ERenderBufferFormat_Depth24), "Depth24"}, - {static_cast(ramses::ERenderBufferFormat_Depth24_Stencil8), "Depth24_Stencil8"} -}; - -} // namespace raco::ramses_base \ No newline at end of file diff --git a/components/libRamsesBase/src/ramses_base/EnumerationTranslations.cpp b/components/libRamsesBase/src/ramses_base/EnumerationTranslations.cpp new file mode 100644 index 00000000..347291ee --- /dev/null +++ b/components/libRamsesBase/src/ramses_base/EnumerationTranslations.cpp @@ -0,0 +1,97 @@ +/* + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of Ramses Composer + * (see https://github.com/bmwcarit/ramses-composer). + * + * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + * If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "ramses_base/EnumerationTranslations.h" + +namespace raco::ramses_base { +std::map enumerationTranslationsCullMode{ + {user_types::ECullMode::Disabled, ramses::ECullMode_Disabled}, + {user_types::ECullMode::FrontFacing, ramses::ECullMode_FrontFacing}, + {user_types::ECullMode::BackFacing, ramses::ECullMode_BackFacing}, + {user_types::ECullMode::FrontAndBackFacing, ramses::ECullMode_FrontAndBackFacing}}; + +std::map enumerationTranslationsBlendOperation{ + {user_types::EBlendOperation::Disabled, ramses::EBlendOperation_Disabled}, + {user_types::EBlendOperation::Add, ramses::EBlendOperation_Add}, + {user_types::EBlendOperation::Subtract, ramses::EBlendOperation_Subtract}, + {user_types::EBlendOperation::ReverseSubtract, ramses::EBlendOperation_ReverseSubtract}, + {user_types::EBlendOperation::Min, ramses::EBlendOperation_Min}, + {user_types::EBlendOperation::Max, ramses::EBlendOperation_Max}}; + +std::map enumerationTranslationsBlendFactor{ + {user_types::EBlendFactor::Zero, ramses::EBlendFactor_Zero}, + {user_types::EBlendFactor::One, ramses::EBlendFactor_One}, + {user_types::EBlendFactor::SrcAlpha, ramses::EBlendFactor_SrcAlpha}, + {user_types::EBlendFactor::OneMinusSrcAlpha, ramses::EBlendFactor_OneMinusSrcAlpha}, + {user_types::EBlendFactor::DstAlpha, ramses::EBlendFactor_DstAlpha}, + {user_types::EBlendFactor::OneMinusDstAlpha, ramses::EBlendFactor_OneMinusDstAlpha}, + {user_types::EBlendFactor::SrcColor, ramses::EBlendFactor_SrcColor}, + {user_types::EBlendFactor::OneMinusSrcColor, ramses::EBlendFactor_OneMinusSrcColor}, + {user_types::EBlendFactor::DstColor, ramses::EBlendFactor_DstColor}, + {user_types::EBlendFactor::OneMinusDstColor, ramses::EBlendFactor_OneMinusDstColor}, + {user_types::EBlendFactor::ConstColor, ramses::EBlendFactor_ConstColor}, + {user_types::EBlendFactor::OneMinusConstColor, ramses::EBlendFactor_OneMinusConstColor}, + {user_types::EBlendFactor::ConstAlpha, ramses::EBlendFactor_ConstAlpha}, + {user_types::EBlendFactor::OneMinusConstAlpha, ramses::EBlendFactor_OneMinusConstAlpha}, + {user_types::EBlendFactor::AlphaSaturate, ramses::EBlendFactor_AlphaSaturate}}; + +std::map enumerationTranslationsDepthFunc{ + {user_types::EDepthFunc::Disabled, ramses::EDepthFunc_Disabled}, + {user_types::EDepthFunc::Greater, ramses::EDepthFunc_Greater}, + {user_types::EDepthFunc::GreaterEqual, ramses::EDepthFunc_GreaterEqual}, + {user_types::EDepthFunc::Less, ramses::EDepthFunc_Less}, + {user_types::EDepthFunc::LessEqual, ramses::EDepthFunc_LessEqual}, + {user_types::EDepthFunc::Equal, ramses::EDepthFunc_Equal}, + {user_types::EDepthFunc::NotEqual, ramses::EDepthFunc_NotEqual}, + {user_types::EDepthFunc::Always, ramses::EDepthFunc_Always}, + {user_types::EDepthFunc::Never, ramses::EDepthFunc_Never}}; + +std::map enumerationTranslationTextureAddressMode{ + {user_types::ETextureAddressMode::Clamp, ramses::ETextureAddressMode_Clamp}, + {user_types::ETextureAddressMode::Repeat, ramses::ETextureAddressMode_Repeat}, + {user_types::ETextureAddressMode::Mirror, ramses::ETextureAddressMode_Mirror}}; + +std::map enumerationTranslationTextureSamplingMethod{ + {user_types::ETextureSamplingMethod::Nearest, ramses::ETextureSamplingMethod_Nearest}, + {user_types::ETextureSamplingMethod::Linear, ramses::ETextureSamplingMethod_Linear}, + {user_types::ETextureSamplingMethod::Nearest_MipMapNearest, ramses::ETextureSamplingMethod_Nearest_MipMapNearest}, + {user_types::ETextureSamplingMethod::Nearest_MipMapLinear, ramses::ETextureSamplingMethod_Nearest_MipMapLinear}, + {user_types::ETextureSamplingMethod::Linear_MipMapNearest, ramses::ETextureSamplingMethod_Linear_MipMapNearest}, + {user_types::ETextureSamplingMethod::Linear_MipMapLinear, ramses::ETextureSamplingMethod_Linear_MipMapLinear}}; + +std::map enumerationTranslationTextureFormat{ + {user_types::ETextureFormat::R8, ramses::ETextureFormat::R8}, + {user_types::ETextureFormat::RG8, ramses::ETextureFormat::RG8}, + {user_types::ETextureFormat::RGB8, ramses::ETextureFormat::RGB8}, + {user_types::ETextureFormat::RGBA8, ramses::ETextureFormat::RGBA8}, + {user_types::ETextureFormat::RGB16F, ramses::ETextureFormat::RGB16F}, + {user_types::ETextureFormat::RGBA16F, ramses::ETextureFormat::RGBA16F}, + {user_types::ETextureFormat::SRGB8, ramses::ETextureFormat::SRGB8}, + {user_types::ETextureFormat::SRGB8_ALPHA8, ramses::ETextureFormat::SRGB8_ALPHA8}}; + +std::map enumerationTranslationRenderBufferFormat{ + {user_types::ERenderBufferFormat::RGBA4, ramses::ERenderBufferFormat_RGBA4}, + {user_types::ERenderBufferFormat::R8, ramses::ERenderBufferFormat_R8}, + {user_types::ERenderBufferFormat::RG8, ramses::ERenderBufferFormat_RG8}, + {user_types::ERenderBufferFormat::RGB8, ramses::ERenderBufferFormat_RGB8}, + {user_types::ERenderBufferFormat::RGBA8, ramses::ERenderBufferFormat_RGBA8}, + {user_types::ERenderBufferFormat::R16F, ramses::ERenderBufferFormat_R16F}, + {user_types::ERenderBufferFormat::R32F, ramses::ERenderBufferFormat_R32F}, + {user_types::ERenderBufferFormat::RG16F, ramses::ERenderBufferFormat_RG16F}, + {user_types::ERenderBufferFormat::RG32F, ramses::ERenderBufferFormat_RG32F}, + {user_types::ERenderBufferFormat::RGB16F, ramses::ERenderBufferFormat_RGB16F}, + {user_types::ERenderBufferFormat::RGB32F, ramses::ERenderBufferFormat_RGB32F}, + {user_types::ERenderBufferFormat::RGBA16F, ramses::ERenderBufferFormat_RGBA16F}, + {user_types::ERenderBufferFormat::RGBA32F, ramses::ERenderBufferFormat_RGBA32F}, + + {user_types::ERenderBufferFormat::Depth24, ramses::ERenderBufferFormat_Depth24}, + {user_types::ERenderBufferFormat::Depth24_Stencil8, ramses::ERenderBufferFormat_Depth24_Stencil8}}; + +} // namespace raco::ramses_base diff --git a/components/libRamsesBase/src/ramses_base/Utils.cpp b/components/libRamsesBase/src/ramses_base/Utils.cpp index 8158a44b..c6fef59d 100644 --- a/components/libRamsesBase/src/ramses_base/Utils.cpp +++ b/components/libRamsesBase/src/ramses_base/Utils.cpp @@ -13,19 +13,22 @@ #include "lodepng.h" #include "ramses_base/LogicEngine.h" #include "ramses_base/RamsesHandles.h" +#include "ramses_base/EnumerationTranslations.h" #include "user_types/CubeMap.h" +#include "user_types/EngineTypeAnnotation.h" #include "user_types/LuaScriptModule.h" #include "utils/FileUtils.h" #include "utils/MathUtils.h" #include "core/CoreFormatter.h" - #include #include #include #include #include #include + #include +#include namespace { @@ -207,6 +210,108 @@ std::unique_ptr createEffectDescription(const std::st return description; } + +std::vector getRamsesUniformPropertyNames(core::ValueHandle uniformContainerHandle, const std::vector &propertyNames, size_t startIndex) { + std::string propName; + core::ValueHandle handle = uniformContainerHandle; + for (size_t index = startIndex; index < propertyNames.size(); index++) { + auto currentName = propertyNames[index]; + handle = handle.get(currentName); + auto engineTypeAnno = handle.query(); + switch (engineTypeAnno->type()) { + case core::EnginePrimitive::Struct: + // ramses uniform name: struct.member + propName += fmt::format("{}.", currentName); + break; + + case core::EnginePrimitive::Array: { + auto elementAnno = handle[0].query(); + if (elementAnno->type() == core::EnginePrimitive::Struct) { + // array of struct: + // ramses uniform name: array[index].member + ++index; + assert(index < propertyNames.size()); + auto arrayIndex = std::stoi(propertyNames[index]) - 1; + handle = handle[arrayIndex]; + propName += fmt::format("{}[{}].", currentName, arrayIndex); + } else { + // note: array of array is not possible so this must be a primitive type + // propertyNames may or may not include the index into the array as final element, + // so we need to handle both cases here: + propName += currentName; + if (index == propertyNames.size() - 1) { + return {propName}; + } else { + assert(index == propertyNames.size() - 2); + return {propName, propertyNames[index + 1]}; + } + } + } break; + default: + propName += currentName; + } + } + return {propName}; +} + +std::string getRamsesUniformPropertyName(core::ValueHandle uniformContainerHandle, core::ValueHandle uniformHandle) { + return getRamsesUniformPropertyNames(uniformContainerHandle, uniformHandle.getPropertyNamesVector(), uniformContainerHandle.depth())[0]; +} + +void buildUniformRecursive(std::string uniformName, raco::core::PropertyInterfaceList &uniforms, raco::core::EnginePrimitive type, uint32_t elementCount, std::string& outError) { + auto dotPos = uniformName.find('.'); + auto bracketPos = uniformName.find('['); + + if (dotPos != std::string::npos && dotPos < bracketPos) { + // struct + // notation: struct.member + auto structName = uniformName.substr(0, dotPos); + std::string memberName = uniformName.substr(dotPos + 1); + + auto it = std::find_if(uniforms.begin(), uniforms.end(), [structName](auto item) { + return structName == item.name; + }); + raco::core::PropertyInterface &interface = it == uniforms.end() ? uniforms.emplace_back(structName, raco::core::EnginePrimitive::Struct) : *it; + + buildUniformRecursive(memberName, interface.children, type, elementCount, outError); + + } else if (bracketPos != std::string::npos && bracketPos < dotPos) { + // array of struct + // notation: array[index].member + auto closeBracketPos = uniformName.find(']'); + if (closeBracketPos != std::string::npos) { + auto arrayName = uniformName.substr(0, bracketPos); + auto indexStr = uniformName.substr(bracketPos + 1, closeBracketPos - bracketPos - 1); + auto rest = uniformName.substr(closeBracketPos + 2); + + auto it = std::find_if(uniforms.begin(), uniforms.end(), [arrayName](auto item) { + return arrayName == item.name; + }); + raco::core::PropertyInterface &interface = it == uniforms.end() ? uniforms.emplace_back(arrayName, raco::core::EnginePrimitive::Array) : *it; + + // The index in the uniform name starts at 0 + int index = stoi(indexStr); + assert(index <= interface.children.size()); + if (index == interface.children.size()) { + interface.children.emplace_back(std::string(), raco::core::EnginePrimitive::Struct); + } + raco::core::PropertyInterface &element = interface.children[index]; + buildUniformRecursive(rest, element.children, type, elementCount, outError); + } + } else { + // scalar + if (elementCount > 1) { + if (type >= core::EnginePrimitive::Int32 && type <= core::EnginePrimitive::Vec4i) { + uniforms.emplace_back(raco::core::PropertyInterface::makeArrayOf(uniformName, type, elementCount)); + } else { + outError += fmt::format("Uniform '{}' has unsupported array element type '{}'", uniformName, type); + } + } else { + uniforms.emplace_back(uniformName, type); + } + } +} + bool parseShaderText(ramses::Scene &scene, const std::string &vertexShader, const std::string &geometryShader, const std::string &fragmentShader, const std::string &shaderDefines, raco::core::PropertyInterfaceList &outUniforms, raco::core::PropertyInterfaceList &outAttributes, std::string &outError) { outUniforms.clear(); outAttributes.clear(); @@ -221,15 +326,7 @@ bool parseShaderText(ramses::Scene &scene, const std::string &vertexShader, cons if (uniform.getSemantics() == ramses::EEffectUniformSemantic::Invalid) { if (shaderTypeMap.find(uniform.getDataType()) != shaderTypeMap.end()) { auto engineType = shaderTypeMap[uniform.getDataType()]; - if (uniform.getElementCount() > 1) { - if (engineType >= core::EnginePrimitive::Int32 && engineType <= core::EnginePrimitive::Vec4i) { - outUniforms.emplace_back(raco::core::PropertyInterface::makeArrayOf(uniform.getName(), engineType, uniform.getElementCount())); - } else { - outError += fmt::format("Uniform '{}' has unsupported array element type '{}'", uniform.getName(), engineType); - } - } else { - outUniforms.emplace_back(std::string{uniform.getName()}, engineType); - } + buildUniformRecursive(std::string(uniform.getName()), outUniforms, engineType, uniform.getElementCount(), outError); } else { // mat4 uniforms are needed for skinning: they will be set directly by the LogicEngine // so we don't need to expose but they shouldn't generate errors either: @@ -529,8 +626,9 @@ std::vector decodeMipMapData(core::Errors *errors, core::Project return {}; } - auto selectedTextureFormat = static_cast(obj->get("textureFormat")->asInt()); - decodingInfo.convertedPngFormat = selectedTextureFormat; + auto format = static_cast(obj->get("textureFormat")->asInt()); + auto ramsesFormat = ramses_base::enumerationTranslationTextureFormat.at(format); + decodingInfo.convertedPngFormat = ramsesFormat; std::vector data; unsigned int curWidth; @@ -549,10 +647,10 @@ std::vector decodeMipMapData(core::Errors *errors, core::Project decodingInfo.pngColorChannels = pngColorTypeToColorInfo(decodingInfo.originalPngFormat); decodingInfo.ramsesColorChannels = ramsesTextureFormatToRamsesColorInfo(decodingInfo.originalPngFormat, decodingInfo.convertedPngFormat); decodingInfo.shaderColorChannels = ramsesColorInfoToShaderColorInfo(decodingInfo.ramsesColorChannels); - auto textureFormatCompatInfo = raco::ramses_base::validateTextureColorTypeAndBitDepth(selectedTextureFormat, pngColorType, (pngColorType == LCT_PALETTE) ? 8 : lodePngColorInfo.bitdepth); + auto textureFormatCompatInfo = raco::ramses_base::validateTextureColorTypeAndBitDepth(ramsesFormat, pngColorType, (pngColorType == LCT_PALETTE) ? 8 : lodePngColorInfo.bitdepth); auto ret = textureFormatCompatInfo.conversionNeeded - ? lodepng::decode(data, curWidth, curHeight, rawBinaryData, ramsesTextureFormatToPngFormat(selectedTextureFormat), (pngColorType == LCT_PALETTE) ? 8 : lodePngColorInfo.bitdepth) + ? lodepng::decode(data, curWidth, curHeight, rawBinaryData, ramsesTextureFormatToPngFormat(ramsesFormat), (pngColorType == LCT_PALETTE) ? 8 : lodePngColorInfo.bitdepth) : lodepng::decode(data, curWidth, curHeight, pngImportState, rawBinaryData); if (ret != 0) { @@ -610,7 +708,7 @@ std::vector decodeMipMapData(core::Errors *errors, core::Project if (decodingInfo.bitdepth == 16) { raco::ramses_base::normalize16BitColorData(data); - } else if (pngColorType != LCT_GREY_ALPHA && selectedTextureFormat == ramses::ETextureFormat::RG8) { + } else if (pngColorType != LCT_GREY_ALPHA && ramsesFormat == ramses::ETextureFormat::RG8) { data = raco::ramses_base::generateColorDataWithoutBlueChannel(data); } } diff --git a/components/libRamsesBase/tests/AdaptorTestUtils.h b/components/libRamsesBase/tests/AdaptorTestUtils.h new file mode 100644 index 00000000..ad083bfd --- /dev/null +++ b/components/libRamsesBase/tests/AdaptorTestUtils.h @@ -0,0 +1,163 @@ +/* + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of Ramses Composer + * (see https://github.com/bmwcarit/ramses-composer). + * + * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + * If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include "testing/TestUtil.h" + +template +void checkUniformScalar(const ramses::Appearance* appearance, const std::string& name, const T value) { + ramses::UniformInput input; + if constexpr (std::is_same::value) { + int32_t ivalue; + appearance->getEffect().findUniformInput(name.c_str(), input); + appearance->getInputValueInt32(input, ivalue); + EXPECT_EQ(ivalue, value); + } + else if constexpr (std::is_same::value) { + float fvalue; + appearance->getEffect().findUniformInput(name.c_str(), input); + appearance->getInputValueFloat(input, fvalue); + EXPECT_EQ(fvalue, value); + } + else if constexpr (std::is_same>::value) { + std::array value2f; + appearance->getEffect().findUniformInput(name.c_str(), input); + appearance->getInputValueVector2f(input, value2f[0], value2f[1]); + EXPECT_EQ(value2f, value); + } + else if constexpr (std::is_same>::value) { + std::array value3f; + appearance->getEffect().findUniformInput(name.c_str(), input); + appearance->getInputValueVector3f(input, value3f[0], value3f[1], value3f[2]); + EXPECT_EQ(value3f, value); + } + else if constexpr (std::is_same>::value) { + std::array value4f; + appearance->getEffect().findUniformInput(name.c_str(), input); + appearance->getInputValueVector4f(input, value4f[0], value4f[1], value4f[2], value4f[3]); + EXPECT_EQ(value4f, value); + } + else if constexpr (std::is_same>::value) { + std::array value2i; + appearance->getEffect().findUniformInput(name.c_str(), input); + appearance->getInputValueVector2i(input, value2i[0], value2i[1]); + EXPECT_EQ(value2i, value); + } + else if constexpr (std::is_same>::value) { + std::array value3i; + appearance->getEffect().findUniformInput(name.c_str(), input); + appearance->getInputValueVector3i(input, value3i[0], value3i[1], value3i[2]); + EXPECT_EQ(value3i, value); + } + else if constexpr (std::is_same>::value) { + std::array value4i; + appearance->getEffect().findUniformInput(name.c_str(), input); + appearance->getInputValueVector4i(input, value4i[0], value4i[1], value4i[2], value4i[3]); + EXPECT_EQ(value4i, value); + } + else if constexpr (std::is_same::value) { + const ramses::TextureSampler* u_sampler_texture; + EXPECT_EQ(ramses::StatusOK, appearance->getEffect().findUniformInput(name.c_str(), input)); + EXPECT_EQ(ramses::StatusOK, appearance->getInputTexture(input, u_sampler_texture)); + EXPECT_EQ(u_sampler_texture, value); + } + else if constexpr (std::is_same::value) { + const ramses::TextureSamplerMS* u_sampler_texture; + EXPECT_EQ(ramses::StatusOK, appearance->getEffect().findUniformInput(name.c_str(), input)); + EXPECT_EQ(ramses::StatusOK, appearance->getInputTextureMS(input, u_sampler_texture)); + EXPECT_EQ(u_sampler_texture, value); + } + else { + EXPECT_TRUE(false); + } +} + +template +void checkUniformScalar(const raco::core::ValueHandle& handle, const ramses::Appearance* appearance, const std::string& name, const T value) { + using namespace raco; + + checkUniformScalar(appearance, name, value); + if constexpr (std::is_same::value) { + EXPECT_EQ(handle.asInt(), value); + } else if constexpr (std::is_same::value) { + EXPECT_EQ(handle.asDouble(), value); + } else if constexpr (std::is_same>::value) { + checkVec2fValue(handle, value); + } else if constexpr (std::is_same>::value) { + checkVec3fValue(handle, value); + } else if constexpr (std::is_same>::value) { + checkVec4fValue(handle, value); + } else if constexpr (std::is_same>::value) { + checkVec2iValue(handle, value); + } else if constexpr (std::is_same>::value) { + checkVec3iValue(handle, value); + } else if constexpr (std::is_same>::value) { + checkVec4iValue(handle, value); + } else { + EXPECT_TRUE(false); + } +} + + +template +void checkUniformVector(const ramses::Appearance* appearance, const std::string& name, int index, const T& value) { + ramses::UniformInput input; + if constexpr (std::is_same::value) { + std::array ivalue; + appearance->getEffect().findUniformInput(name.c_str(), input); + appearance->getInputValueInt32(input, length, ivalue.data()); + EXPECT_EQ(ivalue[index], value); + } + else if constexpr (std::is_same::value) { + std::array fvalue; + appearance->getEffect().findUniformInput(name.c_str(), input); + appearance->getInputValueFloat(input, length, fvalue.data()); + EXPECT_EQ(fvalue[index], value); + } + else if constexpr (std::is_same>::value) { + std::array, length> value2f; + appearance->getEffect().findUniformInput(name.c_str(), input); + appearance->getInputValueVector2f(input, length, value2f.data()->data()); + EXPECT_EQ(value2f[index], value); + } + else if constexpr (std::is_same>::value) { + std::array, length> value3f; + appearance->getEffect().findUniformInput(name.c_str(), input); + appearance->getInputValueVector3f(input, length, value3f.data()->data()); + EXPECT_EQ(value3f[index], value); + } + else if constexpr (std::is_same>::value) { + std::array, length> value4f; + appearance->getEffect().findUniformInput(name.c_str(), input); + appearance->getInputValueVector4f(input, length, value4f.data()->data()); + EXPECT_EQ(value4f[index], value); + } + else if constexpr (std::is_same>::value) { + std::array, length> value2i; + appearance->getEffect().findUniformInput(name.c_str(), input); + appearance->getInputValueVector2i(input, length, value2i.data()->data()); + EXPECT_EQ(value2i[index], value); + } + else if constexpr (std::is_same>::value) { + std::array, length> value3i; + appearance->getEffect().findUniformInput(name.c_str(), input); + appearance->getInputValueVector3i(input, length, value3i.data()->data()); + EXPECT_EQ(value3i[index], value); + } + else if constexpr (std::is_same>::value) { + std::array, length> value4i; + appearance->getEffect().findUniformInput(name.c_str(), input); + appearance->getInputValueVector4i(input, length, value4i.data()->data()); + EXPECT_EQ(value4i[index], value); + } + else { + EXPECT_TRUE(false); + } +} diff --git a/components/libRamsesBase/tests/CMakeLists.txt b/components/libRamsesBase/tests/CMakeLists.txt index 688bba5f..9ab51f6c 100644 --- a/components/libRamsesBase/tests/CMakeLists.txt +++ b/components/libRamsesBase/tests/CMakeLists.txt @@ -11,6 +11,9 @@ If a copy of the MPL was not distributed with this file, You can obtain one at h # Adding the unit test with gtest using our macro from dsathe top level CMakeLists.txt file set(TEST_SOURCES + AdaptorTestUtils.h + MaterialAdaptorTestBase.h + AnimationAdaptor_test.cpp AnimationChannelAdaptor_test.cpp BlitPassAdaptor_test.cpp @@ -66,16 +69,24 @@ raco_package_add_test_resources( images/text-back-palette.png images/yellow_256.png scripts/types-scalar.lua + scripts/uniform-structs.lua + scripts/uniform-array.lua shaders/basic.frag shaders/basic.vert - shaders/simple_texture.frag - shaders/simple_texture.vert shaders/multisampler.frag shaders/multisampler.vert + shaders/simple_texture.frag + shaders/simple_texture.vert + shaders/texture-external.vert + shaders/texture-external.frag shaders/uniform-array.vert shaders/uniform-array.frag + shaders/uniform-samplers.vert + shaders/uniform-samplers.frag shaders/uniform-scalar.vert shaders/uniform-scalar.frag + shaders/uniform-struct.vert + shaders/uniform-struct.frag shaders/skinning-template.vert shaders/skinning-template.frag meshes/Duck.glb diff --git a/components/libRamsesBase/tests/LinkAdaptor_test.cpp b/components/libRamsesBase/tests/LinkAdaptor_test.cpp index dd16a3b1..92caca4f 100644 --- a/components/libRamsesBase/tests/LinkAdaptor_test.cpp +++ b/components/libRamsesBase/tests/LinkAdaptor_test.cpp @@ -14,17 +14,29 @@ #include "ramses_adaptor/SceneAdaptor.h" #include "ramses_adaptor/utilities.h" #include "testing/TestUtil.h" +#include "user_types/Node.h" +#include "user_types/Prefab.h" #include "user_types/LuaScript.h" + #include "utils/FileUtils.h" #include "core/PropertyDescriptor.h" using namespace raco; -using raco::ramses_adaptor::LuaScriptAdaptor; -using raco::ramses_adaptor::propertyByNames; -using raco::user_types::LuaScript; -using raco::user_types::SLuaScript; +using namespace raco::ramses_adaptor; +using namespace raco::user_types; -class LinkAdaptorFixture : public RamsesBaseFixture<> {}; +class LinkAdaptorFixture : public RamsesBaseFixture<> { +public: + void checkRamsesTranslation(const ramses::Node& node, const std::array& value) { + EXPECT_EQ(Translation::from(node), value); + } + + void checkRamsesNodeTranslation(const std::string& name, const std::array& value) { + auto ramsesNode = select(*sceneContext.scene(), name.c_str()); + EXPECT_TRUE(ramsesNode != nullptr); + checkRamsesTranslation(*ramsesNode, value); + } +}; TEST_F(LinkAdaptorFixture, linkCreationOneLink) { const auto luaScript{context.createObject(raco::user_types::LuaScript::typeDescription.typeName, "lua_script", "lua_script_id")}; @@ -42,19 +54,14 @@ end auto link = context.addLink({luaScript, {"outputs", "translation"}}, {node, {"translation"}}); ASSERT_NO_FATAL_FAILURE(dispatch()); - ASSERT_TRUE(backend.logicEngine().update()); + checkRamsesNodeTranslation("node", {0.0, 0.0, 0.0}); + EXPECT_EQ(backend.logicEngine().getPropertyLinks().size(), 1); context.set({luaScript, {"inputs", "x"}}, 5.0); ASSERT_NO_FATAL_FAILURE(dispatch()); - ASSERT_TRUE(backend.logicEngine().update()); - - auto ramsesNode = select(*sceneContext.scene(), "node"); - float x, y, z; - ramsesNode->getTranslation(x, y, z); - ASSERT_EQ(5.0f, x); - ASSERT_EQ(0.0f, y); - ASSERT_EQ(0.0f, z); + checkRamsesNodeTranslation("node", {5.0, 0.0, 0.0}); + EXPECT_EQ(backend.logicEngine().getPropertyLinks().size(), 1); } #if (!defined (__linux__)) @@ -76,12 +83,14 @@ end auto link = context.addLink({luaScript, {"outputs", "translation"}}, {node, {"translation"}}); ASSERT_NO_FATAL_FAILURE(dispatch()); - ASSERT_TRUE(backend.logicEngine().update()); + checkRamsesNodeTranslation("node", {0.0, 0.0, 0.0}); + EXPECT_EQ(backend.logicEngine().getPropertyLinks().size(), 1); context.set({luaScript, {"inputs", "x"}}, 5.0); ASSERT_NO_FATAL_FAILURE(dispatch()); - ASSERT_TRUE(backend.logicEngine().update()); + checkRamsesNodeTranslation("node", {5.0, 0.0, 0.0}); + EXPECT_EQ(backend.logicEngine().getPropertyLinks().size(), 1); raco::utils::file::write((test_path() / "lua_script.lua").string(), R"( function interface(IN,OUT) @@ -96,14 +105,8 @@ end EXPECT_TRUE(raco::awaitPreviewDirty(recorder, luaScript)); ASSERT_NO_FATAL_FAILURE(dispatch()); - ASSERT_TRUE(backend.logicEngine().update()); - - auto ramsesNode = select(*sceneContext.scene(), "node"); - float x, y, z; - ramsesNode->getTranslation(x, y, z); - ASSERT_EQ(5.0f, x); - ASSERT_EQ(5.0f, y); - ASSERT_EQ(0.0f, z); + checkRamsesNodeTranslation("node", {5.0, 5.0, 0.0}); + EXPECT_EQ(backend.logicEngine().getPropertyLinks().size(), 1); } #endif @@ -121,52 +124,30 @@ end )"); context.set({luaScript, {"uri"}}, (test_path() / "lua_script.lua").string()); ASSERT_NO_FATAL_FAILURE(dispatch()); + context.set({luaScript, {"inputs", "x"}}, 5.0); ASSERT_NO_FATAL_FAILURE(dispatch()); - ASSERT_TRUE(backend.logicEngine().update()); + checkRamsesNodeTranslation("node", {0.0, 0.0, 0.0}); + EXPECT_EQ(backend.logicEngine().getPropertyLinks().size(), 0); auto link = context.addLink({luaScript, {"outputs", "translation"}}, {node, {"translation"}}); ASSERT_NO_FATAL_FAILURE(dispatch()); - ASSERT_TRUE(backend.logicEngine().update()); - - { - auto ramsesNode = select(*sceneContext.scene(), "node"); - float x, y, z; - ramsesNode->getTranslation(x, y, z); - ASSERT_EQ(5.0f, x); - ASSERT_EQ(0.0f, y); - ASSERT_EQ(0.0f, z); - } + checkRamsesNodeTranslation("node", {5.0, 0.0, 0.0}); + EXPECT_EQ(backend.logicEngine().getPropertyLinks().size(), 1); context.removeLink(link->endProp()); context.set({luaScript, {"inputs", "x"}}, 10.0); ASSERT_NO_FATAL_FAILURE(dispatch()); - ASSERT_TRUE(backend.logicEngine().update()); - - { - auto ramsesNode = select(*sceneContext.scene(), "node"); - float x, y, z; - ramsesNode->getTranslation(x, y, z); - ASSERT_EQ(0.0f, x); - ASSERT_EQ(0.0f, y); - ASSERT_EQ(0.0f, z); - } + checkRamsesNodeTranslation("node", {5.0, 0.0, 0.0}); + EXPECT_EQ(backend.logicEngine().getPropertyLinks().size(), 0); link = context.addLink({luaScript, {"outputs", "translation"}}, {node, {"translation"}}); ASSERT_NO_FATAL_FAILURE(dispatch()); - ASSERT_TRUE(backend.logicEngine().update()); - - { - auto ramsesNode = select(*sceneContext.scene(), "node"); - float x, y, z; - ramsesNode->getTranslation(x, y, z); - ASSERT_EQ(10.0f, x); - ASSERT_EQ(0.0f, y); - ASSERT_EQ(0.0f, z); - } + checkRamsesNodeTranslation("node", {10.0, 0.0, 0.0}); + EXPECT_EQ(backend.logicEngine().getPropertyLinks().size(), 1); } TEST_F(LinkAdaptorFixture, linkStruct) { @@ -604,3 +585,29 @@ end ASSERT_EQ(startEngineObj->getOutputs()->getChild("x")->get(), 3.0); ASSERT_EQ(startEngineObj->getOutputs()->getChild("y")->get(), 4.0); } + +TEST_F(LinkAdaptorFixture, prefab_move_in_out) { + auto scriptFile = makeFile("lua_script.lua", R"( +function interface(IN,OUT) + OUT.v = Type:Vec3f() +end +function run(IN,OUT) +end + )"); + auto prefab = create("prefab"); + auto node = create("node"); + auto child = create("child", node); + auto lua = create_lua("lua", scriptFile, node); + + commandInterface.addLink({lua, {"outputs", "v"}}, {child, {"translation"}}); + ASSERT_TRUE(dispatch()); + EXPECT_EQ(backend.logicEngine().getPropertyLinks().size(), 1); + + commandInterface.moveScenegraphChildren({node}, prefab); + ASSERT_TRUE(dispatch()); + EXPECT_EQ(backend.logicEngine().getPropertyLinks().size(), 0); + + commandInterface.moveScenegraphChildren({node}, nullptr); + ASSERT_TRUE(dispatch()); + EXPECT_EQ(backend.logicEngine().getPropertyLinks().size(), 1); +} diff --git a/components/libRamsesBase/tests/MaterialAdaptorTestBase.h b/components/libRamsesBase/tests/MaterialAdaptorTestBase.h new file mode 100644 index 00000000..fa82aef1 --- /dev/null +++ b/components/libRamsesBase/tests/MaterialAdaptorTestBase.h @@ -0,0 +1,141 @@ +/* + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of Ramses Composer + * (see https://github.com/bmwcarit/ramses-composer). + * + * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. + * If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include + +#include "RamsesBaseFixture.h" + +#include "user_types/CubeMap.h" + +using namespace raco::user_types; + +class MaterialAdaptorTestBase : public RamsesBaseFixture<> { +public: + SCubeMap create_cubemap(const std::string& name, const std::string& relpath) { + auto cubeMap = create(name); + commandInterface.set({ cubeMap, &raco::user_types::CubeMap::uriBack_ }, (test_path() / relpath).string()); + commandInterface.set({ cubeMap, &raco::user_types::CubeMap::uriBottom_ }, (test_path() / relpath).string()); + commandInterface.set({ cubeMap, &raco::user_types::CubeMap::uriFront_ }, (test_path() / relpath).string()); + commandInterface.set({ cubeMap, &raco::user_types::CubeMap::uriLeft_ }, (test_path() / relpath).string()); + commandInterface.set({ cubeMap, &raco::user_types::CubeMap::uriRight_ }, (test_path() / relpath).string()); + commandInterface.set({ cubeMap, &raco::user_types::CubeMap::uriTop_ }, (test_path() / relpath).string()); + + return cubeMap; + } + + struct struct_prim { + int int_val; + double float_val; + std::array vec2f_val; + std::array vec3f_val; + std::array vec4f_val; + std::array vec2i_val; + std::array vec3i_val; + std::array vec4i_val; + }; + + static constexpr struct_prim default_struct_prim_values = { + 2, + 3.0, + {0.0, 4.0}, + {0.0, 0.0, 5.0}, + {0.0, 0.0, 0.0, 6.0}, + {0, 7}, + {0, 0, 8}, + {0, 0, 0, 9} }; + + void setStructComponents(raco::core::ValueHandle uniformContainerHandle, + int int_val, + double float_val, + std::array vec2f_val, + std::array vec3f_val, + std::array vec4f_val, + std::array vec2i_val, + std::array vec3i_val, + std::array vec4i_val) { + commandInterface.set(uniformContainerHandle.get("i"), int_val); + commandInterface.set(uniformContainerHandle.get("f"), float_val); + + commandInterface.set(uniformContainerHandle.get("v2"), std::array({ vec2f_val[0], vec2f_val[1] })); + commandInterface.set(uniformContainerHandle.get("v3"), std::array({ vec3f_val[0], vec3f_val[1], vec3f_val[2] })); + commandInterface.set(uniformContainerHandle.get("v4"), std::array({ vec4f_val[0], vec4f_val[1], vec4f_val[2], vec4f_val[3] })); + + commandInterface.set(uniformContainerHandle.get("iv2"), vec2i_val); + commandInterface.set(uniformContainerHandle.get("iv3"), vec3i_val); + commandInterface.set(uniformContainerHandle.get("iv4"), vec4i_val); + } + + void setStructComponents(raco::core::ValueHandle uniformContainerHandle, const struct_prim& values) { + setStructComponents(uniformContainerHandle, values.int_val, values.float_val, + values.vec2f_val, values.vec3f_val, values.vec4f_val, + values.vec2i_val, values.vec3i_val, values.vec4i_val); + } + + void linkStructComponents(raco::core::ValueHandle startContainer, raco::core::ValueHandle endContainer) { + for (auto prop : { "i", "f", "v2", "v3", "v4", "iv2", "iv3", "iv4" }) { + commandInterface.addLink(startContainer.get(prop), endContainer.get(prop)); + } + } + + void checkStructComponents(const ramses::Appearance* appearance, std::string uniformBaseName, + int int_val, + double float_val, + std::array vec2f_val, + std::array vec3f_val, + std::array vec4f_val, + std::array vec2i_val, + std::array vec3i_val, + std::array vec4i_val) { + checkUniformScalar(appearance, uniformBaseName + "i", int_val); + checkUniformScalar(appearance, uniformBaseName + "f", float_val); + + checkUniformScalar>(appearance, uniformBaseName + "v2", vec2f_val); + checkUniformScalar>(appearance, uniformBaseName + "v3", vec3f_val); + checkUniformScalar>(appearance, uniformBaseName + "v4", vec4f_val); + + checkUniformScalar>(appearance, uniformBaseName + "iv2", vec2i_val); + checkUniformScalar>(appearance, uniformBaseName + "iv3", vec3i_val); + checkUniformScalar>(appearance, uniformBaseName + "iv4", vec4i_val); + } + + void checkStructComponents(const ramses::Appearance* appearance, std::string uniformBaseName, const struct_prim& values) { + checkStructComponents(appearance, uniformBaseName, values.int_val, values.float_val, + values.vec2f_val, values.vec3f_val, values.vec4f_val, + values.vec2i_val, values.vec3i_val, values.vec4i_val); + } + + void checkStructComponents(const raco::core::ValueHandle handle, const ramses::Appearance* appearance, std::string uniformBaseName, + int int_val, + double float_val, + std::array vec2f_val, + std::array vec3f_val, + std::array vec4f_val, + std::array vec2i_val, + std::array vec3i_val, + std::array vec4i_val) { + checkUniformScalar(handle.get("i"), appearance, uniformBaseName + "i", int_val); + checkUniformScalar(handle.get("f"), appearance, uniformBaseName + "f", float_val); + + checkUniformScalar>(handle.get("v2"), appearance, uniformBaseName + "v2", vec2f_val); + checkUniformScalar>(handle.get("v3"), appearance, uniformBaseName + "v3", vec3f_val); + checkUniformScalar>(handle.get("v4"), appearance, uniformBaseName + "v4", vec4f_val); + + checkUniformScalar>(handle.get("iv2"), appearance, uniformBaseName + "iv2", vec2i_val); + checkUniformScalar>(handle.get("iv3"), appearance, uniformBaseName + "iv3", vec3i_val); + checkUniformScalar>(handle.get("iv4"), appearance, uniformBaseName + "iv4", vec4i_val); + } + + void checkStructComponents(const raco::core::ValueHandle handle, const ramses::Appearance* appearance, std::string uniformBaseName, const struct_prim& values) { + checkStructComponents(handle, appearance, uniformBaseName, values.int_val, values.float_val, + values.vec2f_val, values.vec3f_val, values.vec4f_val, + values.vec2i_val, values.vec3i_val, values.vec4i_val); + } +}; diff --git a/components/libRamsesBase/tests/MaterialAdaptor_test.cpp b/components/libRamsesBase/tests/MaterialAdaptor_test.cpp index 6b2611dd..c6cb6b9c 100644 --- a/components/libRamsesBase/tests/MaterialAdaptor_test.cpp +++ b/components/libRamsesBase/tests/MaterialAdaptor_test.cpp @@ -10,9 +10,20 @@ #include #include "RamsesBaseFixture.h" + +#include "AdaptorTestUtils.h" +#include "MaterialAdaptorTestBase.h" + #include "ramses_adaptor/MaterialAdaptor.h" -class MaterialAdaptorTest : public RamsesBaseFixture<> {}; +#include "user_types/CubeMap.h" +#include "user_types/RenderBuffer.h" +#include "user_types/RenderBufferMS.h" +#include "user_types/TextureExternal.h" + +using namespace raco::user_types; + +class MaterialAdaptorTest : public MaterialAdaptorTestBase {}; TEST_F(MaterialAdaptorTest, context_scene_effect_name_change) { auto node = context.createObject(raco::user_types::Material::typeDescription.typeName, "Material Name"); @@ -42,203 +53,70 @@ TEST_F(MaterialAdaptorTest, context_scene_effect_name_change) { TEST_F(MaterialAdaptorTest, set_get_scalar_uniforms) { auto material = create_material("mat", "shaders/uniform-scalar.vert", "shaders/uniform-scalar.frag"); - commandInterface.set({material, {"uniforms", "i"}}, 2); - commandInterface.set({material, {"uniforms", "f"}}, 3.0); - - commandInterface.set({material, {"uniforms", "v2", "y"}}, 4.0); - commandInterface.set({material, {"uniforms", "v3", "z"}}, 5.0); - commandInterface.set({material, {"uniforms", "v4", "w"}}, 6.0); - - commandInterface.set({material, {"uniforms", "iv2", "i1"}}, 7); - commandInterface.set({material, {"uniforms", "iv3", "i2"}}, 8); - commandInterface.set({material, {"uniforms", "iv4", "i3"}}, 9); + setStructComponents({material, {"uniforms"}}, default_struct_prim_values); dispatch(); auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; - ramses::UniformInput input; - - int32_t ivalue; - appearance->getEffect().findUniformInput("i", input); - appearance->getInputValueInt32(input, ivalue); - EXPECT_EQ(ivalue, 2); - - float fvalue; - appearance->getEffect().findUniformInput("f", input); - appearance->getInputValueFloat(input, fvalue); - EXPECT_EQ(fvalue, 3.0); - - std::array value2f; - appearance->getEffect().findUniformInput("v2", input); - appearance->getInputValueVector2f(input, value2f[0], value2f[1]); - EXPECT_EQ(value2f[1], 4.0); - - std::array value3f; - appearance->getEffect().findUniformInput("v3", input); - appearance->getInputValueVector3f(input, value3f[0], value3f[1], value3f[2]); - EXPECT_EQ(value3f[2], 5.0); - - std::array value4f; - appearance->getEffect().findUniformInput("v4", input); - appearance->getInputValueVector4f(input, value4f[0], value4f[1], value4f[2], value4f[3]); - EXPECT_EQ(value4f[3], 6.0); - - std::array value2i; - appearance->getEffect().findUniformInput("iv2", input); - appearance->getInputValueVector2i(input, value2i[0], value2i[1]); - EXPECT_EQ(value2i[0], 7); - - std::array value3i; - appearance->getEffect().findUniformInput("iv3", input); - appearance->getInputValueVector3i(input, value3i[0], value3i[1], value3i[2]); - EXPECT_EQ(value3i[1], 8); - - std::array value4i; - appearance->getEffect().findUniformInput("iv4", input); - appearance->getInputValueVector4i(input, value4i[0], value4i[1], value4i[2], value4i[3]); - EXPECT_EQ(value4i[2], 9); + checkStructComponents(appearance, {}, default_struct_prim_values); } TEST_F(MaterialAdaptorTest, link_get_scalar_uniforms) { auto material = create_material("mat", "shaders/uniform-scalar.vert", "shaders/uniform-scalar.frag"); - auto lua = create_lua("lua", "scripts/types-scalar.lua"); - - link(lua, {"outputs", "ointeger"}, material, {"uniforms", "i"}); - link(lua, {"outputs", "ofloat"}, material, {"uniforms", "f"}); + auto interface = create_lua_interface("interface", "scripts/uniform-structs.lua"); - link(lua, {"outputs", "ovector2f"}, material, {"uniforms", "v2"}); - link(lua, {"outputs", "ovector3f"}, material, {"uniforms", "v3"}); - link(lua, {"outputs", "ovector4f"}, material, {"uniforms", "v4"}); - - link(lua, {"outputs", "ovector2i"}, material, {"uniforms", "iv2"}); - link(lua, {"outputs", "ovector3i"}, material, {"uniforms", "iv3"}); - link(lua, {"outputs", "ovector4i"}, material, {"uniforms", "iv4"}); - - dispatch(); - - commandInterface.set({lua, {"inputs", "integer"}}, 7); - commandInterface.set({lua, {"inputs", "float"}}, 9.0); + linkStructComponents({interface, {"inputs", "s_prims"}}, {material, {"uniforms"}}); + setStructComponents({interface, {"inputs", "s_prims"}}, default_struct_prim_values); dispatch(); auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; - ramses::UniformInput input; - - int32_t ivalue; - appearance->getEffect().findUniformInput("i", input); - appearance->getInputValueInt32(input, ivalue); - EXPECT_EQ(ivalue, 14); - - float fvalue; - appearance->getEffect().findUniformInput("f", input); - appearance->getInputValueFloat(input, fvalue); - EXPECT_EQ(fvalue, 9.0); - - std::array value2f; - appearance->getEffect().findUniformInput("v2", input); - appearance->getInputValueVector2f(input, value2f[0], value2f[1]); - EXPECT_EQ(value2f[1], 18.0); - - std::array value3f; - appearance->getEffect().findUniformInput("v3", input); - appearance->getInputValueVector3f(input, value3f[0], value3f[1], value3f[2]); - EXPECT_EQ(value3f[2], 27.0); - - std::array value4f; - appearance->getEffect().findUniformInput("v4", input); - appearance->getInputValueVector4f(input, value4f[0], value4f[1], value4f[2], value4f[3]); - EXPECT_EQ(value4f[3], 36.0); - - std::array value2i; - appearance->getEffect().findUniformInput("iv2", input); - appearance->getInputValueVector2i(input, value2i[0], value2i[1]); - EXPECT_EQ(value2i[0], 7); - - std::array value3i; - appearance->getEffect().findUniformInput("iv3", input); - appearance->getInputValueVector3i(input, value3i[0], value3i[1], value3i[2]); - EXPECT_EQ(value3i[1], 14); - - std::array value4i; - appearance->getEffect().findUniformInput("iv4", input); - appearance->getInputValueVector4i(input, value4i[0], value4i[1], value4i[2], value4i[3]); - EXPECT_EQ(value4i[2], 21); + checkStructComponents({material, {"uniforms"}}, appearance, {}, default_struct_prim_values); } TEST_F(MaterialAdaptorTest, set_get_array_uniforms) { auto material = create_material("mat", "shaders/uniform-array.vert", "shaders/uniform-array.frag"); - + commandInterface.set({material, {"uniforms", "ivec", "2"}}, 2); commandInterface.set({material, {"uniforms", "fvec", "3"}}, 3.0); - commandInterface.set({material, {"uniforms", "avec2", "3", "y"}}, 4.0); - commandInterface.set({material, {"uniforms", "avec3", "3", "y"}}, 5.0); - commandInterface.set({material, {"uniforms", "avec4", "3", "y"}}, 6.0); + commandInterface.set({material, {"uniforms", "avec2", "4", "y"}}, 4.0); + commandInterface.set({material, {"uniforms", "avec3", "5", "z"}}, 5.0); + commandInterface.set({material, {"uniforms", "avec4", "6", "w"}}, 6.0); - commandInterface.set({material, {"uniforms", "aivec2", "3", "i1"}}, 7); - commandInterface.set({material, {"uniforms", "aivec3", "3", "i1"}}, 8); - commandInterface.set({material, {"uniforms", "aivec4", "3", "i1"}}, 9); + commandInterface.set({material, {"uniforms", "aivec2", "4", "i2"}}, 7); + commandInterface.set({material, {"uniforms", "aivec3", "5", "i3"}}, 8); + commandInterface.set({material, {"uniforms", "aivec4", "6", "i4"}}, 9); dispatch(); auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; - ramses::UniformInput input; + checkUniformVector(appearance, "ivec", 1, 2); + checkUniformVector(appearance, "fvec", 2, 3.0); - std::array ivalues; - appearance->getEffect().findUniformInput("ivec", input); - appearance->getInputValueInt32(input, 2, ivalues.data()); - EXPECT_EQ(ivalues[1], 2); - - std::array fvalues; - appearance->getEffect().findUniformInput("fvec", input); - appearance->getInputValueFloat(input, 5, fvalues.data()); - EXPECT_EQ(fvalues[2], 3.0); - - std::array a2fvalues; - appearance->getEffect().findUniformInput("avec2", input); - appearance->getInputValueVector2f(input, 4, a2fvalues.data()); - EXPECT_EQ(a2fvalues[5], 4.0); - - std::array a3fvalues; - appearance->getEffect().findUniformInput("avec3", input); - appearance->getInputValueVector3f(input, 5, a3fvalues.data()); - EXPECT_EQ(a3fvalues[7], 5.0); - - std::array a4fvalues; - appearance->getEffect().findUniformInput("avec4", input); - appearance->getInputValueVector4f(input, 6, a4fvalues.data()); - EXPECT_EQ(a4fvalues[9], 6.0); - - std::array a2ivalues; - appearance->getEffect().findUniformInput("aivec2", input); - appearance->getInputValueVector2i(input, 4, a2ivalues.data()); - EXPECT_EQ(a2ivalues[4], 7); - - std::array a3ivalues; - appearance->getEffect().findUniformInput("aivec3", input); - appearance->getInputValueVector3i(input, 5, a3ivalues.data()); - EXPECT_EQ(a3ivalues[6], 8); - - std::array a4ivalues; - appearance->getEffect().findUniformInput("aivec4", input); - appearance->getInputValueVector4i(input, 6, a4ivalues.data()); - EXPECT_EQ(a4ivalues[8], 9); + checkUniformVector, 4>(appearance, "avec2", 3, {0.0, 4.0}); + checkUniformVector, 5>(appearance, "avec3", 4, {0.0, 0.0, 5.0}); + checkUniformVector, 6>(appearance, "avec4", 5, {0.0, 0.0, 0.0, 6.0}); + + checkUniformVector, 4>(appearance, "aivec2", 3, {0, 7}); + checkUniformVector, 5>(appearance, "aivec3", 4, {0, 0, 8}); + checkUniformVector, 6>(appearance, "aivec4", 5, {0, 0, 0, 9}); } -TEST_F(MaterialAdaptorTest, link_get_array_uniforms) { +TEST_F(MaterialAdaptorTest, link_get_array_uniforms_components) { auto material = create_material("mat", "shaders/uniform-array.vert", "shaders/uniform-array.frag"); auto lua = create_lua("lua", "scripts/types-scalar.lua"); link(lua, {"outputs", "ointeger"}, material, {"uniforms", "ivec", "2"}); link(lua, {"outputs", "ofloat"}, material, {"uniforms", "fvec", "3"}); - + link(lua, {"outputs", "ovector2f"}, material, {"uniforms", "avec2", "3"}); link(lua, {"outputs", "ovector3f"}, material, {"uniforms", "avec3", "3"}); link(lua, {"outputs", "ovector4f"}, material, {"uniforms", "avec4", "3"}); - + link(lua, {"outputs", "ovector2i"}, material, {"uniforms", "aivec2", "3"}); link(lua, {"outputs", "ovector3i"}, material, {"uniforms", "aivec3", "3"}); link(lua, {"outputs", "ovector4i"}, material, {"uniforms", "aivec4", "3"}); @@ -252,45 +130,476 @@ TEST_F(MaterialAdaptorTest, link_get_array_uniforms) { auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + checkUniformVector(appearance, "ivec", 1, 2); + checkUniformVector(appearance, "fvec", 2, 1.0); + + checkUniformVector, 4>(appearance, "avec2", 2, {1.0, 2.0}); + checkUniformVector, 5>(appearance, "avec3", 2, {1.0, 2.0, 3.0}); + checkUniformVector, 6>(appearance, "avec4", 2, {1.0, 2.0, 3.0, 4.0}); + + checkUniformVector, 4>(appearance, "aivec2", 2, {1, 2}); + checkUniformVector, 5>(appearance, "aivec3", 2, {1, 2, 3}); + checkUniformVector, 6>(appearance, "aivec4", 2, {1, 2, 3, 4}); +} + +TEST_F(MaterialAdaptorTest, link_get_array_uniforms_array) { + auto material = create_material("mat", "shaders/uniform-array.vert", "shaders/uniform-array.frag"); + auto interface = create_lua_interface("interface", "scripts/uniform-array.lua"); + + link(interface, {"inputs", "ivec"}, material, {"uniforms", "ivec"}); + link(interface, {"inputs", "fvec"}, material, {"uniforms", "fvec"}); + + link(interface, {"inputs", "avec2"}, material, {"uniforms", "avec2"}); + link(interface, {"inputs", "avec3"}, material, {"uniforms", "avec3"}); + link(interface, {"inputs", "avec4"}, material, {"uniforms", "avec4"}); + + link(interface, {"inputs", "aivec2"}, material, {"uniforms", "aivec2"}); + link(interface, {"inputs", "aivec3"}, material, {"uniforms", "aivec3"}); + link(interface, {"inputs", "aivec4"}, material, {"uniforms", "aivec4"}); + + commandInterface.set({interface, {"inputs", "ivec", "2"}}, 2); + commandInterface.set({interface, {"inputs", "fvec", "3"}}, 3.0); + + commandInterface.set({interface, {"inputs", "avec2", "4", "y"}}, 4.0); + commandInterface.set({interface, {"inputs", "avec3", "5", "z"}}, 5.0); + commandInterface.set({interface, {"inputs", "avec4", "6", "w"}}, 6.0); + + commandInterface.set({interface, {"inputs", "aivec2", "4", "i2"}}, 7); + commandInterface.set({interface, {"inputs", "aivec3", "5", "i3"}}, 8); + commandInterface.set({interface, {"inputs", "aivec4", "6", "i4"}}, 9); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkUniformVector(appearance, "ivec", 1, 2); + checkUniformVector(appearance, "fvec", 2, 3.0); + + checkUniformVector, 4>(appearance, "avec2", 3, {0.0, 4.0}); + checkUniformVector, 5>(appearance, "avec3", 4, {0.0, 0.0, 5.0}); + checkUniformVector, 6>(appearance, "avec4", 5, {0.0, 0.0, 0.0, 6.0}); + + checkUniformVector, 4>(appearance, "aivec2", 3, {0, 7}); + checkUniformVector, 5>(appearance, "aivec3", 4, {0, 0, 8}); + checkUniformVector, 6>(appearance, "aivec4", 5, {0, 0, 0, 9}); +} + +TEST_F(MaterialAdaptorTest, set_get_sampler_uniforms) { + auto material = create_material("mat", "shaders/uniform-samplers.vert", "shaders/uniform-samplers.frag"); + auto texture = create_texture("texture", "images/DuckCM.png"); + auto buffer = create("buffer"); + auto buffer_ms = create("buffer_ms"); + auto cubeMap = create_cubemap("cubemap", "images/blue_1024.png"); + + commandInterface.set({material, {"uniforms", "s_texture"}}, texture); + commandInterface.set({material, {"uniforms", "s_cubemap"}}, cubeMap); + commandInterface.set({material, {"uniforms", "s_buffer"}}, buffer); + commandInterface.set({material, {"uniforms", "s_buffer_ms"}}, buffer_ms); + + dispatch(); + + auto appearance = select(*sceneContext.scene(), "mat_Appearance"); + auto engineTexture = select(*sceneContext.scene(), "texture"); + auto engine_cubeMap = select(*sceneContext.scene(), "cubemap"); + auto engine_buffer = select(*sceneContext.scene(), "buffer"); + auto engine_buffer_ms = select(*sceneContext.scene(), "buffer_ms"); + + checkUniformScalar(appearance, "s_texture", engineTexture); + checkUniformScalar(appearance, "s_cubemap", engine_cubeMap); + checkUniformScalar(appearance, "s_buffer", engine_buffer); + checkUniformScalar(appearance, "s_buffer_ms", engine_buffer_ms); +} + +TEST_F(MaterialAdaptorTest, set_get_sampler_external_uniforms) { + auto material = create_material("mat", "shaders/texture-external.vert", "shaders/texture-external.frag"); + auto texture = create("texture"); + + commandInterface.set({material, {"uniforms", "utex"}}, texture); + + dispatch(); + + auto appearance = select(*sceneContext.scene(), "mat_Appearance"); + auto engineTexture = select(*sceneContext.scene(), "texture"); + ramses::UniformInput input; - std::array ivalues; - appearance->getEffect().findUniformInput("ivec", input); - appearance->getInputValueInt32(input, 2, ivalues.data()); - EXPECT_EQ(ivalues[1], 2); - - std::array fvalues; - appearance->getEffect().findUniformInput("fvec", input); - appearance->getInputValueFloat(input, 5, fvalues.data()); - EXPECT_EQ(fvalues[2], 1.0); - - std::array a2fvalues; - appearance->getEffect().findUniformInput("avec2", input); - appearance->getInputValueVector2f(input, 4, a2fvalues.data()); - EXPECT_EQ(a2fvalues[5], 2.0); - - std::array a3fvalues; - appearance->getEffect().findUniformInput("avec3", input); - appearance->getInputValueVector3f(input, 5, a3fvalues.data()); - EXPECT_EQ(a3fvalues[7], 2.0); - - std::array a4fvalues; - appearance->getEffect().findUniformInput("avec4", input); - appearance->getInputValueVector4f(input, 6, a4fvalues.data()); - EXPECT_EQ(a4fvalues[9], 2.0); - - std::array a2ivalues; - appearance->getEffect().findUniformInput("aivec2", input); - appearance->getInputValueVector2i(input, 4, a2ivalues.data()); - EXPECT_EQ(a2ivalues[4], 1); - - std::array a3ivalues; - appearance->getEffect().findUniformInput("aivec3", input); - appearance->getInputValueVector3i(input, 5, a3ivalues.data()); - EXPECT_EQ(a3ivalues[6], 1); - - std::array a4ivalues; - appearance->getEffect().findUniformInput("aivec4", input); - appearance->getInputValueVector4i(input, 6, a4ivalues.data()); - EXPECT_EQ(a4ivalues[8], 1); -} \ No newline at end of file + const ramses::TextureSamplerExternal* u_sampler_texture; + EXPECT_EQ(ramses::StatusOK, appearance->getEffect().findUniformInput("utex", input)); + EXPECT_EQ(ramses::StatusOK, appearance->getInputTextureExternal(input, u_sampler_texture)); + EXPECT_EQ(u_sampler_texture, engineTexture); +} + +TEST_F(MaterialAdaptorTest, set_get_struct_prim_uniforms) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + + setStructComponents({material, {"uniforms", "s_prims"}}, default_struct_prim_values); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkStructComponents(appearance, "s_prims.", default_struct_prim_values); +} + +TEST_F(MaterialAdaptorTest, link_get_struct_prim_uniforms_link_struct) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto interface = create_lua_interface("interface", "scripts/uniform-structs.lua"); + + link(interface, {"inputs", "s_prims"}, material, {"uniforms", "s_prims"}); + + setStructComponents({interface, {"inputs", "s_prims"}}, default_struct_prim_values); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkStructComponents({material, {"uniforms", "s_prims"}}, appearance, "s_prims.", default_struct_prim_values); +} + +TEST_F(MaterialAdaptorTest, link_get_struct_prim_uniforms_link_members) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto interface = create_lua_interface("interface", "scripts/uniform-structs.lua"); + + linkStructComponents({interface, {"inputs", "s_prims"}}, {material, {"uniforms", "s_prims"}}); + setStructComponents({interface, {"inputs", "s_prims"}}, default_struct_prim_values); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkStructComponents({material, {"uniforms", "s_prims"}}, appearance, "s_prims.", default_struct_prim_values); +} + +TEST_F(MaterialAdaptorTest, set_get_struct_sampler_uniforms) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto texture = create_texture("texture", "images/DuckCM.png"); + auto buffer = create("buffer"); + auto buffer_ms = create("buffer_ms"); + auto cubeMap = create_cubemap("cubemap", "images/blue_1024.png"); + + commandInterface.set({material, {"uniforms", "s_samplers", "s_texture"}}, texture); + commandInterface.set({material, {"uniforms", "s_samplers", "s_cubemap"}}, cubeMap); + commandInterface.set({material, {"uniforms", "s_samplers", "s_buffer"}}, buffer); + commandInterface.set({material, {"uniforms", "s_samplers", "s_buffer_ms"}}, buffer_ms); + + dispatch(); + + auto appearance = select(*sceneContext.scene(), "mat_Appearance"); + auto engineTexture = select(*sceneContext.scene(), "texture"); + auto engine_cubeMap = select(*sceneContext.scene(), "cubemap"); + auto engine_buffer = select(*sceneContext.scene(), "buffer"); + auto engine_buffer_ms = select(*sceneContext.scene(), "buffer_ms"); + + checkUniformScalar(appearance, "s_samplers.s_texture", engineTexture); + checkUniformScalar(appearance, "s_samplers.s_cubemap", engine_cubeMap); + checkUniformScalar(appearance, "s_samplers.s_buffer", engine_buffer); + checkUniformScalar(appearance, "s_samplers.s_buffer_ms", engine_buffer_ms); +} + +TEST_F(MaterialAdaptorTest, set_get_nested_struct_prim_uniforms) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + + setStructComponents({material, {"uniforms", "nested", "prims"}}, default_struct_prim_values); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkStructComponents(appearance, "nested.prims.", default_struct_prim_values); +} + +TEST_F(MaterialAdaptorTest, link_get_nested_struct_prim_uniforms_link_struct) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto interface = create_lua_interface("interface", "scripts/uniform-structs.lua"); + + link(interface, {"inputs", "s_prims"}, material, {"uniforms", "nested", "prims"}); + setStructComponents({interface, {"inputs", "s_prims"}}, default_struct_prim_values); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkStructComponents({material, {"uniforms", "nested", "prims"}}, appearance, "nested.prims.", default_struct_prim_values); +} + +TEST_F(MaterialAdaptorTest, link_get_nested_struct_prim_uniforms_link_members) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto interface = create_lua_interface("interface", "scripts/uniform-structs.lua"); + + linkStructComponents({interface, {"inputs", "s_prims"}}, {material, {"uniforms", "nested", "prims"}}); + setStructComponents({interface, {"inputs", "s_prims"}}, default_struct_prim_values); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkStructComponents({material, {"uniforms", "nested", "prims"}}, appearance, "nested.prims.", default_struct_prim_values); +} + +TEST_F(MaterialAdaptorTest, set_get_nested_struct_sampler_uniforms) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto texture = create_texture("texture", "images/DuckCM.png"); + auto buffer = create("buffer"); + auto buffer_ms = create("buffer_ms"); + auto cubeMap = create_cubemap("cubemap", "images/blue_1024.png"); + + commandInterface.set({material, {"uniforms", "nested", "samplers", "s_texture"}}, texture); + commandInterface.set({material, {"uniforms", "nested", "samplers", "s_cubemap"}}, cubeMap); + commandInterface.set({material, {"uniforms", "nested", "samplers", "s_buffer"}}, buffer); + commandInterface.set({material, {"uniforms", "nested", "samplers", "s_buffer_ms"}}, buffer_ms); + + dispatch(); + + auto appearance = select(*sceneContext.scene(), "mat_Appearance"); + auto engineTexture = select(*sceneContext.scene(), "texture"); + auto engine_cubeMap = select(*sceneContext.scene(), "cubemap"); + auto engine_buffer = select(*sceneContext.scene(), "buffer"); + auto engine_buffer_ms = select(*sceneContext.scene(), "buffer_ms"); + + checkUniformScalar(appearance, "nested.samplers.s_texture", engineTexture); + checkUniformScalar(appearance, "nested.samplers.s_cubemap", engine_cubeMap); + checkUniformScalar(appearance, "nested.samplers.s_buffer", engine_buffer); + checkUniformScalar(appearance, "nested.samplers.s_buffer_ms", engine_buffer_ms); +} + +TEST_F(MaterialAdaptorTest, set_get_array_struct_prim_uniforms) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + + setStructComponents({material, {"uniforms", "a_s_prims", "2"}}, default_struct_prim_values); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkStructComponents(appearance, "a_s_prims[1].", default_struct_prim_values); +} + +TEST_F(MaterialAdaptorTest, link_get_array_struct_prim_uniforms_link_array) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto interface = create_lua_interface("interface", "scripts/uniform-structs.lua"); + + link(interface, {"inputs", "a_s_prims"}, material, {"uniforms", "a_s_prims"}); + setStructComponents({interface, {"inputs", "a_s_prims", "2"}}, default_struct_prim_values); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkStructComponents({material, {"uniforms", "a_s_prims", "2"}}, appearance, "a_s_prims[1].", default_struct_prim_values); +} + +TEST_F(MaterialAdaptorTest, link_get_array_struct_prim_uniforms_link_struct) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto interface = create_lua_interface("interface", "scripts/uniform-structs.lua"); + + link(interface, {"inputs", "s_prims"}, material, {"uniforms", "a_s_prims", "2"}); + setStructComponents({interface, {"inputs", "s_prims"}}, default_struct_prim_values); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkStructComponents({material, {"uniforms", "a_s_prims", "2"}}, appearance, "a_s_prims[1].", default_struct_prim_values); +} + +TEST_F(MaterialAdaptorTest, link_get_array_struct_prim_uniforms_link_members) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto interface = create_lua_interface("interface", "scripts/uniform-structs.lua"); + + linkStructComponents({interface, {"inputs", "s_prims"}}, {material, {"uniforms", "a_s_prims", "2"}}); + setStructComponents({interface, {"inputs", "s_prims"}}, default_struct_prim_values); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkStructComponents({material, {"uniforms", "a_s_prims", "2"}}, appearance, "a_s_prims[1].", default_struct_prim_values); +} + +TEST_F(MaterialAdaptorTest, set_get_array_struct_sampler_uniforms) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto texture = create_texture("texture", "images/DuckCM.png"); + auto buffer = create("buffer"); + auto buffer_ms = create("buffer_ms"); + auto cubeMap = create_cubemap("cubemap", "images/blue_1024.png"); + + commandInterface.set({material, {"uniforms", "a_s_samplers", "2", "s_texture"}}, texture); + commandInterface.set({material, {"uniforms", "a_s_samplers", "2", "s_cubemap"}}, cubeMap); + commandInterface.set({material, {"uniforms", "a_s_samplers", "2", "s_buffer"}}, buffer); + commandInterface.set({material, {"uniforms", "a_s_samplers", "2", "s_buffer_ms"}}, buffer_ms); + + dispatch(); + + auto appearance = select(*sceneContext.scene(), "mat_Appearance"); + auto engineTexture = select(*sceneContext.scene(), "texture"); + auto engine_cubeMap = select(*sceneContext.scene(), "cubemap"); + auto engine_buffer = select(*sceneContext.scene(), "buffer"); + auto engine_buffer_ms = select(*sceneContext.scene(), "buffer_ms"); + + checkUniformScalar(appearance, "a_s_samplers[1].s_texture", engineTexture); + checkUniformScalar(appearance, "a_s_samplers[1].s_cubemap", engine_cubeMap); + checkUniformScalar(appearance, "a_s_samplers[1].s_buffer", engine_buffer); + checkUniformScalar(appearance, "a_s_samplers[1].s_buffer_ms", engine_buffer_ms); +} + +TEST_F(MaterialAdaptorTest, set_get_struct_of_array_of_prim_uniforms) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + + commandInterface.set({material, {"uniforms", "s_a_prims", "ivec", "2"}}, 2); + commandInterface.set({material, {"uniforms", "s_a_prims", "fvec", "3"}}, 3.0); + + commandInterface.set({material, {"uniforms", "s_a_prims", "avec2", "4", "y"}}, 4.0); + commandInterface.set({material, {"uniforms", "s_a_prims", "avec3", "5", "z"}}, 5.0); + commandInterface.set({material, {"uniforms", "s_a_prims", "avec4", "6", "w"}}, 6.0); + + commandInterface.set({material, {"uniforms", "s_a_prims", "aivec2", "4", "i2"}}, 7); + commandInterface.set({material, {"uniforms", "s_a_prims", "aivec3", "5", "i3"}}, 8); + commandInterface.set({material, {"uniforms", "s_a_prims", "aivec4", "6", "i4"}}, 9); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkUniformVector(appearance, "s_a_prims.ivec", 1, 2); + checkUniformVector(appearance, "s_a_prims.fvec", 2, 3.0); + + checkUniformVector, 4>(appearance, "s_a_prims.avec2", 3, {0.0, 4.0}); + checkUniformVector, 5>(appearance, "s_a_prims.avec3", 4, {0.0, 0.0, 5.0}); + checkUniformVector, 6>(appearance, "s_a_prims.avec4", 5, {0.0, 0.0, 0.0, 6.0}); + + checkUniformVector, 4>(appearance, "s_a_prims.aivec2", 3, {0, 7}); + checkUniformVector, 5>(appearance, "s_a_prims.aivec3", 4, {0, 0, 8}); + checkUniformVector, 6>(appearance, "s_a_prims.aivec4", 5, {0, 0, 0, 9}); +} + +TEST_F(MaterialAdaptorTest, set_get_struct_of_array_of_struct_prims_uniforms) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + + setStructComponents({material, {"uniforms", "s_a_struct_prim", "prims", "2"}}, default_struct_prim_values); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkStructComponents(appearance, "s_a_struct_prim.prims[1].", default_struct_prim_values); +} + +TEST_F(MaterialAdaptorTest, link_get_struct_of_array_of_struct_prims_uniforms_link_struct_outer) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto interface = create_lua_interface("interface", "scripts/uniform-structs.lua"); + + link(interface, {"inputs", "s_a_struct_prim"}, material, {"uniforms", "s_a_struct_prim"}); + setStructComponents({interface, {"inputs", "s_a_struct_prim", "prims", "2"}}, default_struct_prim_values); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkStructComponents({material, {"uniforms", "s_a_struct_prim", "prims", "2"}}, appearance, "s_a_struct_prim.prims[1].", default_struct_prim_values); +} + +TEST_F(MaterialAdaptorTest, link_get_struct_of_array_of_struct_prims_uniforms_link_array) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto interface = create_lua_interface("interface", "scripts/uniform-structs.lua"); + + link(interface, {"inputs", "s_a_struct_prim", "prims"}, material, {"uniforms", "s_a_struct_prim", "prims"}); + setStructComponents({interface, {"inputs", "s_a_struct_prim", "prims", "2"}}, default_struct_prim_values); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkStructComponents({material, {"uniforms", "s_a_struct_prim", "prims", "2"}}, appearance, "s_a_struct_prim.prims[1].", default_struct_prim_values); +} + +TEST_F(MaterialAdaptorTest, link_get_struct_of_array_of_struct_prims_uniforms_link_struct_inner) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto interface = create_lua_interface("interface", "scripts/uniform-structs.lua"); + + link(interface, {"inputs", "s_prims"}, material, {"uniforms", "s_a_struct_prim", "prims", "2"}); + setStructComponents({interface, {"inputs", "s_prims"}}, default_struct_prim_values); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkStructComponents({material, {"uniforms", "s_a_struct_prim", "prims", "2"}}, appearance, "s_a_struct_prim.prims[1].", default_struct_prim_values); +} + +TEST_F(MaterialAdaptorTest, link_get_struct_of_array_of_struct_prims_uniforms_link_members) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto interface = create_lua_interface("interface", "scripts/uniform-structs.lua"); + + linkStructComponents({interface, {"inputs", "s_prims"}}, {material, {"uniforms", "s_a_struct_prim", "prims", "2"}}); + setStructComponents({interface, {"inputs", "s_prims"}}, default_struct_prim_values); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkStructComponents({material, {"uniforms", "s_a_struct_prim", "prims", "2"}}, appearance, "s_a_struct_prim.prims[1].", default_struct_prim_values); +} + +TEST_F(MaterialAdaptorTest, set_get_struct_of_array_of_struct_sampler_uniforms) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto texture = create_texture("texture", "images/DuckCM.png"); + auto buffer = create("buffer"); + auto buffer_ms = create("buffer_ms"); + auto cubeMap = create_cubemap("cubemap", "images/blue_1024.png"); + + commandInterface.set({material, {"uniforms", "s_a_struct_samplers", "samplers", "2", "s_texture"}}, texture); + commandInterface.set({material, {"uniforms", "s_a_struct_samplers", "samplers", "2", "s_cubemap"}}, cubeMap); + commandInterface.set({material, {"uniforms", "s_a_struct_samplers", "samplers", "2", "s_buffer"}}, buffer); + commandInterface.set({material, {"uniforms", "s_a_struct_samplers", "samplers", "2", "s_buffer_ms"}}, buffer_ms); + + dispatch(); + + auto appearance = select(*sceneContext.scene(), "mat_Appearance"); + auto engineTexture = select(*sceneContext.scene(), "texture"); + auto engine_cubeMap = select(*sceneContext.scene(), "cubemap"); + auto engine_buffer = select(*sceneContext.scene(), "buffer"); + auto engine_buffer_ms = select(*sceneContext.scene(), "buffer_ms"); + + checkUniformScalar(appearance, "s_a_struct_samplers.samplers[1].s_texture", engineTexture); + checkUniformScalar(appearance, "s_a_struct_samplers.samplers[1].s_cubemap", engine_cubeMap); + checkUniformScalar(appearance, "s_a_struct_samplers.samplers[1].s_buffer", engine_buffer); + checkUniformScalar(appearance, "s_a_struct_samplers.samplers[1].s_buffer_ms", engine_buffer_ms); +} + +TEST_F(MaterialAdaptorTest, set_get_array_of_struct_of_array_of_struct_prims_uniforms) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + + setStructComponents({material, {"uniforms", "a_s_a_struct_prim", "2", "prims", "2"}}, default_struct_prim_values); + + dispatch(); + + auto appearance{select(*sceneContext.scene(), "mat_Appearance")}; + + checkStructComponents(appearance, "a_s_a_struct_prim[1].prims[1].", default_struct_prim_values); +} + +TEST_F(MaterialAdaptorTest, set_get_array_of_struct_of_array_of_struct_sampler_uniforms) { + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto texture = create_texture("texture", "images/DuckCM.png"); + auto buffer = create("buffer"); + auto buffer_ms = create("buffer_ms"); + auto cubeMap = create_cubemap("cubemap", "images/blue_1024.png"); + + commandInterface.set({material, {"uniforms", "a_s_a_struct_samplers", "2", "samplers", "2", "s_texture"}}, texture); + commandInterface.set({material, {"uniforms", "a_s_a_struct_samplers", "2", "samplers", "2", "s_cubemap"}}, cubeMap); + commandInterface.set({material, {"uniforms", "a_s_a_struct_samplers", "2", "samplers", "2", "s_buffer"}}, buffer); + commandInterface.set({material, {"uniforms", "a_s_a_struct_samplers", "2", "samplers", "2", "s_buffer_ms"}}, buffer_ms); + + dispatch(); + + auto appearance = select(*sceneContext.scene(), "mat_Appearance"); + auto engineTexture = select(*sceneContext.scene(), "texture"); + auto engine_cubeMap = select(*sceneContext.scene(), "cubemap"); + auto engine_buffer = select(*sceneContext.scene(), "buffer"); + auto engine_buffer_ms = select(*sceneContext.scene(), "buffer_ms"); + + checkUniformScalar(appearance, "a_s_a_struct_samplers[1].samplers[1].s_texture", engineTexture); + checkUniformScalar(appearance, "a_s_a_struct_samplers[1].samplers[1].s_cubemap", engine_cubeMap); + checkUniformScalar(appearance, "a_s_a_struct_samplers[1].samplers[1].s_buffer", engine_buffer); + checkUniformScalar(appearance, "a_s_a_struct_samplers[1].samplers[1].s_buffer_ms", engine_buffer_ms); +} diff --git a/components/libRamsesBase/tests/MeshNodeAdaptor_test.cpp b/components/libRamsesBase/tests/MeshNodeAdaptor_test.cpp index 62e1a523..cb7aae6e 100644 --- a/components/libRamsesBase/tests/MeshNodeAdaptor_test.cpp +++ b/components/libRamsesBase/tests/MeshNodeAdaptor_test.cpp @@ -10,6 +10,10 @@ #include #include "RamsesBaseFixture.h" + +#include "AdaptorTestUtils.h" +#include "MaterialAdaptorTestBase.h" + #include "ramses_adaptor/MeshNodeAdaptor.h" #include "ramses_adaptor/SceneAdaptor.h" #include "ramses_adaptor/utilities.h" @@ -18,16 +22,15 @@ using namespace raco; using raco::ramses_adaptor::MeshNodeAdaptor; using raco::ramses_adaptor::SceneAdaptor; -using raco::user_types::RenderBufferMS; using raco::user_types::Material; using raco::user_types::Mesh; using raco::user_types::MeshNode; +using raco::user_types::RenderBufferMS; using raco::user_types::SMeshNode; using raco::user_types::ValueHandle; -class MeshNodeAdaptorFixture : public RamsesBaseFixture<> { +class MeshNodeAdaptorFixture : public MaterialAdaptorTestBase { protected: - template void runMeshNodeConstructionRoutine(bool private_material) { auto mesh = create_mesh("Mesh", "meshes/Duck.glb"); @@ -104,7 +107,6 @@ TEST_F(MeshNodeAdaptorFixture, inContext_userType_MeshNode_name_change) { EXPECT_STREQ("Changed_GeometryBinding", meshNodes[0]->getGeometryBinding()->getName()); } - TEST_F(MeshNodeAdaptorFixture, inContext_userType_MeshNode_withEmptyMesh_constructs_ramsesMeshNode) { auto mesh = context.createObject(Mesh::typeDescription.typeName, "Mesh"); auto meshNode = context.createObject(MeshNode::typeDescription.typeName, "MeshNode Name"); @@ -265,7 +267,6 @@ TEST_F(MeshNodeAdaptorFixture, meshnode_shared_material_is_unique) { EXPECT_EQ(ramsesMeshNode_a->getAppearance(), ramsesMeshNode_b->getAppearance()); } - TEST_F(MeshNodeAdaptorFixture, meshnode_set_depthwrite_mat_private) { auto mesh = create_mesh("Mesh", "meshes/Duck.glb"); auto material = create_material("Material", "shaders/basic.vert", "shaders/basic.frag"); @@ -395,7 +396,7 @@ TEST_F(MeshNodeAdaptorFixture, inContext_user_type_MeshNode_submeshSelection_wro auto mesh = context.createObject(Mesh::typeDescription.typeName, "Mesh"); dispatch(); context.set(ValueHandle{meshNode, {"mesh"}}, mesh); - dispatch(); + dispatch(); context.set(ValueHandle{mesh, {"bakeMeshes"}}, false); dispatch(); context.set(ValueHandle{mesh, {"uri"}}, test_path().append("meshes/Duck.glb").string()); @@ -406,5 +407,152 @@ TEST_F(MeshNodeAdaptorFixture, inContext_user_type_MeshNode_submeshSelection_wro ASSERT_EQ(context.errors().getError(ValueHandle{mesh}).level(), core::ErrorLevel::ERROR); } +TEST_F(MeshNodeAdaptorFixture, set_get_scalar_uniforms) { + auto mesh = create_mesh("mesh", "meshes/Duck.glb"); + auto material = create_material("mat", "shaders/uniform-scalar.vert", "shaders/uniform-scalar.frag"); + auto meshnode = create_meshnode("meshnode", mesh, material); + + context.set(meshnode->getMaterialPrivateHandle(0), true); + + setStructComponents({meshnode, {"materials", "material", "uniforms"}}, default_struct_prim_values); + + dispatch(); + + auto mat_appearance{select(*sceneContext.scene(), "mat_Appearance")}; + auto appearance{select(*sceneContext.scene(), "meshnode_Appearance")}; + EXPECT_NE(mat_appearance, appearance); + + checkStructComponents(appearance, {}, default_struct_prim_values); +} + +TEST_F(MeshNodeAdaptorFixture, link_get_scalar_uniforms) { + auto mesh = create_mesh("mesh", "meshes/Duck.glb"); + auto material = create_material("mat", "shaders/uniform-scalar.vert", "shaders/uniform-scalar.frag"); + auto meshnode = create_meshnode("meshnode", mesh, material); + auto interface = create_lua_interface("interface", "scripts/uniform-structs.lua"); + + context.set(meshnode->getMaterialPrivateHandle(0), true); + + linkStructComponents({interface, {"inputs", "s_prims"}}, {meshnode, {"materials", "material", "uniforms"}}); + setStructComponents({interface, {"inputs", "s_prims"}}, default_struct_prim_values); + + dispatch(); + + auto mat_appearance{select(*sceneContext.scene(), "mat_Appearance")}; + auto appearance{select(*sceneContext.scene(), "meshnode_Appearance")}; + EXPECT_NE(mat_appearance, appearance); + + checkStructComponents({meshnode, {"materials", "material", "uniforms"}}, appearance, {}, default_struct_prim_values); +} + +TEST_F(MeshNodeAdaptorFixture, set_get_array_uniforms) { + auto mesh = create_mesh("mesh", "meshes/Duck.glb"); + auto material = create_material("mat", "shaders/uniform-array.vert", "shaders/uniform-array.frag"); + auto meshnode = create_meshnode("meshnode", mesh, material); + + context.set(meshnode->getMaterialPrivateHandle(0), true); + + commandInterface.set({meshnode, {"materials", "material", "uniforms", "ivec", "2"}}, 2); + commandInterface.set({meshnode, {"materials", "material", "uniforms", "fvec", "3"}}, 3.0); + + commandInterface.set({meshnode, {"materials", "material", "uniforms", "avec2", "4", "y"}}, 4.0); + commandInterface.set({meshnode, {"materials", "material", "uniforms", "avec3", "5", "z"}}, 5.0); + commandInterface.set({meshnode, {"materials", "material", "uniforms", "avec4", "6", "w"}}, 6.0); + + commandInterface.set({meshnode, {"materials", "material", "uniforms", "aivec2", "4", "i2"}}, 7); + commandInterface.set({meshnode, {"materials", "material", "uniforms", "aivec3", "5", "i3"}}, 8); + commandInterface.set({meshnode, {"materials", "material", "uniforms", "aivec4", "6", "i4"}}, 9); + + dispatch(); + + auto mat_appearance{select(*sceneContext.scene(), "mat_Appearance")}; + auto appearance{select(*sceneContext.scene(), "meshnode_Appearance")}; + EXPECT_NE(mat_appearance, appearance); + + checkUniformVector(appearance, "ivec", 1, 2); + checkUniformVector(appearance, "fvec", 2, 3.0); + + checkUniformVector, 4>(appearance, "avec2", 3, {0.0, 4.0}); + checkUniformVector, 5>(appearance, "avec3", 4, {0.0, 0.0, 5.0}); + checkUniformVector, 6>(appearance, "avec4", 5, {0.0, 0.0, 0.0, 6.0}); + + checkUniformVector, 4>(appearance, "aivec2", 3, {0, 7}); + checkUniformVector, 5>(appearance, "aivec3", 4, {0, 0, 8}); + checkUniformVector, 6>(appearance, "aivec4", 5, {0, 0, 0, 9}); +} + +TEST_F(MeshNodeAdaptorFixture, set_get_struct_prim_uniforms) { + auto mesh = create_mesh("mesh", "meshes/Duck.glb"); + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto meshnode = create_meshnode("meshnode", mesh, material); + + context.set(meshnode->getMaterialPrivateHandle(0), true); + + setStructComponents({meshnode, {"materials", "material", "uniforms", "s_prims"}}, default_struct_prim_values); + + dispatch(); + + auto mat_appearance{select(*sceneContext.scene(), "mat_Appearance")}; + auto appearance{select(*sceneContext.scene(), "meshnode_Appearance")}; + EXPECT_NE(mat_appearance, appearance); + + checkStructComponents(appearance, "s_prims.", default_struct_prim_values); +} + +TEST_F(MeshNodeAdaptorFixture, link_get_struct_prim_uniforms_struct) { + auto mesh = create_mesh("mesh", "meshes/Duck.glb"); + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto meshnode = create_meshnode("meshnode", mesh, material); + auto interface = create_lua_interface("interface", "scripts/uniform-structs.lua"); + + context.set(meshnode->getMaterialPrivateHandle(0), true); + + link(interface, {"inputs", "s_prims"}, meshnode, {"materials", "material", "uniforms", "s_prims"}); + setStructComponents({interface, {"inputs", "s_prims"}}, default_struct_prim_values); + + dispatch(); + + auto mat_appearance{select(*sceneContext.scene(), "mat_Appearance")}; + auto appearance{select(*sceneContext.scene(), "meshnode_Appearance")}; + EXPECT_NE(mat_appearance, appearance); + + checkStructComponents({meshnode, {"materials", "material", "uniforms", "s_prims"}}, appearance, "s_prims.", default_struct_prim_values); +} + +TEST_F(MeshNodeAdaptorFixture, link_get_struct_prim_uniforms_members) { + auto mesh = create_mesh("mesh", "meshes/Duck.glb"); + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto meshnode = create_meshnode("meshnode", mesh, material); + auto interface = create_lua_interface("interface", "scripts/uniform-structs.lua"); + + context.set(meshnode->getMaterialPrivateHandle(0), true); + + linkStructComponents({interface, {"inputs", "s_prims"}}, {meshnode, {"materials", "material", "uniforms", "s_prims"}}); + setStructComponents({interface, {"inputs", "s_prims"}}, default_struct_prim_values); + + dispatch(); + + auto mat_appearance{select(*sceneContext.scene(), "mat_Appearance")}; + auto appearance{select(*sceneContext.scene(), "meshnode_Appearance")}; + EXPECT_NE(mat_appearance, appearance); + + checkStructComponents({meshnode, {"materials", "material", "uniforms", "s_prims"}}, appearance, "s_prims.", default_struct_prim_values); +} + +TEST_F(MeshNodeAdaptorFixture, set_get_array_struct_prim_uniforms) { + auto mesh = create_mesh("mesh", "meshes/Duck.glb"); + auto material = create_material("mat", "shaders/uniform-struct.vert", "shaders/uniform-struct.frag"); + auto meshnode = create_meshnode("meshnode", mesh, material); + + context.set(meshnode->getMaterialPrivateHandle(0), true); + setStructComponents({meshnode, {"materials", "material", "uniforms", "a_s_prims", "2"}}, default_struct_prim_values); + dispatch(); + + auto mat_appearance{select(*sceneContext.scene(), "mat_Appearance")}; + auto appearance{select(*sceneContext.scene(), "meshnode_Appearance")}; + EXPECT_NE(mat_appearance, appearance); + + checkStructComponents(appearance, "a_s_prims[1].", default_struct_prim_values); +} diff --git a/components/libRamsesBase/tests/RamsesBaseFixture.h b/components/libRamsesBase/tests/RamsesBaseFixture.h index 54ae12c7..bab8cacd 100644 --- a/components/libRamsesBase/tests/RamsesBaseFixture.h +++ b/components/libRamsesBase/tests/RamsesBaseFixture.h @@ -64,8 +64,11 @@ class RamsesBaseFixture : public TestEnvironmentCoreT { raco::ramses_adaptor::SceneAdaptor sceneContext; bool dispatch() { - dataChangeDispatcher->dispatch(this->recorder.release()); - return sceneContext.logicEngine().update(); + auto dataChanges = this->recorder.release(); + dataChangeDispatcher->dispatch(dataChanges); + auto status = sceneContext.logicEngine().update(); + sceneContext.readDataFromEngine(dataChanges); + return status; } protected: diff --git a/components/libRamsesBase/tests/TimerAdaptor_test.cpp b/components/libRamsesBase/tests/TimerAdaptor_test.cpp index 6cae2bbe..47ea2a2a 100644 --- a/components/libRamsesBase/tests/TimerAdaptor_test.cpp +++ b/components/libRamsesBase/tests/TimerAdaptor_test.cpp @@ -14,16 +14,7 @@ using namespace raco::user_types; -class TimerAdaptorTest : public RamsesBaseFixture<> { -public: - void dispatch() { - auto dataChanges = this->recorder.release(); - - sceneContext.readDataFromEngine(dataChanges); - dataChangeDispatcher->dispatch(dataChanges); - sceneContext.logicEngine().update(); - } -}; +class TimerAdaptorTest : public RamsesBaseFixture<> {}; TEST_F(TimerAdaptorTest, defaultConstruction) { auto timer = context.createObject(Timer::typeDescription.typeName, "Timer"); @@ -88,7 +79,6 @@ TEST_F(TimerAdaptorTest, InputNotZeroGetsPropagated) { commandInterface.set({timer, {"inputs", "ticker_us"}}, val); dispatch(); - dispatch(); ASSERT_EQ((ValueHandle{timer, {"outputs", "ticker_us"}}.asInt64()), val); } @@ -98,11 +88,9 @@ TEST_F(TimerAdaptorTest, InputNotZeroBackToZeroOutputNotZero) { commandInterface.set({timer, {"inputs", "ticker_us"}}, int64_t{233212}); dispatch(); - dispatch(); commandInterface.set({timer, {"inputs", "ticker_us"}}, int64_t{0}); dispatch(); - dispatch(); ASSERT_NE((ValueHandle{timer, {"outputs", "ticker_us"}}.asInt64()), int64_t{0}); } @@ -112,7 +100,6 @@ TEST_F(TimerAdaptorTest, InputBelowZeroNoError) { commandInterface.set({timer, {"inputs", "ticker_us"}}, int64_t{-1}); dispatch(); - dispatch(); ASSERT_FALSE(commandInterface.errors().hasError(timer)); ASSERT_EQ((ValueHandle{timer, {"outputs", "ticker_us"}}.asInt64()), int64_t{-1}); @@ -123,16 +110,13 @@ TEST_F(TimerAdaptorTest, InputNotIncreasingNoError) { commandInterface.set({timer, {"inputs", "ticker_us"}}, int64_t{2}); dispatch(); - dispatch(); commandInterface.set({timer, {"inputs", "ticker_us"}}, int64_t{1}); dispatch(); - dispatch(); ASSERT_FALSE(commandInterface.errors().hasError(timer)); commandInterface.set({timer, {"inputs", "ticker_us"}}, int64_t{0}); dispatch(); - dispatch(); ASSERT_FALSE(commandInterface.errors().hasError(timer)); } diff --git a/datamodel/libCore/include/core/CommandInterface.h b/datamodel/libCore/include/core/CommandInterface.h index 29152b70..a9f39eac 100644 --- a/datamodel/libCore/include/core/CommandInterface.h +++ b/datamodel/libCore/include/core/CommandInterface.h @@ -74,7 +74,7 @@ class CommandInterface { void set(ValueHandle const& handle, std::array const& value); - bool canSetTags(ValueHandle const& handle, std::vector const& value) const; + bool canSetTags(ValueHandle const& handle, std::vector const& value, std::string* outError = nullptr) const; // Set a tag set property // The handle must be a Table property with a TagContainer annotation. diff --git a/datamodel/libCore/include/core/Context.h b/datamodel/libCore/include/core/Context.h index cd3fc322..bae294dd 100644 --- a/datamodel/libCore/include/core/Context.h +++ b/datamodel/libCore/include/core/Context.h @@ -171,6 +171,9 @@ class BaseContext { // generated change recorder entries. Use only during load to fix corrupt files. void initLinkValidity(); + + static void generateNewObjectIDs(std::vector& newObjects); + private: friend class UndoStack; friend class UndoHelpers; diff --git a/datamodel/libCore/include/core/CoreAnnotations.h b/datamodel/libCore/include/core/CoreAnnotations.h index 8146113a..8685c668 100644 --- a/datamodel/libCore/include/core/CoreAnnotations.h +++ b/datamodel/libCore/include/core/CoreAnnotations.h @@ -12,6 +12,11 @@ #include "data_storage/AnnotationBase.h" #include "data_storage/Value.h" +#include "core/EngineInterface.h" + +#include + + namespace raco::core { class URIAnnotation : public raco::data_storage::AnnotationBase { @@ -104,6 +109,11 @@ class ArraySemanticAnnotation : public raco::data_storage::AnnotationBase { } }; +/** + * @brief Marks a Table containing tags used by the rendering system. + * + * Not to be mixed up with UserTagContainerAnnotation +*/ class TagContainerAnnotation : public raco::data_storage::AnnotationBase { public: static inline const TypeDescriptor typeDescription = {"TagContainerAnnotation", false}; @@ -120,6 +130,9 @@ class TagContainerAnnotation : public raco::data_storage::AnnotationBase { } }; +/** + * @brief Marks a Table containing the tags to be rendered by a RenderLayer +*/ class RenderableTagContainerAnnotation : public raco::data_storage::AnnotationBase { public: static inline const TypeDescriptor typeDescription = {"RenderableTagContainerAnnotation", false}; @@ -136,6 +149,27 @@ class RenderableTagContainerAnnotation : public raco::data_storage::AnnotationBa } }; +/** + * @brief Marks a Table property containing user-defined tags. + * + * The user-defined Tags have no special semantics within RamsesComposer +*/ +class UserTagContainerAnnotation : public raco::data_storage::AnnotationBase { +public: + static inline const TypeDescriptor typeDescription = {"UserTagContainerAnnotation", false}; + TypeDescriptor const& getTypeDescription() const override { + return typeDescription; + } + bool serializationRequired() const override { + return false; + } + UserTagContainerAnnotation(const UserTagContainerAnnotation& other) : AnnotationBase({}) {} + UserTagContainerAnnotation() : AnnotationBase({}) {} + UserTagContainerAnnotation& operator=(const UserTagContainerAnnotation& other) { + return *this; + } +}; + class EnumerationAnnotation : public raco::data_storage::AnnotationBase { public: static inline const TypeDescriptor typeDescription = { "EnumerationAnnotation", false }; @@ -148,8 +182,8 @@ class EnumerationAnnotation : public raco::data_storage::AnnotationBase { EnumerationAnnotation(EnumerationAnnotation const& other) : AnnotationBase({{"type", &type_}}), type_(other.type_) {} - EnumerationAnnotation(const int type = 0) : AnnotationBase({{"type", &type_}}), - type_(type) { + EnumerationAnnotation(EUserTypeEnumerations type = EUserTypeEnumerations::Undefined) : AnnotationBase({{"type", &type_}}), + type_(static_cast(type)) { } EnumerationAnnotation& operator=(const EnumerationAnnotation& other) { @@ -157,7 +191,7 @@ class EnumerationAnnotation : public raco::data_storage::AnnotationBase { return *this; } - // This is really a raco::core::EngineEnumeration + // This is really a raco::core::EUserTypeEnumerations raco::data_storage::Value type_; }; diff --git a/datamodel/libCore/include/core/EditorObject.h b/datamodel/libCore/include/core/EditorObject.h index 06667bb4..e382992f 100644 --- a/datamodel/libCore/include/core/EditorObject.h +++ b/datamodel/libCore/include/core/EditorObject.h @@ -193,6 +193,7 @@ class EditorObject : public ClassWithReflectedMembers, public std::enable_shared void fillPropertyDescription() { properties_.emplace_back("objectID", &objectID_); properties_.emplace_back("objectName", &objectName_); + properties_.emplace_back("userTags", &userTags_); properties_.emplace_back("children", &children_); } @@ -200,6 +201,8 @@ class EditorObject : public ClassWithReflectedMembers, public std::enable_shared Property objectID_{ std::string(), HiddenProperty() }; Property objectName_; + Property userTags_{{}, {}, {}, {}, {"User Tags"}}; + // Used to check back pointers in the unit tests. const std::set>& referencesToThis() const; diff --git a/datamodel/libCore/include/core/EngineInterface.h b/datamodel/libCore/include/core/EngineInterface.h index 7a34d266..2d4b42d9 100644 --- a/datamodel/libCore/include/core/EngineInterface.h +++ b/datamodel/libCore/include/core/EngineInterface.h @@ -17,9 +17,9 @@ namespace raco::core { // !!! Careful: !!! -// We can't change the numeric value of the EngineEnumeration members since these +// We can't change the numeric value of the EUserTypeEnumerations members since these // are serialized via the EnumerationAnnotation::type_ property. -enum EngineEnumeration { +enum class EUserTypeEnumerations { Undefined = 0, CullMode = 1, BlendOperation = 2, @@ -148,8 +148,6 @@ class EngineInterface { // @return True indicates success at parsing and extracting the dependencies. If false outError will contain the error message. virtual bool extractLuaDependencies(const std::string& luaScript, std::vector& moduleList, std::string &outError) = 0; - virtual const std::map& enumerationDescription(EngineEnumeration type) const = 0; - virtual std::string luaNameForPrimitiveType(EnginePrimitive engineType) const = 0; }; diff --git a/datamodel/libCore/include/core/ProjectMigration.h b/datamodel/libCore/include/core/ProjectMigration.h index b79392c9..9db935a7 100644 --- a/datamodel/libCore/include/core/ProjectMigration.h +++ b/datamodel/libCore/include/core/ProjectMigration.h @@ -95,9 +95,11 @@ namespace raco::serialization { * 47: Added Skin user type. * 48: Added LuaInterface "stdModules" and "luaModules" properties. * 49: Added TextureExternal user type. + * 50: Added "userTags" property to EditorObject. + * 51: Added support for struct uniforms. */ -constexpr int RAMSES_PROJECT_FILE_VERSION = 49; +constexpr int RAMSES_PROJECT_FILE_VERSION = 51; void migrateProject(ProjectDeserializationInfoIR& deserializedIR, raco::serialization::proxy::ProxyObjectFactory& factory); diff --git a/datamodel/libCore/include/core/ProxyObjectFactory.h b/datamodel/libCore/include/core/ProxyObjectFactory.h index 9549e72d..1fb7a653 100644 --- a/datamodel/libCore/include/core/ProxyObjectFactory.h +++ b/datamodel/libCore/include/core/ProxyObjectFactory.h @@ -30,6 +30,7 @@ using raco::core::EnumerationAnnotation; using raco::core::ArraySemanticAnnotation; using raco::core::HiddenProperty; using raco::core::TagContainerAnnotation; +using raco::core::UserTagContainerAnnotation; using raco::core::ExpectEmptyReference; using raco::core::RenderableTagContainerAnnotation; using raco::core::FeatureLevel; @@ -148,6 +149,7 @@ class ProxyObjectFactory : public raco::core::UserObjectFactoryInterface { // EditorObject Property, + Property, Property, Property, diff --git a/datamodel/libCore/include/core/TagDataCache.h b/datamodel/libCore/include/core/TagDataCache.h index 68c1a5e9..7c3e0920 100644 --- a/datamodel/libCore/include/core/TagDataCache.h +++ b/datamodel/libCore/include/core/TagDataCache.h @@ -30,7 +30,7 @@ namespace raco::core { class Project; -enum class TagType { MaterialTags, NodeTags_Referenced, NodeTags_Referencing }; +enum class TagType { MaterialTags, NodeTags_Referenced, NodeTags_Referencing, UserTags }; class TagDataCache { public: @@ -84,7 +84,7 @@ class TagDataCache { TagDataCache& operator=(TagDataCache const&) = delete; template - void initCache(std::string_view referencingProperty); + void initCache(std::string_view referencingProperty, std::string_view tagProperty, TagType tagType); template std::set> allObjectsWithTag(std::string const& tag) const; diff --git a/datamodel/libCore/src/CommandInterface.cpp b/datamodel/libCore/src/CommandInterface.cpp index 3a8c0dc5..9a89a33d 100644 --- a/datamodel/libCore/src/CommandInterface.cpp +++ b/datamodel/libCore/src/CommandInterface.cpp @@ -123,7 +123,7 @@ void CommandInterface::set(ValueHandle const& handle, bool const& value) { bool CommandInterface::canSet(ValueHandle const& handle, int const& value) const { if (canSetHandle(handle, PrimitiveType::Int) && handle.asInt() != value) { if (auto anno = handle.query()) { - auto description = engineInterface().enumerationDescription(static_cast(anno->type_.asInt())); + auto description = user_types::enumerationDescription(static_cast(anno->type_.asInt())); if (description.find(value) == description.end()) { return false; } @@ -136,7 +136,7 @@ bool CommandInterface::canSet(ValueHandle const& handle, int const& value) const void CommandInterface::set(ValueHandle const& handle, int const& value) { if (checkScalarHandleForSet(handle, PrimitiveType::Int) && handle.asInt() != value) { if (auto anno = handle.query()) { - auto description = engineInterface().enumerationDescription(static_cast(anno->type_.asInt())); + auto description = user_types::enumerationDescription(static_cast(anno->type_.asInt())); if (description.find(value) == description.end()) { throw std::runtime_error(fmt::format("Value '{}' not in enumeration type", value)); } @@ -278,20 +278,28 @@ void CommandInterface::set(ValueHandle const& handle, std::array const& } } -bool CommandInterface::canSetTags(ValueHandle const& handle, std::vector const& value) const { +bool CommandInterface::canSetTags(ValueHandle const& handle, std::vector const& value, std::string* outError) const { if (canSetHandle(handle, PrimitiveType::Table)) { - if (!handle.constValueRef()->query()) { - return false; - } - - std::set forbiddenTags; - Queries::findForbiddenTags(*project(), handle.rootObject(), forbiddenTags); - for (const auto& tag : value) { - if (forbiddenTags.find(tag) != forbiddenTags.end()) { - return false; + if (handle.constValueRef()->query()) { + std::set forbiddenTags; + Queries::findForbiddenTags(*project(), handle.rootObject(), forbiddenTags); + for (const auto& tag : value) { + if (forbiddenTags.find(tag) != forbiddenTags.end()) { + if (outError) { + *outError = fmt::format("Tag '{}' in object '{}' not allowed: would create renderable loop", tag, handle.rootObject()->objectName()); + } + return false; + } } + return true; + } else if (handle.constValueRef()->query()) { + return true; + } else { + if (outError) { + *outError = fmt::format("Property is not a TagContainer property '{}'", handle.getPropertyPath()); + } + return false; } - return true; } return false; } @@ -299,16 +307,9 @@ bool CommandInterface::canSetTags(ValueHandle const& handle, std::vector const& value) { if (checkScalarHandleForSet(handle, PrimitiveType::Table)) { - if (!handle.constValueRef()->query()) { - throw std::runtime_error(fmt::format("Property is not a TagContainer property '{}'", handle.getPropertyPath())); - } - - std::set forbiddenTags; - Queries::findForbiddenTags(*project(), handle.rootObject(), forbiddenTags); - for (const auto& tag : value) { - if (forbiddenTags.find(tag) != forbiddenTags.end()) { - throw std::runtime_error(fmt::format("Tag '{}' in object '{}' not allowed: would create renderable loop", tag, handle.rootObject()->objectName())); - } + std::string errorMsg; + if (!canSetTags(handle, value, &errorMsg)) { + throw std::runtime_error(errorMsg); } if (handle.constValueRef()->asTable().asVector() != value) { diff --git a/datamodel/libCore/src/Context.cpp b/datamodel/libCore/src/Context.cpp index ea65b4c3..c1dc8816 100644 --- a/datamodel/libCore/src/Context.cpp +++ b/datamodel/libCore/src/Context.cpp @@ -584,6 +584,33 @@ void BaseContext::restoreReferences(const Project& project, std::vector& newObjects) { + // Generate new ids: + // Pass 1: everything except PrefabInstance children + std::map prefabInstanceIDMap; + for (auto& editorObject : newObjects) { + if (!editorObject->query()) { + if (!PrefabOperations::findOuterContainingPrefabInstance(editorObject->getParent())) { + auto newId{EditorObject::normalizedObjectID(std::string())}; + prefabInstanceIDMap[newId] = editorObject->objectID(); + editorObject->setObjectID(newId); + } + } + } + // Pass 2: PrefabInstance children + // these are calculated from the containing PrefabInstance object id and need to know the old and new PrefabInstance ID + for (auto& editorObject : newObjects) { + if (!editorObject->query()) { + if (auto inst = PrefabOperations::findOuterContainingPrefabInstance(editorObject->getParent())) { + auto newInstID = inst->objectID(); + auto oldInstID = prefabInstanceIDMap[newInstID]; + auto newID = EditorObject::XorObjectIDs(EditorObject::XorObjectIDs(editorObject->objectID(), oldInstID), newInstID); + editorObject->setObjectID(newID); + } + } + } +} + std::vector BaseContext::pasteObjects(const std::string& seralizedObjects, const SEditorObject& target, bool pasteAsExtref) { auto deserialization_opt{raco::serialization::deserializeObjects(seralizedObjects)}; if (!deserialization_opt) { @@ -643,31 +670,8 @@ std::vector BaseContext::pasteObjects(const std::string& seralize if (!pasteAsExtref) { rerootRelativePaths(newObjects, deserialization); } - - // Generate new ids: - // Pass 1: everything except PrefabInstance children - std::map prefabInstanceIDMap; - for (auto& editorObject : newObjects) { - if (!editorObject->query()) { - if (!PrefabOperations::findOuterContainingPrefabInstance(editorObject->getParent())) { - auto newId{EditorObject::normalizedObjectID(std::string())}; - prefabInstanceIDMap[newId] = editorObject->objectID(); - editorObject->setObjectID(newId); - } - } - } - // Pass 2: PrefabInstance children - // these are calculated from the containing PrefabInstance object id and need to know the old and new PrefabInstance ID - for (auto& editorObject : newObjects) { - if (!editorObject->query()) { - if (auto inst = PrefabOperations::findOuterContainingPrefabInstance(editorObject->getParent())) { - auto newInstID = inst->objectID(); - auto oldInstID = prefabInstanceIDMap[newInstID]; - auto newID = EditorObject::XorObjectIDs(EditorObject::XorObjectIDs(editorObject->objectID(), oldInstID), newInstID); - editorObject->setObjectID(newID); - } - } - } + + BaseContext::generateNewObjectIDs(newObjects); for (auto& editorObject : newObjects) { project_->addInstance(editorObject); diff --git a/datamodel/libCore/src/ExtrefOperations.cpp b/datamodel/libCore/src/ExtrefOperations.cpp index 2a603106..400e6566 100644 --- a/datamodel/libCore/src/ExtrefOperations.cpp +++ b/datamodel/libCore/src/ExtrefOperations.cpp @@ -303,6 +303,14 @@ void ExtrefOperations::updateExternalObjects(BaseContext& context, Project* proj auto changedObjects = localChanges.getAllChangedObjects(); context.performExternalFileReload({changedObjects.begin(), changedObjects.end()}); + // Update validity of links starting on external but ending on local objects + std::map> extrefToLocalLinks = Queries::getLinksConnectedToObjects(*project, localObjects, true, false); + for (const auto& linkCont: extrefToLocalLinks) { + for (const auto& link : linkCont.second) { + context.updateLinkValidity(link); + } + } + project->setExternalReferenceUpdateFailed(false); } diff --git a/datamodel/libCore/src/ProjectMigration.cpp b/datamodel/libCore/src/ProjectMigration.cpp index a545d2da..9869257f 100644 --- a/datamodel/libCore/src/ProjectMigration.cpp +++ b/datamodel/libCore/src/ProjectMigration.cpp @@ -156,6 +156,73 @@ raco::data_storage::ValueBase* createDynamicProperty_V36(raco::core::EnginePrimi return nullptr; } +template +raco::data_storage::ValueBase* createDynamicProperty_V51(core::EnginePrimitive type) { + using namespace raco::serialization::proxy; + using namespace raco::data_storage; + using namespace raco::core; + + switch (type) { + case EnginePrimitive::Bool: + return ProxyObjectFactory::staticCreateProperty({}, {type}, {Args()}...); + break; + case EnginePrimitive::Int32: + case EnginePrimitive::UInt16: + case EnginePrimitive::UInt32: + return ProxyObjectFactory::staticCreateProperty({}, {type}, {Args()}...); + break; + case EnginePrimitive::Int64: + return ProxyObjectFactory::staticCreateProperty({}, {type}, {Args()}...); + break; + case EnginePrimitive::Double: + return ProxyObjectFactory::staticCreateProperty({}, {type}, {Args()}...); + break; + case EnginePrimitive::String: + return ProxyObjectFactory::staticCreateProperty({}, {type}, {Args()}...); + break; + + case EnginePrimitive::Vec2f: + return ProxyObjectFactory::staticCreateProperty({}, {type}, {Args()}...); + break; + case EnginePrimitive::Vec3f: + return ProxyObjectFactory::staticCreateProperty({}, {type}, {Args()}...); + break; + case EnginePrimitive::Vec4f: + return ProxyObjectFactory::staticCreateProperty({}, {type}, {Args()}...); + break; + + case EnginePrimitive::Vec2i: + return ProxyObjectFactory::staticCreateProperty({}, {type}, {Args()}...); + break; + case EnginePrimitive::Vec3i: + return ProxyObjectFactory::staticCreateProperty({}, {type}, {Args()}...); + break; + case EnginePrimitive::Vec4i: + return ProxyObjectFactory::staticCreateProperty({}, {type}, {Args()}...); + break; + + case EnginePrimitive::Array: + case EnginePrimitive::Struct: + return ProxyObjectFactory::staticCreateProperty({}, {type}, {Args()}...); + break; + + case EnginePrimitive::TextureSampler2D: + return ProxyObjectFactory::staticCreateProperty({}, {type}, {Args()}...); + break; + + case EnginePrimitive::TextureSampler2DMS: + return ProxyObjectFactory::staticCreateProperty({}, {type}, {Args()}...); + break; + + case EnginePrimitive::TextureSamplerCube: + return ProxyObjectFactory::staticCreateProperty({}, {type}, {Args()}...); + break; + case EnginePrimitive::TextureSamplerExternal: + return ProxyObjectFactory::staticCreateProperty({}, {type}, {Args()}...); + break; + } + return nullptr; +} raco::data_storage::Table* findItemByValue(raco::data_storage::Table& table, raco::core::SEditorObject obj) { for (size_t i{0}; i < table.size(); i++) { @@ -317,6 +384,85 @@ raco::serialization::proxy::SDynamicEditorObject createInterfaceObjectV36(raco:: return interfaceObj; } +void splitUniformName(std::string uniformName, raco::core::EnginePrimitive componentType, + std::vector& names, + std::vector& types) { + auto dotPos = uniformName.find('.'); + auto bracketPos = uniformName.find('['); + + if (dotPos != std::string::npos && dotPos < bracketPos) { + // struct + // notation: struct.member + auto structName = uniformName.substr(0, dotPos); + std::string memberName = uniformName.substr(dotPos + 1); + + names.emplace_back(structName); + types.emplace_back(core::EnginePrimitive::Struct); + + splitUniformName(memberName, componentType, names, types); + + } else if (bracketPos != std::string::npos && bracketPos < dotPos) { + // array of struct + // notation: array[index].member + auto closeBracketPos = uniformName.find(']'); + if (closeBracketPos != std::string::npos) { + auto arrayName = uniformName.substr(0, bracketPos); + auto indexStr = uniformName.substr(bracketPos + 1, closeBracketPos - bracketPos - 1); + auto index = stoi(indexStr); + auto rest = uniformName.substr(closeBracketPos + 2); + + names.emplace_back(arrayName); + types.emplace_back(core::EnginePrimitive::Array); + + names.emplace_back(std::to_string(index + 1)); + types.emplace_back(core::EnginePrimitive::Struct); + + splitUniformName(rest, componentType, names, types); + } + } else { + // scalar + names.emplace_back(uniformName); + types.emplace_back(componentType); + } +} + +void replaceUniforms_V51(core::Table& uniforms) { + std::vector uniformNames; + for (size_t i = 0; i < uniforms.size(); i++) { + uniformNames.emplace_back(uniforms.name(i)); + } + + for (auto name : uniformNames) { + std::vector names; + std::vector types; + auto type = uniforms.get(name)->query()->type(); + splitUniformName(name, type, names, types); + + if (names.size() > 1) { + core::Table* container = &uniforms; + for (int depth = 0; depth < names.size(); depth++) { + core::ValueBase* newProp; + if (!container->hasProperty(names[depth])) { + newProp = container->addProperty(names[depth], createDynamicProperty_V51(types[depth]), -1); + } else { + newProp = container->get(names[depth]); + } + + if (depth < names.size() - 1) { + container = &newProp->asTable(); + } else { + // tranfer value + auto oldProp = uniforms.get(name); + *newProp = *oldProp; + } + } + + uniforms.removeProperty(name); + } + } +} + + // Limitations // - Annotations and links are handled as static classes: // the class definition is not supposed to change in any observable way: @@ -578,7 +724,7 @@ void migrateProject(ProjectDeserializationInfoIR& deserializedIR, raco::serializ auto renderableTagsProp = new Property{{}, {}, {"Renderable Tags"}}; (*renderableTagsProp)->addProperty("render_main", std::make_unique>(0)); mainLayer->addProperty("renderableTags", renderableTagsProp, -1); - mainLayer->addProperty("sortOrder", new Property{2, {"Render Order"}, raco::core::EngineEnumeration::RenderLayerOrder}, -1); + mainLayer->addProperty("sortOrder", new Property{2, {"Render Order"}, raco::core::EUserTypeEnumerations::RenderLayerOrder}, -1); auto passID = QUuid::createUuid().toString(QUuid::WithoutBraces).toStdString(); auto mainPass = std::make_shared("MainRenderPass", passID); @@ -872,7 +1018,7 @@ void migrateProject(ProjectDeserializationInfoIR& deserializedIR, raco::serializ auto oldProp = dynObj->extractProperty("invertMaterialFilter"); // 1 -> Exclusive, 0 -> Inclusive int newValue = oldProp->asBool() ? 1 : 0; - auto newProp = new Property{newValue, {"Material Filter Mode"}, raco::core::EngineEnumeration::RenderLayerMaterialFilterMode}; + auto newProp = new Property{newValue, {"Material Filter Mode"}, raco::core::EUserTypeEnumerations::RenderLayerMaterialFilterMode}; dynObj->addProperty("materialFilterMode", newProp, -1); } } @@ -1183,6 +1329,59 @@ void migrateProject(ProjectDeserializationInfoIR& deserializedIR, raco::serializ } } } + + // File version 51: Added support for struct uniforms + if (deserializedIR.fileVersion < 51) { + for (const auto& dynObj : deserializedIR.objects) { + auto instanceType = dynObj->serializationTypeName(); + + if (instanceType == "Material" && dynObj->hasProperty("uniforms")) { + auto& uniforms = dynObj->get("uniforms")->asTable(); + replaceUniforms_V51(uniforms); + } + + if (instanceType == "MeshNode" && dynObj->hasProperty("materials")) { + auto* materials = &dynObj->get("materials")->asTable(); + for (size_t i = 0; i < materials->size(); i++) { + Table& matCont = materials->get(i)->asTable(); + Table& uniformsCont = matCont.get("uniforms")->asTable(); + replaceUniforms_V51(uniformsCont); + } + } + } + + auto migrateLink = [](core::SLink link, int numPrefixComponents) { + auto linkEndProps = link->endPropertyNamesVector(); + + std::vector names; + std::vector types; + splitUniformName(linkEndProps[numPrefixComponents], core::EnginePrimitive::Undefined, names, types); + + if (names.size() > 1) { + std::vector newLinkEndProps; + newLinkEndProps.insert(newLinkEndProps.end(), linkEndProps.begin(), linkEndProps.begin() + numPrefixComponents); + newLinkEndProps.insert(newLinkEndProps.end(), names.begin(), names.end()); + newLinkEndProps.insert(newLinkEndProps.end(), linkEndProps.begin() + numPrefixComponents + 1, linkEndProps.end()); + + link->endProp_->set(newLinkEndProps); + } + }; + + for (auto& link : deserializedIR.links) { + auto endType = (*link->endObject_)->serializationTypeName(); + if (endType == "Material") { + auto linkEndProps = link->endPropertyNamesVector(); + if (linkEndProps[0] == "uniforms") { + migrateLink(link, 1); + } + } else if (endType == "MeshNode") { + auto linkEndProps = link->endPropertyNamesVector(); + if (linkEndProps.size() >= 3 && linkEndProps[2] == "uniforms") { + migrateLink(link, 3); + } + } + } + } } } // namespace raco::serialization \ No newline at end of file diff --git a/datamodel/libCore/src/Queries.cpp b/datamodel/libCore/src/Queries.cpp index 741cfbd6..1f386ef5 100644 --- a/datamodel/libCore/src/Queries.cpp +++ b/datamodel/libCore/src/Queries.cpp @@ -457,7 +457,7 @@ bool Queries::isReadOnly(const Project& project, const ValueHandle& handle, bool bool Queries::isHiddenInPropertyBrowser(const Project& project, const ValueHandle& handle) { - if (handle.query() || handle.query()) { + if (handle.query() || handle.query() || handle.query()) { return false; } diff --git a/datamodel/libCore/src/TagDataCache.cpp b/datamodel/libCore/src/TagDataCache.cpp index e0ece905..5003407b 100644 --- a/datamodel/libCore/src/TagDataCache.cpp +++ b/datamodel/libCore/src/TagDataCache.cpp @@ -27,10 +27,13 @@ std::unique_ptr TagDataCache::createTagDataCache(core::Project con switch (whichTags) { case TagType::NodeTags_Referenced: case TagType::NodeTags_Referencing: - cache->initCache("renderableTags"); + cache->initCache("renderableTags", "tags", whichTags); break; case TagType::MaterialTags: - cache->initCache("materialFilterTags"); + cache->initCache("materialFilterTags", "tags", whichTags); + break; + case TagType::UserTags: + cache->initCache>(std::string(), "userTags", whichTags); break; default: assert(false); @@ -45,10 +48,10 @@ TagDataCache::TagDataCache(core::Project const* project, TagType whichTags) : pr } template -void TagDataCache::initCache(std::string_view referencingProperty) { +void TagDataCache::initCache(std::string_view referencingProperty, std::string_view tagProperty, TagType tagType) { assert(tagData_.empty()); for (auto const& instance : project_->instances()) { - if (auto referencingObject = instance->as(); referencingObject != nullptr) { + if (auto referencingObject = instance->as(); referencingObject != nullptr && !referencingProperty.empty()) { core::Table const& tagContainer = instance->get(std::string(referencingProperty))->asTable(); for (auto tagIndex = 0; tagIndex < tagContainer.size(); ++tagIndex) { if (referencingProperty == "renderableTags") { @@ -61,8 +64,8 @@ void TagDataCache::initCache(std::string_view referencingProperty) { } core::ValueHandle referencingPropHandle{referencingObject, {std::string(referencingProperty)}}; } - if (core::Queries::isUserTypeInTypeList(instance, TaggedObjectTypeList{})) { - core::Table const& tagContainer = instance->get(std::string("tags"))->asTable(); + if (tagType == TagType::UserTags || core::Queries::isUserTypeInTypeList(instance, TaggedObjectTypeList{})) { + core::Table const& tagContainer = instance->get(std::string(tagProperty))->asTable(); for (auto tagIndex = 0; tagIndex < tagContainer.size(); ++tagIndex) { std::string const& tag = tagContainer.get(tagIndex)->asString(); addTaggedObject(tag, instance); diff --git a/datamodel/libCore/tests/CMakeLists.txt b/datamodel/libCore/tests/CMakeLists.txt index d8d60347..c7de4a7e 100644 --- a/datamodel/libCore/tests/CMakeLists.txt +++ b/datamodel/libCore/tests/CMakeLists.txt @@ -143,6 +143,14 @@ raco_package_add_test_resources( migrationTestData/scripts/struct-simple.lua migrationTestData/scripts/struct-nested.lua migrationTestData/scripts/interface-scalar-types.lua + migrationTestData/scripts/uniform-array.lua + migrationTestData/scripts/uniform-structs.lua + migrationTestData/shaders/uniform-scalar.vert + migrationTestData/shaders/uniform-scalar.frag + migrationTestData/shaders/uniform-array.vert + migrationTestData/shaders/uniform-array.frag + migrationTestData/shaders/uniform-struct.vert + migrationTestData/shaders/uniform-struct.frag migrationTestData/V35.rca migrationTestData/V35_extref.rca migrationTestData/V35_extref_nested.rca @@ -152,6 +160,7 @@ raco_package_add_test_resources( migrationTestData/V43.rca migrationTestData/V44.rca migrationTestData/V45.rca + migrationTestData/V50.rca migrationTestData/version-current.rca ) add_compile_definitions(libSerialization_test PRIVATE CMAKE_CURRENT_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}") diff --git a/datamodel/libCore/tests/CommandInterface_test.cpp b/datamodel/libCore/tests/CommandInterface_test.cpp index 7d378f2e..9bc4a093 100644 --- a/datamodel/libCore/tests/CommandInterface_test.cpp +++ b/datamodel/libCore/tests/CommandInterface_test.cpp @@ -207,6 +207,16 @@ TEST_F(CommandInterfaceTest, set_tags_fail_loop) { EXPECT_THROW(commandInterface.setTags({layer, &RenderLayer::tags_}, tags), std::runtime_error); } +TEST_F(CommandInterfaceTest, set_usertags_renderlayer_no_loop) { + auto layer = create("layer"); + std::vector tags{"abc"}; + std::vector> renderables{{"abc", 5}, {"def", 3}}; + + commandInterface.setRenderableTags({layer, &RenderLayer::renderableTags_}, renderables); + commandInterface.setTags({layer, &RenderLayer::userTags_}, tags); + EXPECT_EQ(layer->userTags_->asVector(), tags); +} + TEST_F(CommandInterfaceTest, set_tags_fail_loop_multi_hop) { auto layer_1 = create("layer1"); auto layer_2 = create("layer2"); diff --git a/datamodel/libCore/tests/Context_test.cpp b/datamodel/libCore/tests/Context_test.cpp index d2b2a7a5..14ee3b68 100644 --- a/datamodel/libCore/tests/Context_test.cpp +++ b/datamodel/libCore/tests/Context_test.cpp @@ -100,7 +100,7 @@ void print_recursive(ValueHandle& handle, unsigned level = 0) { TEST_F(ContextTest, Complex) { std::shared_ptr script{new MockLuaScript("foo")}; - EXPECT_EQ(script->size(), 5); + EXPECT_EQ(script->size(), 6); double val = *ValueHandle(script, &MockLuaScript::inputs_).get("in_array_struct")[1].get("bar").asVec3f().y; EXPECT_EQ(val, 0); diff --git a/datamodel/libCore/tests/Datamodel_test.cpp b/datamodel/libCore/tests/Datamodel_test.cpp index 9b623725..c8992560 100644 --- a/datamodel/libCore/tests/Datamodel_test.cpp +++ b/datamodel/libCore/tests/Datamodel_test.cpp @@ -48,6 +48,10 @@ TEST_F(DataModelTest, check_user_type_property_annotations) { EXPECT_TRUE(value->type() == PrimitiveType::Table) << fmt::format("{}:{} has TagContainerAnnotation but is not of type Table", name, object->name(index)); } + if (value->query()) { + EXPECT_TRUE(value->type() == PrimitiveType::Table) << fmt::format("{}:{} has UserTagContainerAnnotation but is not of type Table", name, object->name(index)); + } + if (value->query()) { EXPECT_TRUE(value->type() == PrimitiveType::Table) << fmt::format("{}:{} has RenderableTagContainerAnnotation but is not of type Table", name, object->name(index)); } diff --git a/datamodel/libCore/tests/ExternalReference_test.cpp b/datamodel/libCore/tests/ExternalReference_test.cpp index 4e36b2d3..f38a2bd3 100644 --- a/datamodel/libCore/tests/ExternalReference_test.cpp +++ b/datamodel/libCore/tests/ExternalReference_test.cpp @@ -50,14 +50,7 @@ using raco::application::RaCoApplicationLaunchSettings; class ExtrefTest : public RacoBaseTest<> { public: void checkLinks(const std::vector &refLinks) { - EXPECT_EQ(refLinks.size(), project->links().size()); - for (const auto &refLink : refLinks) { - auto projectLink = raco::core::Queries::getLink(*project, refLink.endProp()); - EXPECT_TRUE(projectLink); - EXPECT_TRUE(projectLink->startProp() == refLink.startProp()); - EXPECT_TRUE(projectLink->isValid() == refLink.isValid()); - EXPECT_TRUE(*projectLink->isWeak_ == *refLink.isWeak_); - } + RacoBaseTest::checkLinks(*project, refLinks); } template @@ -2316,6 +2309,51 @@ end }); } +TEST_F(ExtrefTest, link_extref_to_local_update_invalidate) { + auto basePathName{(test_path() / "base.rca").string()}; + auto compositePathName{(test_path() / "composite.rca").string()}; + + TextFile scriptFile = makeFile("script.lua", R"( +function interface(IN,OUT) + IN.v = Type:Vec3f() + OUT.v = Type:Vec3f() +end +function run(IN,OUT) +end +)"); + + TextFile scriptFile_alt = makeFile("script-alt.lua", R"( +function interface(IN,OUT) + IN.v = Type:float() + OUT.v = Type:float() +end +function run(IN,OUT) +end +)"); + + setupBase(basePathName, [this, &scriptFile]() { + auto luaSource = create_lua("luaSource", scriptFile); + }); + + setupComposite(basePathName, compositePathName, {"luaSource"}, [this, &scriptFile]() { + auto luaSource = findExt("luaSource"); + auto luaSink = create_lua("luaSink", scriptFile); + cmd->addLink({luaSource, {"outputs", "v"}}, {luaSink, {"inputs", "v"}}); + checkLinks({{{luaSource, {"outputs", "v"}}, {luaSink, {"inputs", "v"}}, true, false}}); + }); + + updateBase(basePathName, [this, &scriptFile_alt]() { + auto luaSource = find("luaSource"); + cmd->set({luaSource, {"uri"}}, (test_path() / std::string(scriptFile_alt)).string()); + }); + + updateComposite(compositePathName, [this]() { + auto luaSource = findExt("luaSource"); + auto luaSink = findLocal("luaSink"); + checkLinks({{{luaSource, {"outputs", "v"}}, {luaSink, {"inputs", "v"}}, false, false}}); + }); +} + TEST_F(ExtrefTest, timer_in_extref) { auto basePathName1{(test_path() / "base.rca").string()}; auto basePathName2{(test_path() / "base2.rca").string()}; @@ -2492,7 +2530,7 @@ TEST_F(ExtrefTest, link_strong_valid_to_weak_invalid_transition) { checkLinks({{{start, {"outputs", "ofloat"}}, {end, {"inputs", "float"}}, false, true}, {{start, {"outputs", "ofloat"}}, {local_start, {"inputs", "float"}}, true, false}, - {{end, {"outputs", "ofloat"}}, {local_end, {"inputs", "float"}}, true, false}}); + {{end, {"outputs", "ofloat"}}, {local_end, {"inputs", "float"}}, false, false}}); EXPECT_FALSE(project->createsLoop({end, {"outputs", "ofloat"}}, {start, {"inputs", "float"}})); }); } @@ -2578,3 +2616,149 @@ TEST_F(ExtrefTest, feature_level_upgrade_base) { }, 2); } + +TEST_F(ExtrefTest, extref_paste_from_orig_and_save_as_with_new_id_copy) { + auto basePathName1{(test_path() / "base1.rca").string()}; + auto basePathName2{(test_path() / "base2.rca").string()}; + + setupBase( + basePathName1, [this]() { + auto mesh = create("mesh"); + }, + std::string("base")); + + updateComposite(basePathName1, [this, basePathName2]() { + std::string error; + app->saveAsWithNewIDs(QString::fromStdString(basePathName2), error); + }); + + setupGeneric([this, basePathName1, basePathName2]() { + ASSERT_TRUE(pasteFromExt(basePathName1, {"mesh"}, true)); + ASSERT_TRUE(pasteFromExt(basePathName2, {"mesh"}, true)); + }); +} + +TEST_F(ExtrefTest, save_as_with_new_id_preserves_extref_id) { + auto basePathName{(test_path() / "base.rca").string()}; + auto compositePathName{(test_path() / "composite.rca").string()}; + auto compositePathName2{(test_path() / "composite2.rca").string()}; + + setupBase(basePathName, [this]() { + auto prefab = create("prefab"); + }); + + std::string prefabID; + std::string instID; + setupComposite(basePathName, compositePathName, {"prefab"}, [this, &prefabID, &instID]() { + auto prefab = findExt("prefab"); + auto inst = create_prefabInstance("inst", prefab); + prefabID = prefab->objectID(); + instID = prefab->objectID(); + }); + + updateComposite(compositePathName, [this, compositePathName2, prefabID, instID]() { + std::string error; + app->saveAsWithNewIDs(QString::fromStdString(compositePathName2), error); + project = app->activeRaCoProject().project(); + cmd = app->activeRaCoProject().commandInterface(); + + auto prefab = findExt("prefab"); + auto inst = find("inst"); + EXPECT_EQ(prefabID, prefab->objectID()); + EXPECT_NE(instID, inst->objectID()); + }); +} + +TEST_F(ExtrefTest, save_as_with_new_id_preserves_prefabinst_local_properties) { + auto basePathName{(test_path() / "base.rca").string()}; + auto compositePathName{(test_path() / "composite.rca").string()}; + auto compositePathName2{(test_path() / "composite2.rca").string()}; + + setupBase(basePathName, [this]() { + auto prefab = create("prefab"); + TextFile scriptFile = makeFile("interface.lua", R"( +function interface(INOUT) + INOUT.u = Type:Float() + INOUT.v = Type:Float() +end +)"); + auto interface = create("interface", prefab); + cmd->set({interface, {"uri"}}, scriptFile); + cmd->set({interface, {"inputs", "u"}}, 1.0); + }); + + setupComposite(basePathName, compositePathName, {"prefab"}, [this]() { + auto prefab = findExt("prefab"); + auto inst = create_prefabInstance("inst", prefab); + + auto prefab_intf = prefab->children_->asVector()[0]->as(); + auto inst_intf = inst->children_->asVector()[0]->as(); + cmd->set({inst_intf, {"inputs", "u"}}, 0.0); + cmd->set({inst_intf, {"inputs", "v"}}, 2.0); + + EXPECT_EQ(prefab_intf->inputs_->get("u")->asDouble(), 1.0); + EXPECT_EQ(prefab_intf->inputs_->get("v")->asDouble(), 0.0); + EXPECT_EQ(inst_intf->inputs_->get("u")->asDouble(), 0.0); + EXPECT_EQ(inst_intf->inputs_->get("v")->asDouble(), 2.0); + }); + + updateComposite(compositePathName, [this, compositePathName2]() { + std::string error; + app->saveAsWithNewIDs(QString::fromStdString(compositePathName2), error); + project = app->activeRaCoProject().project(); + cmd = app->activeRaCoProject().commandInterface(); + + auto prefab = findExt("prefab"); + auto inst = find("inst"); + + auto prefab_intf = prefab->children_->asVector()[0]->as(); + auto inst_intf = inst->children_->asVector()[0]->as(); + EXPECT_EQ(prefab_intf->inputs_->get("u")->asDouble(), 1.0); + EXPECT_EQ(prefab_intf->inputs_->get("v")->asDouble(), 0.0); + EXPECT_EQ(inst_intf->inputs_->get("u")->asDouble(), 0.0); + EXPECT_EQ(inst_intf->inputs_->get("v")->asDouble(), 2.0); + }); +} + +TEST_F(ExtrefTest, save_as_with_new_id_preserves_prefabinst_local_links) { + auto basePathName{(test_path() / "base.rca").string()}; + auto compositePathName{(test_path() / "composite.rca").string()}; + auto compositePathName2{(test_path() / "composite2.rca").string()}; + + TextFile scriptFile = makeFile("interface.lua", R"( +function interface(INOUT) + INOUT.u = Type:Float() +end +)"); + + setupBase(basePathName, [this, &scriptFile]() { + auto prefab = create("prefab"); + auto interface = create("interface", prefab); + cmd->set({interface, {"uri"}}, scriptFile); + }); + + setupComposite(basePathName, compositePathName, {"prefab"}, [this, &scriptFile]() { + auto prefab = findExt("prefab"); + auto inst = create_prefabInstance("inst", prefab); + auto global_interface = create("global_interface", prefab); + cmd->set({global_interface, {"uri"}}, scriptFile); + + auto inst_intf = inst->children_->asVector()[0]->as(); + cmd->addLink({global_interface, {"inputs", "u"}}, {inst_intf, {"inputs", "u"}}); + + checkLinks({{{global_interface, {"inputs", "u"}}, {inst_intf, {"inputs", "u"}}}}); + }); + + updateComposite(compositePathName, [this, compositePathName2]() { + std::string error; + app->saveAsWithNewIDs(QString::fromStdString(compositePathName2), error); + project = app->activeRaCoProject().project(); + cmd = app->activeRaCoProject().commandInterface(); + + auto inst = find("inst"); + auto global_interface = find("global_interface"); + auto inst_intf = inst->children_->asVector()[0]->as(); + + checkLinks({{{global_interface, {"inputs", "u"}}, {inst_intf, {"inputs", "u"}}}}); + }); +} diff --git a/datamodel/libCore/tests/Handle_test.cpp b/datamodel/libCore/tests/Handle_test.cpp index 15ba56b8..90b8ca4c 100644 --- a/datamodel/libCore/tests/Handle_test.cpp +++ b/datamodel/libCore/tests/Handle_test.cpp @@ -87,7 +87,7 @@ TEST(HandleTests, Node) ValueHandle h = n[i]; propNames.emplace_back(h.getPropName()); } - std::vector refPropNames { "objectID", "objectName", "children", "tags", "visibility", "enabled", "translation", "rotation", "scaling" }; + std::vector refPropNames { "objectID", "objectName", "userTags", "children", "tags", "visibility", "enabled", "translation", "rotation", "scaling" }; EXPECT_EQ(propNames, refPropNames); ValueHandle n_rot = n.get("rotation"); diff --git a/datamodel/libCore/tests/Iterator_test.cpp b/datamodel/libCore/tests/Iterator_test.cpp index e803cfc8..a1da3e9b 100644 --- a/datamodel/libCore/tests/Iterator_test.cpp +++ b/datamodel/libCore/tests/Iterator_test.cpp @@ -76,6 +76,7 @@ TEST(IteratorTest, Property) { std::vector refHandles{ {node, {"objectID"}}, {node, {"objectName"}}, + {node, {"userTags"}}, {node, {"children"}}, {node, {"tags"}}, {node, {"visibility"}}, diff --git a/datamodel/libCore/tests/ProjectMigration_test.cpp b/datamodel/libCore/tests/ProjectMigration_test.cpp index e96a3d10..b903158c 100644 --- a/datamodel/libCore/tests/ProjectMigration_test.cpp +++ b/datamodel/libCore/tests/ProjectMigration_test.cpp @@ -381,7 +381,7 @@ TEST_F(MigrationTest, migrate_from_V21_custom_paths) { if (preferencesFile.exists()) { std::filesystem::remove(preferencesFile); } - + { // use scope to force saving QSettings when leaving the scope QSettings settings(preferencesFile.string().c_str(), QSettings::IniFormat); @@ -465,7 +465,6 @@ TEST_F(MigrationTest, migrate_V30_to_V34) { EXPECT_EQ(*layer_incl->materialFilterMode_, static_cast(raco::user_types::ERenderLayerMaterialFilterMode::Inclusive)); } - TEST_F(MigrationTest, migrate_from_V35) { auto racoproject = loadAndCheckJson(QString::fromStdString((test_path() / "migrationTestData" / "V35.rca").string())); @@ -496,7 +495,7 @@ TEST_F(MigrationTest, migrate_from_V35) { } EXPECT_EQ(nullptr, Queries::getLink(*racoproject->project(), {prefab_int_array, {"inputs", "float_array", "1"}})); - + auto inst_link = Queries::getLink(*racoproject->project(), {inst_int_array, {"inputs", "float_array", "1"}}); EXPECT_TRUE(inst_link != nullptr); EXPECT_EQ(inst_link->startProp(), PropertyDescriptor(inst_lua_types, {"outputs", "bar"})); @@ -646,7 +645,7 @@ TEST_F(MigrationTest, migrate_from_V43) { auto pcam = raco::core::Queries::findByName(racoproject->project()->instances(), "PerspectiveCamera")->as(); ASSERT_EQ(pcam->frustum_->get("nearPlane")->asDouble(), 0.2); - ASSERT_EQ(pcam->frustum_->get("farPlane")->asDouble(), 42.0); // linked + ASSERT_EQ(pcam->frustum_->get("farPlane")->asDouble(), 42.0); // linked ASSERT_EQ(pcam->frustum_->get("fieldOfView")->asDouble(), 4.0); ASSERT_EQ(pcam->frustum_->get("aspectRatio")->asDouble(), 5.0); @@ -694,6 +693,141 @@ TEST_F(MigrationTest, migrate_from_V45) { EXPECT_TRUE(renderTarget->buffer0_.query() != nullptr); } +TEST_F(MigrationTest, migrate_from_V50) { + using namespace raco; + + auto racoproject = loadAndCheckJson(QString::fromStdString((test_path() / "migrationTestData" / "V50.rca").string())); + + auto intf_scalar = raco::core::Queries::findByName(racoproject->project()->instances(), "intf-scalar")->as(); + auto intf_array = raco::core::Queries::findByName(racoproject->project()->instances(), "intf-array")->as(); + auto intf_struct = raco::core::Queries::findByName(racoproject->project()->instances(), "intf-struct")->as(); + + auto texture = raco::core::Queries::findByName(racoproject->project()->instances(), "texture"); + + auto node = raco::core::Queries::findByName(racoproject->project()->instances(), "Node"); + auto meshnode_no_mat = raco::core::Queries::findByName(racoproject->project()->instances(), "meshnode_no_mat"); + + auto mat_scalar = raco::core::Queries::findByName(racoproject->project()->instances(), "mat_scalar")->as(); + EXPECT_EQ(ValueHandle(mat_scalar, {"uniforms", "i"}).asInt(), 2); + checkVec2iValue(ValueHandle(mat_scalar, {"uniforms", "iv2"}), {1, 2}); + + auto mat_array_link_array = raco::core::Queries::findByName(racoproject->project()->instances(), "mat_array_link_array")->as(); + EXPECT_EQ(ValueHandle(mat_array_link_array, {"uniforms", "ivec", "1"}).asInt(), 1); + EXPECT_EQ(ValueHandle(mat_array_link_array, {"uniforms", "ivec", "2"}).asInt(), 2); + + auto mat_array_link_member = raco::core::Queries::findByName(racoproject->project()->instances(), "mat_array_link_member")->as(); + + auto mat_struct = raco::core::Queries::findByName(racoproject->project()->instances(), "mat_struct")->as(); + EXPECT_EQ(ValueHandle(mat_struct, {"uniforms", "s_prims", "i"}).asInt(), 42); + checkVec2iValue(ValueHandle(mat_struct, {"uniforms", "s_prims", "iv2"}), {1, 2}); + + EXPECT_EQ(ValueHandle(mat_struct, {"uniforms", "s_samplers", "s_texture"}).asRef(), texture); + + EXPECT_EQ(ValueHandle(mat_struct, {"uniforms", "nested", "prims", "i"}).asInt(), 42); + checkVec2iValue(ValueHandle(mat_struct, {"uniforms", "nested", "prims", "iv2"}), {1, 2}); + + EXPECT_EQ(ValueHandle(mat_struct, {"uniforms", "a_s_prims", "1", "i"}).asInt(), 42); + checkVec2iValue(ValueHandle(mat_struct, {"uniforms", "a_s_prims", "1", "iv2"}), {1, 2}); + + EXPECT_EQ(ValueHandle(mat_struct, {"uniforms", "s_a_struct_prim", "prims", "1", "i"}).asInt(), 42); + checkVec2iValue(ValueHandle(mat_struct, {"uniforms", "s_a_struct_prim", "prims", "1", "iv2"}), {1, 2}); + + EXPECT_EQ(ValueHandle(mat_struct, {"uniforms", "a_s_a_struct_prim", "1", "prims", "1", "i"}).asInt(), 42); + checkVec2iValue(ValueHandle(mat_struct, {"uniforms", "a_s_a_struct_prim", "1", "prims", "1", "iv2"}), {1, 2}); + + EXPECT_EQ(ValueHandle(mat_struct, {"uniforms", "s_a_prims", "ivec", "1"}).asInt(), 1); + EXPECT_EQ(ValueHandle(mat_struct, {"uniforms", "s_a_prims", "ivec", "2"}).asInt(), 2); + checkVec2iValue(ValueHandle(mat_struct, {"uniforms", "s_a_prims", "aivec2", "1"}), {1, 2}); + checkVec2iValue(ValueHandle(mat_struct, {"uniforms", "s_a_prims", "aivec2", "2"}), {3, 4}); + + + auto meshnode_mat_scalar = raco::core::Queries::findByName(racoproject->project()->instances(), "meshnode_mat_scalar"); + EXPECT_EQ(ValueHandle(meshnode_mat_scalar, {"materials", "material", "uniforms", "i"}).asInt(), 2); + checkVec2iValue(ValueHandle(meshnode_mat_scalar, {"materials", "material", "uniforms", "iv2"}), {1, 2}); + + auto meshnode_mat_array_link_array = raco::core::Queries::findByName(racoproject->project()->instances(), "meshnode_mat_array_link_array"); + EXPECT_EQ(ValueHandle(meshnode_mat_array_link_array, {"materials", "material", "uniforms", "ivec", "1"}).asInt(), 1); + EXPECT_EQ(ValueHandle(meshnode_mat_array_link_array, {"materials", "material", "uniforms", "ivec", "2"}).asInt(), 2); + + auto meshnode_mat_array_link_member = raco::core::Queries::findByName(racoproject->project()->instances(), "meshnode_mat_array_link_member"); + + auto meshnode_mat_struct = raco::core::Queries::findByName(racoproject->project()->instances(), "meshnode_mat_struct"); + EXPECT_EQ(ValueHandle(meshnode_mat_struct, {"materials", "material", "uniforms", "s_prims", "i"}).asInt(), 42); + checkVec2iValue(ValueHandle(meshnode_mat_struct, {"materials", "material", "uniforms", "s_prims", "iv2"}), {1, 2}); + + EXPECT_EQ(ValueHandle(meshnode_mat_struct, {"materials", "material", "uniforms", "s_samplers", "s_texture"}).asRef(), texture); + + EXPECT_EQ(ValueHandle(meshnode_mat_struct, {"materials", "material", "uniforms", "nested", "prims", "i"}).asInt(), 42); + checkVec2iValue(ValueHandle(meshnode_mat_struct, {"materials", "material", "uniforms", "nested", "prims", "iv2"}), {1, 2}); + + EXPECT_EQ(ValueHandle(meshnode_mat_struct, {"materials", "material", "uniforms", "a_s_prims", "1", "i"}).asInt(), 42); + checkVec2iValue(ValueHandle(meshnode_mat_struct, {"materials", "material", "uniforms", "a_s_prims", "1", "iv2"}), {1, 2}); + + EXPECT_EQ(ValueHandle(meshnode_mat_struct, {"materials", "material", "uniforms", "s_a_struct_prim", "prims", "1", "i"}).asInt(), 42); + checkVec2iValue(ValueHandle(meshnode_mat_struct, {"materials", "material", "uniforms", "s_a_struct_prim", "prims", "1", "iv2"}), {1, 2}); + + EXPECT_EQ(ValueHandle(meshnode_mat_struct, {"materials", "material", "uniforms", "a_s_a_struct_prim", "1", "prims", "1", "i"}).asInt(), 42); + checkVec2iValue(ValueHandle(meshnode_mat_struct, {"materials", "material", "uniforms", "a_s_a_struct_prim", "1", "prims", "1", "iv2"}), {1, 2}); + + EXPECT_EQ(ValueHandle(meshnode_mat_struct, {"materials", "material", "uniforms", "s_a_prims", "ivec", "1"}).asInt(), 1); + EXPECT_EQ(ValueHandle(meshnode_mat_struct, {"materials", "material", "uniforms", "s_a_prims", "ivec", "2"}).asInt(), 2); + checkVec2iValue(ValueHandle(meshnode_mat_struct, {"materials", "material", "uniforms", "s_a_prims", "aivec2", "1"}), {1, 2}); + checkVec2iValue(ValueHandle(meshnode_mat_struct, {"materials", "material", "uniforms", "s_a_prims", "aivec2", "2"}), {3, 4}); + + checkLinks(*racoproject->project(), + { + {{intf_scalar, {"inputs", "bool"}}, {node, {"visibility"}}, true, false}, + {{intf_scalar, {"inputs", "bool"}}, {meshnode_no_mat, {"visibility"}}, true, false}, + + {{intf_scalar, {"inputs", "float"}}, {mat_scalar, {"uniforms", "f"}}, true, false}, + {{intf_scalar, {"inputs", "vector2f"}}, {mat_scalar, {"uniforms", "v2"}}, true, false}, + {{intf_array, {"inputs", "fvec"}}, {mat_array_link_array, {"uniforms", "fvec"}}, true, false}, + {{intf_scalar, {"inputs", "float"}}, {mat_array_link_member, {"uniforms", "fvec", "5"}}, true, false}, + {{intf_scalar, {"inputs", "vector3f"}}, {mat_array_link_member, {"uniforms", "avec3", "2"}}, true, false}, + + {{intf_scalar, {"inputs", "float"}}, {mat_struct, {"uniforms", "s_prims", "f"}}, true, false}, + + {{intf_array, {"inputs", "fvec"}}, {mat_struct, {"uniforms", "s_a_prims", "fvec"}}, true, false}, + {{intf_scalar, {"inputs", "vector3f"}}, {mat_struct, {"uniforms", "s_a_prims", "avec3", "1"}}, true, false}, + + {{intf_scalar, {"inputs", "float"}}, {mat_struct, {"uniforms", "nested", "prims", "f"}}, true, false}, + {{intf_scalar, {"inputs", "vector3f"}}, {mat_struct, {"uniforms", "nested", "prims", "v3"}}, true, false}, + + {{intf_scalar, {"inputs", "float"}}, {mat_struct, {"uniforms", "s_a_struct_prim", "prims", "1", "f"}}, true, false}, + {{intf_scalar, {"inputs", "vector3f"}}, {mat_struct, {"uniforms", "s_a_struct_prim", "prims", "1", "v3"}}, true, false}, + + {{intf_scalar, {"inputs", "float"}}, {mat_struct, {"uniforms", "a_s_prims", "1", "f"}}, true, false}, + {{intf_scalar, {"inputs", "vector3f"}}, {mat_struct, {"uniforms", "a_s_prims", "1", "v3"}}, true, false}, + + {{intf_scalar, {"inputs", "float"}}, {mat_struct, {"uniforms", "a_s_a_struct_prim", "1", "prims", "1", "f"}}, true, false}, + {{intf_scalar, {"inputs", "vector3f"}}, {mat_struct, {"uniforms", "a_s_a_struct_prim", "1", "prims", "1", "v3"}}, true, false}, + + + {{intf_scalar, {"inputs", "float"}}, {meshnode_mat_scalar, {"materials", "material", "uniforms", "f"}}, true, false}, + {{intf_scalar, {"inputs", "vector2f"}}, {meshnode_mat_scalar, {"materials", "material", "uniforms", "v2"}}, true, false}, + {{intf_array, {"inputs", "fvec"}}, {meshnode_mat_array_link_array, {"materials", "material", "uniforms", "fvec"}}, true, false}, + {{intf_scalar, {"inputs", "float"}}, {meshnode_mat_array_link_member, {"materials", "material", "uniforms", "fvec", "5"}}, true, false}, + {{intf_scalar, {"inputs", "vector3f"}}, {meshnode_mat_array_link_member, {"materials", "material", "uniforms", "avec3", "2"}}, true, false}, + + {{intf_scalar, {"inputs", "float"}}, {meshnode_mat_struct, {"materials", "material", "uniforms", "s_prims", "f"}}, true, false}, + + {{intf_array, {"inputs", "fvec"}}, {meshnode_mat_struct, {"materials", "material", "uniforms", "s_a_prims", "fvec"}}, true, false}, + {{intf_scalar, {"inputs", "vector3f"}}, {meshnode_mat_struct, {"materials", "material", "uniforms", "s_a_prims", "avec3", "1"}}, true, false}, + + {{intf_scalar, {"inputs", "float"}}, {meshnode_mat_struct, {"materials", "material", "uniforms", "nested", "prims", "f"}}, true, false}, + {{intf_scalar, {"inputs", "vector3f"}}, {meshnode_mat_struct, {"materials", "material", "uniforms", "nested", "prims", "v3"}}, true, false}, + + {{intf_scalar, {"inputs", "float"}}, {meshnode_mat_struct, {"materials", "material", "uniforms", "s_a_struct_prim", "prims", "1", "f"}}, true, false}, + {{intf_scalar, {"inputs", "vector3f"}}, {meshnode_mat_struct, {"materials", "material", "uniforms", "s_a_struct_prim", "prims", "1", "v3"}}, true, false}, + + {{intf_scalar, {"inputs", "float"}}, {meshnode_mat_struct, {"materials", "material", "uniforms", "a_s_prims", "1", "f"}}, true, false}, + {{intf_scalar, {"inputs", "vector3f"}}, {meshnode_mat_struct, {"materials", "material", "uniforms", "a_s_prims", "1", "v3"}}, true, false}, + + {{intf_scalar, {"inputs", "float"}}, {meshnode_mat_struct, {"materials", "material", "uniforms", "a_s_a_struct_prim", "1", "prims", "1", "f"}}, true, false}, + {{intf_scalar, {"inputs", "vector3f"}}, {meshnode_mat_struct, {"materials", "material", "uniforms", "a_s_a_struct_prim", "1", "prims", "1", "v3"}}, true, false} + + }); +} TEST_F(MigrationTest, migrate_from_current) { // Check for changes in serialized JSON in newest version. @@ -780,7 +914,7 @@ TEST_F(MigrationTest, check_proxy_factory_can_create_all_static_properties) { auto& proxyFactory{raco::serialization::proxy::ProxyObjectFactory::getInstance()}; auto& userFactory{UserObjectFactory::getInstance()}; - for (auto& item :userFactory.getTypes()) { + for (auto& item : userFactory.getTypes()) { auto name = item.first; auto object = objectFactory()->createObject(name); ASSERT_TRUE(object != nullptr); diff --git a/datamodel/libCore/tests/migrationTestData/V50.rca b/datamodel/libCore/tests/migrationTestData/V50.rca new file mode 100644 index 00000000..8d504dc5 --- /dev/null +++ b/datamodel/libCore/tests/migrationTestData/V50.rca @@ -0,0 +1,32631 @@ +{ + "externalProjects": { + }, + "featureLevel": 5, + "fileVersion": 50, + "instances": [ + { + "properties": { + "enabled": true, + "instanceCount": { + "annotations": [ + { + "properties": { + "max": 20, + "min": 1 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "materials": { + "order": [ + "material" + ], + "properties": { + "material": { + "order": [ + "material", + "private", + "options", + "uniforms" + ], + "properties": { + "material": { + "typeName": "Material", + "value": null + }, + "options": { + "annotations": [ + { + "properties": { + "name": "Options" + }, + "typeName": "DisplayNameAnnotation" + } + ], + "properties": { + "blendColor": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "blendFactorDestAlpha": 1, + "blendFactorDestColor": 3, + "blendFactorSrcAlpha": 1, + "blendFactorSrcColor": 2, + "blendOperationAlpha": 0, + "blendOperationColor": 0, + "cullmode": 2, + "depthFunction": 4, + "depthwrite": true + }, + "typeName": "BlendOptions::DisplayNameAnnotation" + }, + "private": { + "annotations": [ + { + "properties": { + "name": "Private Material" + }, + "typeName": "DisplayNameAnnotation" + } + ], + "typeName": "Bool::DisplayNameAnnotation", + "value": false + }, + "uniforms": { + "typeName": "Table" + } + }, + "typeName": "Table" + } + } + }, + "mesh": "f6dc8cd1-472e-4a0f-a651-3877d07c1264", + "objectID": "0b04064e-1aaa-4818-82e1-712bef82dc78", + "objectName": "meshnode_no_mat", + "rotation": { + "x": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "scaling": { + "x": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + } + }, + "translation": { + "x": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "visibility": false + }, + "typeName": "MeshNode" + }, + { + "properties": { + "children": { + "properties": [ + { + "typeName": "Ref", + "value": "e14cfbcf-2fac-47fe-84e8-d4108ed3d905" + }, + { + "typeName": "Ref", + "value": "0b04064e-1aaa-4818-82e1-712bef82dc78" + }, + { + "typeName": "Ref", + "value": "642b030c-d1d1-4a28-ae7f-38adb9dfd5ba" + }, + { + "typeName": "Ref", + "value": "9bf4ce1c-e034-4d13-8018-bff7d49b2ca7" + }, + { + "typeName": "Ref", + "value": "e7e85580-a647-4332-b269-05f143f2138f" + } + ] + }, + "enabled": true, + "objectID": "3bb7981a-5a5c-497e-9b38-0ae26e79f5ca", + "objectName": "Node", + "rotation": { + "x": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "scaling": { + "x": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + } + }, + "tags": { + "properties": [ + { + "typeName": "String", + "value": "render_main" + } + ] + }, + "translation": { + "x": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "visibility": false + }, + "typeName": "Node" + }, + { + "properties": { + "inputs": { + "order": [ + "bool", + "float", + "integer", + "integer64", + "string", + "vector2f", + "vector2i", + "vector3f", + "vector3i", + "vector4f", + "vector4i" + ], + "properties": { + "bool": { + "annotations": [ + { + "properties": { + "engineType": 1 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Bool::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": false + }, + "float": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "integer": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "integer64": { + "annotations": [ + { + "properties": { + "engineType": 18 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int64::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": "0" + }, + "string": { + "annotations": [ + { + "properties": { + "engineType": 6 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "String::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": "" + }, + "vector2f": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "vector2i": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "vector3f": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "vector3i": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "vector4f": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "vector4i": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + } + }, + "objectID": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "objectName": "intf-scalar", + "stdModules": { + "base": true, + "debug": true, + "math": true, + "string": true, + "table": true + }, + "uri": "scripts/interface-scalar-types.lua" + }, + "typeName": "LuaInterface" + }, + { + "properties": { + "enabled": true, + "instanceCount": { + "annotations": [ + { + "properties": { + "max": 20, + "min": 1 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "materials": { + "order": [ + "material" + ], + "properties": { + "material": { + "order": [ + "material", + "private", + "options", + "uniforms" + ], + "properties": { + "material": { + "typeName": "Material", + "value": "d78190c5-f339-458d-9ad4-f448cc12f936" + }, + "options": { + "annotations": [ + { + "properties": { + "name": "Options" + }, + "typeName": "DisplayNameAnnotation" + } + ], + "properties": { + "blendColor": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "blendFactorDestAlpha": 1, + "blendFactorDestColor": 3, + "blendFactorSrcAlpha": 1, + "blendFactorSrcColor": 2, + "blendOperationAlpha": 0, + "blendOperationColor": 0, + "cullmode": 2, + "depthFunction": 4, + "depthwrite": true + }, + "typeName": "BlendOptions::DisplayNameAnnotation" + }, + "private": { + "annotations": [ + { + "properties": { + "name": "Private Material" + }, + "typeName": "DisplayNameAnnotation" + } + ], + "typeName": "Bool::DisplayNameAnnotation", + "value": true + }, + "uniforms": { + "order": [ + "scalar", + "ivec", + "fvec", + "avec2", + "avec3", + "avec4", + "aivec2", + "aivec3", + "aivec4" + ], + "properties": { + "aivec2": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "aivec3": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "aivec4": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5", + "6" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "6": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "avec2": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "avec3": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "avec4": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5", + "6" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "6": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "fvec": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "ivec": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 1 + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 2 + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "scalar": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + } + }, + "typeName": "Table" + } + }, + "typeName": "Table" + } + } + }, + "mesh": "f6dc8cd1-472e-4a0f-a651-3877d07c1264", + "objectID": "642b030c-d1d1-4a28-ae7f-38adb9dfd5ba", + "objectName": "meshnode_mat_array_link_array", + "rotation": { + "x": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "scaling": { + "x": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + } + }, + "translation": { + "x": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "visibility": true + }, + "typeName": "MeshNode" + }, + { + "properties": { + "inputs": { + "order": [ + "a_s_prims", + "s_a_prims", + "s_a_struct_prim", + "s_prims" + ], + "properties": { + "a_s_prims": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 13 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "f", + "i", + "iv2", + "iv3", + "iv4", + "v2", + "v3", + "v4" + ], + "properties": { + "f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 13 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "f", + "i", + "iv2", + "iv3", + "iv4", + "v2", + "v3", + "v4" + ], + "properties": { + "f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "s_a_prims": { + "annotations": [ + { + "properties": { + "engineType": 13 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "aivec2", + "aivec3", + "aivec4", + "avec2", + "avec3", + "avec4", + "fvec", + "ivec" + ], + "properties": { + "aivec2": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "aivec3": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "aivec4": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5", + "6" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "6": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "avec2": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "avec3": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "avec4": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5", + "6" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "6": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "fvec": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "ivec": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim": { + "annotations": [ + { + "properties": { + "engineType": 13 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "prims" + ], + "properties": { + "prims": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 13 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "f", + "i", + "iv2", + "iv3", + "iv4", + "v2", + "v3", + "v4" + ], + "properties": { + "f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 13 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "f", + "i", + "iv2", + "iv3", + "iv4", + "v2", + "v3", + "v4" + ], + "properties": { + "f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "s_prims": { + "annotations": [ + { + "properties": { + "engineType": 13 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "f", + "i", + "iv2", + "iv3", + "iv4", + "v2", + "v3", + "v4" + ], + "properties": { + "f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + } + }, + "objectID": "84c914dd-f6f4-40d9-a9a8-74ae41265f0b", + "objectName": "intf-struct", + "stdModules": { + "base": true, + "debug": true, + "math": true, + "string": true, + "table": true + }, + "uri": "scripts/uniform-structs.lua" + }, + "typeName": "LuaInterface" + }, + { + "properties": { + "enabled": true, + "instanceCount": { + "annotations": [ + { + "properties": { + "max": 20, + "min": 1 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "materials": { + "order": [ + "material" + ], + "properties": { + "material": { + "order": [ + "material", + "private", + "options", + "uniforms" + ], + "properties": { + "material": { + "typeName": "Material", + "value": "d2948231-30b7-4f3c-bef1-35fa9bde4590" + }, + "options": { + "annotations": [ + { + "properties": { + "name": "Options" + }, + "typeName": "DisplayNameAnnotation" + } + ], + "properties": { + "blendColor": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "blendFactorDestAlpha": 1, + "blendFactorDestColor": 3, + "blendFactorSrcAlpha": 1, + "blendFactorSrcColor": 2, + "blendOperationAlpha": 0, + "blendOperationColor": 0, + "cullmode": 2, + "depthFunction": 4, + "depthwrite": true + }, + "typeName": "BlendOptions::DisplayNameAnnotation" + }, + "private": { + "annotations": [ + { + "properties": { + "name": "Private Material" + }, + "typeName": "DisplayNameAnnotation" + } + ], + "typeName": "Bool::DisplayNameAnnotation", + "value": true + }, + "uniforms": { + "order": [ + "scalar", + "ivec", + "fvec", + "avec2", + "avec3", + "avec4", + "aivec2", + "aivec3", + "aivec4" + ], + "properties": { + "aivec2": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "aivec3": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "aivec4": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5", + "6" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "6": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "avec2": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "avec3": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "avec4": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5", + "6" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "6": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "fvec": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "ivec": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "scalar": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + } + }, + "typeName": "Table" + } + }, + "typeName": "Table" + } + } + }, + "mesh": "f6dc8cd1-472e-4a0f-a651-3877d07c1264", + "objectID": "9bf4ce1c-e034-4d13-8018-bff7d49b2ca7", + "objectName": "meshnode_mat_array_link_member", + "rotation": { + "x": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "scaling": { + "x": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + } + }, + "translation": { + "x": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "visibility": true + }, + "typeName": "MeshNode" + }, + { + "properties": { + "anisotropy": { + "annotations": [ + { + "properties": { + "max": 32000, + "min": 1 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "flipTexture": false, + "generateMipmaps": false, + "level2uri": "", + "level3uri": "", + "level4uri": "", + "magSamplingMethod": 0, + "minSamplingMethod": 0, + "mipmapLevel": { + "annotations": [ + { + "properties": { + "max": 4, + "min": 1 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "objectID": "afdd39cb-0296-42ac-ae26-6729b229f0d9", + "objectName": "texture", + "textureFormat": 5, + "uri": "../testData/DuckCM.png", + "wrapUMode": 0, + "wrapVMode": 0 + }, + "typeName": "Texture" + }, + { + "properties": { + "enabled": true, + "frustum": { + "order": [ + "nearPlane", + "farPlane", + "fieldOfView", + "aspectRatio" + ], + "properties": { + "aspectRatio": { + "annotations": [ + { + "properties": { + "name": "aspectRatio" + }, + "typeName": "DisplayNameAnnotation" + }, + { + "properties": { + "max": 4, + "min": 0.5 + }, + "typeName": "RangeAnnotationDouble" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::DisplayNameAnnotation::RangeAnnotationDouble::LinkEndAnnotation", + "value": 2 + }, + "farPlane": { + "annotations": [ + { + "properties": { + "name": "farPlane" + }, + "typeName": "DisplayNameAnnotation" + }, + { + "properties": { + "max": 10000, + "min": 100 + }, + "typeName": "RangeAnnotationDouble" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::DisplayNameAnnotation::RangeAnnotationDouble::LinkEndAnnotation", + "value": 1000 + }, + "fieldOfView": { + "annotations": [ + { + "properties": { + "name": "fieldOfView" + }, + "typeName": "DisplayNameAnnotation" + }, + { + "properties": { + "max": 120, + "min": 10 + }, + "typeName": "RangeAnnotationDouble" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::DisplayNameAnnotation::RangeAnnotationDouble::LinkEndAnnotation", + "value": 35 + }, + "nearPlane": { + "annotations": [ + { + "properties": { + "name": "nearPlane" + }, + "typeName": "DisplayNameAnnotation" + }, + { + "properties": { + "max": 1, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::DisplayNameAnnotation::RangeAnnotationDouble::LinkEndAnnotation", + "value": 0.1 + } + } + }, + "frustumType": 0, + "objectID": "b1c9a9e2-ab43-44f2-9c7e-07f3d3cc8f17", + "objectName": "PerspectiveCamera", + "rotation": { + "x": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "scaling": { + "x": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + } + }, + "translation": { + "x": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 10 + } + }, + "viewport": { + "height": { + "annotations": [ + { + "properties": { + "max": 7680, + "min": 1 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 720 + }, + "offsetX": { + "annotations": [ + { + "properties": { + "max": 7680, + "min": -7680 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "offsetY": { + "annotations": [ + { + "properties": { + "max": 7680, + "min": -7680 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "width": { + "annotations": [ + { + "properties": { + "max": 7680, + "min": 1 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1440 + } + }, + "visibility": true + }, + "typeName": "PerspectiveCamera" + }, + { + "properties": { + "objectID": "c443aa5d-2f10-4208-8966-460ad6a730d8", + "objectName": "mat_struct", + "options": { + "blendColor": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "blendFactorDestAlpha": 1, + "blendFactorDestColor": 3, + "blendFactorSrcAlpha": 1, + "blendFactorSrcColor": 2, + "blendOperationAlpha": 0, + "blendOperationColor": 0, + "cullmode": 2, + "depthFunction": 4, + "depthwrite": true + }, + "uniforms": { + "order": [ + "s_prims.i", + "s_prims.f", + "s_prims.v2", + "s_prims.v3", + "s_prims.v4", + "s_prims.iv2", + "s_prims.iv3", + "s_prims.iv4", + "s_samplers.s_texture", + "s_samplers.s_cubemap", + "s_samplers.s_buffer", + "s_samplers.s_buffer_ms", + "s_a_prims.ivec", + "s_a_prims.fvec", + "s_a_prims.avec2", + "s_a_prims.avec3", + "s_a_prims.avec4", + "s_a_prims.aivec2", + "s_a_prims.aivec3", + "s_a_prims.aivec4", + "nested.prims.i", + "nested.prims.f", + "nested.prims.v2", + "nested.prims.v3", + "nested.prims.v4", + "nested.prims.iv2", + "nested.prims.iv3", + "nested.prims.iv4", + "nested.samplers.s_texture", + "nested.samplers.s_cubemap", + "nested.samplers.s_buffer", + "nested.samplers.s_buffer_ms", + "s_a_struct_prim.prims[0].i", + "s_a_struct_prim.prims[0].f", + "s_a_struct_prim.prims[0].v2", + "s_a_struct_prim.prims[0].v3", + "s_a_struct_prim.prims[0].v4", + "s_a_struct_prim.prims[0].iv2", + "s_a_struct_prim.prims[0].iv3", + "s_a_struct_prim.prims[0].iv4", + "s_a_struct_prim.prims[1].i", + "s_a_struct_prim.prims[1].f", + "s_a_struct_prim.prims[1].v2", + "s_a_struct_prim.prims[1].v3", + "s_a_struct_prim.prims[1].v4", + "s_a_struct_prim.prims[1].iv2", + "s_a_struct_prim.prims[1].iv3", + "s_a_struct_prim.prims[1].iv4", + "s_a_struct_samplers.samplers[0].s_texture", + "s_a_struct_samplers.samplers[0].s_cubemap", + "s_a_struct_samplers.samplers[0].s_buffer", + "s_a_struct_samplers.samplers[0].s_buffer_ms", + "s_a_struct_samplers.samplers[1].s_texture", + "s_a_struct_samplers.samplers[1].s_cubemap", + "s_a_struct_samplers.samplers[1].s_buffer", + "s_a_struct_samplers.samplers[1].s_buffer_ms", + "a_s_prims[0].i", + "a_s_prims[0].f", + "a_s_prims[0].v2", + "a_s_prims[0].v3", + "a_s_prims[0].v4", + "a_s_prims[0].iv2", + "a_s_prims[0].iv3", + "a_s_prims[0].iv4", + "a_s_prims[1].i", + "a_s_prims[1].f", + "a_s_prims[1].v2", + "a_s_prims[1].v3", + "a_s_prims[1].v4", + "a_s_prims[1].iv2", + "a_s_prims[1].iv3", + "a_s_prims[1].iv4", + "a_s_samplers[0].s_texture", + "a_s_samplers[0].s_cubemap", + "a_s_samplers[0].s_buffer", + "a_s_samplers[0].s_buffer_ms", + "a_s_samplers[1].s_texture", + "a_s_samplers[1].s_cubemap", + "a_s_samplers[1].s_buffer", + "a_s_samplers[1].s_buffer_ms", + "a_s_a_struct_prim[0].prims[0].i", + "a_s_a_struct_prim[0].prims[0].f", + "a_s_a_struct_prim[0].prims[0].v2", + "a_s_a_struct_prim[0].prims[0].v3", + "a_s_a_struct_prim[0].prims[0].v4", + "a_s_a_struct_prim[0].prims[0].iv2", + "a_s_a_struct_prim[0].prims[0].iv3", + "a_s_a_struct_prim[0].prims[0].iv4", + "a_s_a_struct_prim[0].prims[1].i", + "a_s_a_struct_prim[0].prims[1].f", + "a_s_a_struct_prim[0].prims[1].v2", + "a_s_a_struct_prim[0].prims[1].v3", + "a_s_a_struct_prim[0].prims[1].v4", + "a_s_a_struct_prim[0].prims[1].iv2", + "a_s_a_struct_prim[0].prims[1].iv3", + "a_s_a_struct_prim[0].prims[1].iv4", + "a_s_a_struct_prim[1].prims[0].i", + "a_s_a_struct_prim[1].prims[0].f", + "a_s_a_struct_prim[1].prims[0].v2", + "a_s_a_struct_prim[1].prims[0].v3", + "a_s_a_struct_prim[1].prims[0].v4", + "a_s_a_struct_prim[1].prims[0].iv2", + "a_s_a_struct_prim[1].prims[0].iv3", + "a_s_a_struct_prim[1].prims[0].iv4", + "a_s_a_struct_prim[1].prims[1].i", + "a_s_a_struct_prim[1].prims[1].f", + "a_s_a_struct_prim[1].prims[1].v2", + "a_s_a_struct_prim[1].prims[1].v3", + "a_s_a_struct_prim[1].prims[1].v4", + "a_s_a_struct_prim[1].prims[1].iv2", + "a_s_a_struct_prim[1].prims[1].iv3", + "a_s_a_struct_prim[1].prims[1].iv4", + "a_s_a_struct_samplers[0].samplers[0].s_texture", + "a_s_a_struct_samplers[0].samplers[0].s_cubemap", + "a_s_a_struct_samplers[0].samplers[0].s_buffer", + "a_s_a_struct_samplers[0].samplers[0].s_buffer_ms", + "a_s_a_struct_samplers[0].samplers[1].s_texture", + "a_s_a_struct_samplers[0].samplers[1].s_cubemap", + "a_s_a_struct_samplers[0].samplers[1].s_buffer", + "a_s_a_struct_samplers[0].samplers[1].s_buffer_ms", + "a_s_a_struct_samplers[1].samplers[0].s_texture", + "a_s_a_struct_samplers[1].samplers[0].s_cubemap", + "a_s_a_struct_samplers[1].samplers[0].s_buffer", + "a_s_a_struct_samplers[1].samplers[0].s_buffer_ms", + "a_s_a_struct_samplers[1].samplers[1].s_texture", + "a_s_a_struct_samplers[1].samplers[1].s_cubemap", + "a_s_a_struct_samplers[1].samplers[1].s_buffer", + "a_s_a_struct_samplers[1].samplers[1].s_buffer_ms" + ], + "properties": { + "a_s_a_struct_prim[0].prims[0].f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_a_struct_prim[0].prims[0].i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 42 + }, + "a_s_a_struct_prim[0].prims[0].iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 2 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[0].iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[0].iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[0].v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[0].v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[0].v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[1].f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_a_struct_prim[0].prims[1].i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_a_struct_prim[0].prims[1].iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[1].iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[1].iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[1].v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[1].v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[1].v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[0].f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_a_struct_prim[1].prims[0].i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_a_struct_prim[1].prims[0].iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[0].iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[0].iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[0].v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[0].v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[0].v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[1].f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_a_struct_prim[1].prims[1].i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_a_struct_prim[1].prims[1].iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[1].iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[1].iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[1].v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[1].v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[1].v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_samplers[0].samplers[0].s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[0].samplers[0].s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[0].samplers[0].s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[0].samplers[0].s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[0].samplers[1].s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[0].samplers[1].s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[0].samplers[1].s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[0].samplers[1].s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[1].samplers[0].s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[1].samplers[0].s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[1].samplers[0].s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[1].samplers[0].s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[1].samplers[1].s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[1].samplers[1].s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[1].samplers[1].s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[1].samplers[1].s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_prims[0].f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_prims[0].i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 42 + }, + "a_s_prims[0].iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 2 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[0].iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[0].iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[0].v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[0].v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[0].v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[1].f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_prims[1].i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_prims[1].iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[1].iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[1].iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[1].v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[1].v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[1].v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_samplers[0].s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_samplers[0].s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "a_s_samplers[0].s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "a_s_samplers[0].s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_samplers[1].s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_samplers[1].s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "a_s_samplers[1].s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "a_s_samplers[1].s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "nested.prims.f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "nested.prims.i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 42 + }, + "nested.prims.iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 2 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "nested.prims.iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "nested.prims.iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "nested.prims.v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "nested.prims.v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "nested.prims.v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "nested.samplers.s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "nested.samplers.s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "nested.samplers.s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "nested.samplers.s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "s_a_prims.aivec2": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 2 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 3 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 4 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_prims.aivec3": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_prims.aivec4": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5", + "6" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "6": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_prims.avec2": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_prims.avec3": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_prims.avec4": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5", + "6" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "6": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_prims.fvec": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_prims.ivec": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 1 + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 2 + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[0].f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "s_a_struct_prim.prims[0].i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 42 + }, + "s_a_struct_prim.prims[0].iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 2 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[0].iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[0].iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[0].v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[0].v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[0].v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[1].f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "s_a_struct_prim.prims[1].i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "s_a_struct_prim.prims[1].iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[1].iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[1].iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[1].v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[1].v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[1].v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_samplers.samplers[0].s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "s_a_struct_samplers.samplers[0].s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "s_a_struct_samplers.samplers[0].s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "s_a_struct_samplers.samplers[0].s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "s_a_struct_samplers.samplers[1].s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "s_a_struct_samplers.samplers[1].s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "s_a_struct_samplers.samplers[1].s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "s_a_struct_samplers.samplers[1].s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "s_prims.f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "s_prims.i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 42 + }, + "s_prims.iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 2 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_prims.iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_prims.iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_prims.v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 5 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 2 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_prims.v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_prims.v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_samplers.s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "s_samplers.s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "s_samplers.s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "s_samplers.s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": "afdd39cb-0296-42ac-ae26-6729b229f0d9" + } + } + }, + "uriDefines": "", + "uriFragment": "shaders/uniform-struct.frag", + "uriGeometry": "", + "uriVertex": "shaders/uniform-struct.vert" + }, + "typeName": "Material" + }, + { + "properties": { + "objectID": "c51a5beb-cb1a-4460-b7d8-5da6282cdc11", + "objectName": "mat_scalar", + "options": { + "blendColor": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "blendFactorDestAlpha": 1, + "blendFactorDestColor": 3, + "blendFactorSrcAlpha": 1, + "blendFactorSrcColor": 2, + "blendOperationAlpha": 0, + "blendOperationColor": 0, + "cullmode": 2, + "depthFunction": 4, + "depthwrite": true + }, + "uniforms": { + "order": [ + "i", + "f", + "v2", + "v3", + "v4", + "iv2", + "iv3", + "iv4" + ], + "properties": { + "f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 2 + }, + "iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 2 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + } + } + }, + "uriDefines": "", + "uriFragment": "shaders/uniform-scalar.frag", + "uriGeometry": "", + "uriVertex": "shaders/uniform-scalar.vert" + }, + "typeName": "Material" + }, + { + "properties": { + "objectID": "d2948231-30b7-4f3c-bef1-35fa9bde4590", + "objectName": "mat_array_link_member", + "options": { + "blendColor": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "blendFactorDestAlpha": 1, + "blendFactorDestColor": 3, + "blendFactorSrcAlpha": 1, + "blendFactorSrcColor": 2, + "blendOperationAlpha": 0, + "blendOperationColor": 0, + "cullmode": 2, + "depthFunction": 4, + "depthwrite": true + }, + "uniforms": { + "order": [ + "scalar", + "ivec", + "fvec", + "avec2", + "avec3", + "avec4", + "aivec2", + "aivec3", + "aivec4" + ], + "properties": { + "aivec2": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "aivec3": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "aivec4": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5", + "6" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "6": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "avec2": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "avec3": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "avec4": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5", + "6" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "6": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "fvec": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "ivec": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "scalar": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + } + } + }, + "uriDefines": "", + "uriFragment": "shaders/uniform-array.frag", + "uriGeometry": "", + "uriVertex": "shaders/uniform-array.vert" + }, + "typeName": "Material" + }, + { + "properties": { + "backgroundColor": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "defaultResourceFolders": { + "imageSubdirectory": "images", + "interfaceSubdirectory": "interfaces", + "meshSubdirectory": "meshes", + "scriptSubdirectory": "scripts", + "shaderSubdirectory": "shaders" + }, + "featureLevel": 5, + "objectID": "d557731f-3888-43ba-9022-2cc251dca613", + "objectName": "uniform-struct", + "saveAsZip": false, + "sceneId": { + "annotations": [ + { + "properties": { + "max": 1024, + "min": 1 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 123 + }, + "viewport": { + "i1": { + "annotations": [ + { + "properties": { + "max": 4096, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1440 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 4096, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 720 + } + } + }, + "typeName": "ProjectSettings" + }, + { + "properties": { + "camera": "b1c9a9e2-ab43-44f2-9c7e-07f3d3cc8f17", + "clearColor": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "enableClearColor": true, + "enableClearDepth": true, + "enableClearStencil": true, + "enabled": true, + "layer0": "d9e286e0-1a00-4e91-ae46-9cec3628818e", + "layer1": null, + "layer2": null, + "layer3": null, + "layer4": null, + "layer5": null, + "layer6": null, + "layer7": null, + "objectID": "d56af14b-1516-4b23-bf0c-a7dc6144f99e", + "objectName": "MainRenderPass", + "renderOnce": false, + "renderOrder": 1, + "target": null + }, + "typeName": "RenderPass" + }, + { + "properties": { + "objectID": "d78190c5-f339-458d-9ad4-f448cc12f936", + "objectName": "mat_array_link_array", + "options": { + "blendColor": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "blendFactorDestAlpha": 1, + "blendFactorDestColor": 3, + "blendFactorSrcAlpha": 1, + "blendFactorSrcColor": 2, + "blendOperationAlpha": 0, + "blendOperationColor": 0, + "cullmode": 2, + "depthFunction": 4, + "depthwrite": true + }, + "uniforms": { + "order": [ + "scalar", + "ivec", + "fvec", + "avec2", + "avec3", + "avec4", + "aivec2", + "aivec3", + "aivec4" + ], + "properties": { + "aivec2": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "aivec3": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "aivec4": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5", + "6" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "6": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "avec2": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "avec3": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "avec4": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5", + "6" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "6": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "fvec": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "ivec": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 1 + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 2 + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "scalar": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + } + } + }, + "uriDefines": "", + "uriFragment": "shaders/uniform-array.frag", + "uriGeometry": "", + "uriVertex": "shaders/uniform-array.vert" + }, + "typeName": "Material" + }, + { + "properties": { + "materialFilterMode": 1, + "objectID": "d9e286e0-1a00-4e91-ae46-9cec3628818e", + "objectName": "MainRenderLayer", + "renderableTags": { + "order": [ + "render_main" + ], + "properties": { + "render_main": { + "annotations": [ + { + "properties": { + "featureLevel": 3 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::LinkEndAnnotation", + "value": 0 + } + } + }, + "sortOrder": 0 + }, + "typeName": "RenderLayer" + }, + { + "properties": { + "inputs": { + "order": [ + "aivec2", + "aivec3", + "aivec4", + "avec2", + "avec3", + "avec4", + "fvec", + "ivec" + ], + "properties": { + "aivec2": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "aivec3": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "aivec4": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5", + "6" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "6": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "avec2": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "avec3": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "avec4": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5", + "6" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "6": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "fvec": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + }, + "ivec": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "typeName": "LinkStartAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "value": 0 + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkStartAnnotation::LinkEndAnnotation" + } + } + }, + "objectID": "dc75ba18-b463-4afa-a6ca-4b2bb0fb861e", + "objectName": "intf-array", + "stdModules": { + "base": true, + "debug": true, + "math": true, + "string": true, + "table": true + }, + "uri": "scripts/uniform-array.lua" + }, + "typeName": "LuaInterface" + }, + { + "properties": { + "enabled": true, + "instanceCount": { + "annotations": [ + { + "properties": { + "max": 20, + "min": 1 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "materials": { + "order": [ + "material" + ], + "properties": { + "material": { + "order": [ + "material", + "private", + "options", + "uniforms" + ], + "properties": { + "material": { + "typeName": "Material", + "value": "c51a5beb-cb1a-4460-b7d8-5da6282cdc11" + }, + "options": { + "annotations": [ + { + "properties": { + "name": "Options" + }, + "typeName": "DisplayNameAnnotation" + } + ], + "properties": { + "blendColor": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "blendFactorDestAlpha": 1, + "blendFactorDestColor": 3, + "blendFactorSrcAlpha": 1, + "blendFactorSrcColor": 2, + "blendOperationAlpha": 0, + "blendOperationColor": 0, + "cullmode": 2, + "depthFunction": 4, + "depthwrite": true + }, + "typeName": "BlendOptions::DisplayNameAnnotation" + }, + "private": { + "annotations": [ + { + "properties": { + "name": "Private Material" + }, + "typeName": "DisplayNameAnnotation" + } + ], + "typeName": "Bool::DisplayNameAnnotation", + "value": true + }, + "uniforms": { + "order": [ + "i", + "f", + "v2", + "v3", + "v4", + "iv2", + "iv3", + "iv4" + ], + "properties": { + "f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 2 + }, + "iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 2 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table" + } + }, + "typeName": "Table" + } + } + }, + "mesh": "f6dc8cd1-472e-4a0f-a651-3877d07c1264", + "objectID": "e14cfbcf-2fac-47fe-84e8-d4108ed3d905", + "objectName": "meshnode_mat_scalar", + "rotation": { + "x": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "scaling": { + "x": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + } + }, + "translation": { + "x": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "visibility": true + }, + "typeName": "MeshNode" + }, + { + "properties": { + "enabled": true, + "instanceCount": { + "annotations": [ + { + "properties": { + "max": 20, + "min": 1 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "materials": { + "order": [ + "material" + ], + "properties": { + "material": { + "order": [ + "material", + "private", + "options", + "uniforms" + ], + "properties": { + "material": { + "typeName": "Material", + "value": "c443aa5d-2f10-4208-8966-460ad6a730d8" + }, + "options": { + "annotations": [ + { + "properties": { + "name": "Options" + }, + "typeName": "DisplayNameAnnotation" + } + ], + "properties": { + "blendColor": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "blendFactorDestAlpha": 1, + "blendFactorDestColor": 3, + "blendFactorSrcAlpha": 1, + "blendFactorSrcColor": 2, + "blendOperationAlpha": 0, + "blendOperationColor": 0, + "cullmode": 2, + "depthFunction": 4, + "depthwrite": true + }, + "typeName": "BlendOptions::DisplayNameAnnotation" + }, + "private": { + "annotations": [ + { + "properties": { + "name": "Private Material" + }, + "typeName": "DisplayNameAnnotation" + } + ], + "typeName": "Bool::DisplayNameAnnotation", + "value": true + }, + "uniforms": { + "order": [ + "s_prims.i", + "s_prims.f", + "s_prims.v2", + "s_prims.v3", + "s_prims.v4", + "s_prims.iv2", + "s_prims.iv3", + "s_prims.iv4", + "s_samplers.s_texture", + "s_samplers.s_cubemap", + "s_samplers.s_buffer", + "s_samplers.s_buffer_ms", + "s_a_prims.ivec", + "s_a_prims.fvec", + "s_a_prims.avec2", + "s_a_prims.avec3", + "s_a_prims.avec4", + "s_a_prims.aivec2", + "s_a_prims.aivec3", + "s_a_prims.aivec4", + "nested.prims.i", + "nested.prims.f", + "nested.prims.v2", + "nested.prims.v3", + "nested.prims.v4", + "nested.prims.iv2", + "nested.prims.iv3", + "nested.prims.iv4", + "nested.samplers.s_texture", + "nested.samplers.s_cubemap", + "nested.samplers.s_buffer", + "nested.samplers.s_buffer_ms", + "s_a_struct_prim.prims[0].i", + "s_a_struct_prim.prims[0].f", + "s_a_struct_prim.prims[0].v2", + "s_a_struct_prim.prims[0].v3", + "s_a_struct_prim.prims[0].v4", + "s_a_struct_prim.prims[0].iv2", + "s_a_struct_prim.prims[0].iv3", + "s_a_struct_prim.prims[0].iv4", + "s_a_struct_prim.prims[1].i", + "s_a_struct_prim.prims[1].f", + "s_a_struct_prim.prims[1].v2", + "s_a_struct_prim.prims[1].v3", + "s_a_struct_prim.prims[1].v4", + "s_a_struct_prim.prims[1].iv2", + "s_a_struct_prim.prims[1].iv3", + "s_a_struct_prim.prims[1].iv4", + "s_a_struct_samplers.samplers[0].s_texture", + "s_a_struct_samplers.samplers[0].s_cubemap", + "s_a_struct_samplers.samplers[0].s_buffer", + "s_a_struct_samplers.samplers[0].s_buffer_ms", + "s_a_struct_samplers.samplers[1].s_texture", + "s_a_struct_samplers.samplers[1].s_cubemap", + "s_a_struct_samplers.samplers[1].s_buffer", + "s_a_struct_samplers.samplers[1].s_buffer_ms", + "a_s_prims[0].i", + "a_s_prims[0].f", + "a_s_prims[0].v2", + "a_s_prims[0].v3", + "a_s_prims[0].v4", + "a_s_prims[0].iv2", + "a_s_prims[0].iv3", + "a_s_prims[0].iv4", + "a_s_prims[1].i", + "a_s_prims[1].f", + "a_s_prims[1].v2", + "a_s_prims[1].v3", + "a_s_prims[1].v4", + "a_s_prims[1].iv2", + "a_s_prims[1].iv3", + "a_s_prims[1].iv4", + "a_s_samplers[0].s_texture", + "a_s_samplers[0].s_cubemap", + "a_s_samplers[0].s_buffer", + "a_s_samplers[0].s_buffer_ms", + "a_s_samplers[1].s_texture", + "a_s_samplers[1].s_cubemap", + "a_s_samplers[1].s_buffer", + "a_s_samplers[1].s_buffer_ms", + "a_s_a_struct_prim[0].prims[0].i", + "a_s_a_struct_prim[0].prims[0].f", + "a_s_a_struct_prim[0].prims[0].v2", + "a_s_a_struct_prim[0].prims[0].v3", + "a_s_a_struct_prim[0].prims[0].v4", + "a_s_a_struct_prim[0].prims[0].iv2", + "a_s_a_struct_prim[0].prims[0].iv3", + "a_s_a_struct_prim[0].prims[0].iv4", + "a_s_a_struct_prim[0].prims[1].i", + "a_s_a_struct_prim[0].prims[1].f", + "a_s_a_struct_prim[0].prims[1].v2", + "a_s_a_struct_prim[0].prims[1].v3", + "a_s_a_struct_prim[0].prims[1].v4", + "a_s_a_struct_prim[0].prims[1].iv2", + "a_s_a_struct_prim[0].prims[1].iv3", + "a_s_a_struct_prim[0].prims[1].iv4", + "a_s_a_struct_prim[1].prims[0].i", + "a_s_a_struct_prim[1].prims[0].f", + "a_s_a_struct_prim[1].prims[0].v2", + "a_s_a_struct_prim[1].prims[0].v3", + "a_s_a_struct_prim[1].prims[0].v4", + "a_s_a_struct_prim[1].prims[0].iv2", + "a_s_a_struct_prim[1].prims[0].iv3", + "a_s_a_struct_prim[1].prims[0].iv4", + "a_s_a_struct_prim[1].prims[1].i", + "a_s_a_struct_prim[1].prims[1].f", + "a_s_a_struct_prim[1].prims[1].v2", + "a_s_a_struct_prim[1].prims[1].v3", + "a_s_a_struct_prim[1].prims[1].v4", + "a_s_a_struct_prim[1].prims[1].iv2", + "a_s_a_struct_prim[1].prims[1].iv3", + "a_s_a_struct_prim[1].prims[1].iv4", + "a_s_a_struct_samplers[0].samplers[0].s_texture", + "a_s_a_struct_samplers[0].samplers[0].s_cubemap", + "a_s_a_struct_samplers[0].samplers[0].s_buffer", + "a_s_a_struct_samplers[0].samplers[0].s_buffer_ms", + "a_s_a_struct_samplers[0].samplers[1].s_texture", + "a_s_a_struct_samplers[0].samplers[1].s_cubemap", + "a_s_a_struct_samplers[0].samplers[1].s_buffer", + "a_s_a_struct_samplers[0].samplers[1].s_buffer_ms", + "a_s_a_struct_samplers[1].samplers[0].s_texture", + "a_s_a_struct_samplers[1].samplers[0].s_cubemap", + "a_s_a_struct_samplers[1].samplers[0].s_buffer", + "a_s_a_struct_samplers[1].samplers[0].s_buffer_ms", + "a_s_a_struct_samplers[1].samplers[1].s_texture", + "a_s_a_struct_samplers[1].samplers[1].s_cubemap", + "a_s_a_struct_samplers[1].samplers[1].s_buffer", + "a_s_a_struct_samplers[1].samplers[1].s_buffer_ms" + ], + "properties": { + "a_s_a_struct_prim[0].prims[0].f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_a_struct_prim[0].prims[0].i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 42 + }, + "a_s_a_struct_prim[0].prims[0].iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 2 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[0].iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[0].iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[0].v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[0].v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[0].v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[1].f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_a_struct_prim[0].prims[1].i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_a_struct_prim[0].prims[1].iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[1].iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[1].iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[1].v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[1].v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[0].prims[1].v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[0].f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_a_struct_prim[1].prims[0].i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_a_struct_prim[1].prims[0].iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[0].iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[0].iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[0].v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[0].v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[0].v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[1].f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_a_struct_prim[1].prims[1].i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_a_struct_prim[1].prims[1].iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[1].iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[1].iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[1].v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[1].v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_prim[1].prims[1].v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_a_struct_samplers[0].samplers[0].s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[0].samplers[0].s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[0].samplers[0].s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[0].samplers[0].s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[0].samplers[1].s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[0].samplers[1].s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[0].samplers[1].s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[0].samplers[1].s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[1].samplers[0].s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[1].samplers[0].s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[1].samplers[0].s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[1].samplers[0].s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[1].samplers[1].s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[1].samplers[1].s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[1].samplers[1].s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "a_s_a_struct_samplers[1].samplers[1].s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_prims[0].f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_prims[0].i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 42 + }, + "a_s_prims[0].iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 2 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[0].iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": -1 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[0].iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[0].v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[0].v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[0].v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[1].f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_prims[1].i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "a_s_prims[1].iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[1].iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[1].iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[1].v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[1].v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_prims[1].v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "a_s_samplers[0].s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_samplers[0].s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "a_s_samplers[0].s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "a_s_samplers[0].s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_samplers[1].s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "a_s_samplers[1].s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "a_s_samplers[1].s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "a_s_samplers[1].s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "nested.prims.f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "nested.prims.i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 42 + }, + "nested.prims.iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 2 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "nested.prims.iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "nested.prims.iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "nested.prims.v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "nested.prims.v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "nested.prims.v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "nested.samplers.s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "nested.samplers.s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "nested.samplers.s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "nested.samplers.s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "s_a_prims.aivec2": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 2 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 3 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 4 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_prims.aivec3": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_prims.aivec4": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5", + "6" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "6": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_prims.avec2": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_prims.avec3": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_prims.avec4": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5", + "6" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "6": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_prims.fvec": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2", + "3", + "4", + "5" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "3": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "4": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "5": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_prims.ivec": { + "annotations": [ + { + "properties": { + "engineType": 14 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "order": [ + "1", + "2" + ], + "properties": { + "1": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 1 + }, + "2": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 2 + } + }, + "typeName": "Table::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[0].f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "s_a_struct_prim.prims[0].i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 42 + }, + "s_a_struct_prim.prims[0].iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 2 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[0].iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[0].iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[0].v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[0].v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[0].v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[1].f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "s_a_struct_prim.prims[1].i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "s_a_struct_prim.prims[1].iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[1].iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[1].iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[1].v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[1].v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_prim.prims[1].v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_a_struct_samplers.samplers[0].s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "s_a_struct_samplers.samplers[0].s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "s_a_struct_samplers.samplers[0].s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "s_a_struct_samplers.samplers[0].s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "s_a_struct_samplers.samplers[1].s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "s_a_struct_samplers.samplers[1].s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "s_a_struct_samplers.samplers[1].s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "s_a_struct_samplers.samplers[1].s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "s_prims.f": { + "annotations": [ + { + "properties": { + "engineType": 5 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Double::EngineTypeAnnotation::LinkEndAnnotation", + "value": 0 + }, + "s_prims.i": { + "annotations": [ + { + "properties": { + "engineType": 2 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "typeName": "Int::EngineTypeAnnotation::LinkEndAnnotation", + "value": 42 + }, + "s_prims.iv2": { + "annotations": [ + { + "properties": { + "engineType": 10 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 1 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 2 + } + }, + "typeName": "Vec2i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_prims.iv3": { + "annotations": [ + { + "properties": { + "engineType": 11 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec3i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_prims.iv4": { + "annotations": [ + { + "properties": { + "engineType": 12 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "i1": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i2": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i3": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + }, + "i4": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationInt" + } + ], + "value": 0 + } + }, + "typeName": "Vec4i::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_prims.v2": { + "annotations": [ + { + "properties": { + "engineType": 7 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 5 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 2 + } + }, + "typeName": "Vec2f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_prims.v3": { + "annotations": [ + { + "properties": { + "engineType": 8 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec3f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_prims.v4": { + "annotations": [ + { + "properties": { + "engineType": 9 + }, + "typeName": "EngineTypeAnnotation" + }, + { + "properties": { + "featureLevel": 1 + }, + "typeName": "LinkEndAnnotation" + } + ], + "properties": { + "w": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "x": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 1, + "min": 0 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "typeName": "Vec4f::EngineTypeAnnotation::LinkEndAnnotation" + }, + "s_samplers.s_buffer": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": null + }, + "s_samplers.s_buffer_ms": { + "annotations": [ + { + "properties": { + "engineType": 19 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "RenderBufferMS::EngineTypeAnnotation", + "value": null + }, + "s_samplers.s_cubemap": { + "annotations": [ + { + "properties": { + "engineType": 17 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "CubeMap::EngineTypeAnnotation", + "value": null + }, + "s_samplers.s_texture": { + "annotations": [ + { + "properties": { + "engineType": 15 + }, + "typeName": "EngineTypeAnnotation" + } + ], + "typeName": "TextureSampler2DBase::EngineTypeAnnotation", + "value": "afdd39cb-0296-42ac-ae26-6729b229f0d9" + } + }, + "typeName": "Table" + } + }, + "typeName": "Table" + } + } + }, + "mesh": "f6dc8cd1-472e-4a0f-a651-3877d07c1264", + "objectID": "e7e85580-a647-4332-b269-05f143f2138f", + "objectName": "meshnode_mat_struct", + "rotation": { + "x": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 360, + "min": -360 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "scaling": { + "x": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 100, + "min": 0.1 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 1 + } + }, + "translation": { + "x": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "y": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + }, + "z": { + "annotations": [ + { + "properties": { + "max": 100, + "min": -100 + }, + "typeName": "RangeAnnotationDouble" + } + ], + "value": 0 + } + }, + "visibility": true + }, + "typeName": "MeshNode" + }, + { + "properties": { + "bakeMeshes": true, + "materialNames": { + "properties": [ + { + "typeName": "String", + "value": "material" + } + ] + }, + "meshIndex": 0, + "objectID": "f6dc8cd1-472e-4a0f-a651-3877d07c1264", + "objectName": "Mesh", + "uri": "../testData/duck.glb" + }, + "typeName": "Mesh" + } + ], + "links": [ + { + "properties": { + "endObject": "0b04064e-1aaa-4818-82e1-712bef82dc78", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "visibility" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "bool" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "3bb7981a-5a5c-497e-9b38-0ae26e79f5ca", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "visibility" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "bool" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "9bf4ce1c-e034-4d13-8018-bff7d49b2ca7", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "materials" + }, + { + "typeName": "String", + "value": "material" + }, + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "fvec" + }, + { + "typeName": "String", + "value": "5" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "float" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "c443aa5d-2f10-4208-8966-460ad6a730d8", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "a_s_a_struct_prim[0].prims[0].f" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "float" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "c443aa5d-2f10-4208-8966-460ad6a730d8", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "a_s_prims[0].f" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "float" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "c443aa5d-2f10-4208-8966-460ad6a730d8", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "nested.prims.f" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "float" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "c443aa5d-2f10-4208-8966-460ad6a730d8", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "s_a_struct_prim.prims[0].f" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "float" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "c443aa5d-2f10-4208-8966-460ad6a730d8", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "s_prims.f" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "float" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "c51a5beb-cb1a-4460-b7d8-5da6282cdc11", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "f" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "float" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "d2948231-30b7-4f3c-bef1-35fa9bde4590", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "fvec" + }, + { + "typeName": "String", + "value": "5" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "float" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "e14cfbcf-2fac-47fe-84e8-d4108ed3d905", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "materials" + }, + { + "typeName": "String", + "value": "material" + }, + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "f" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "float" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "e7e85580-a647-4332-b269-05f143f2138f", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "materials" + }, + { + "typeName": "String", + "value": "material" + }, + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "a_s_a_struct_prim[0].prims[0].f" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "float" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "e7e85580-a647-4332-b269-05f143f2138f", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "materials" + }, + { + "typeName": "String", + "value": "material" + }, + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "a_s_prims[0].f" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "float" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "e7e85580-a647-4332-b269-05f143f2138f", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "materials" + }, + { + "typeName": "String", + "value": "material" + }, + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "nested.prims.f" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "float" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "e7e85580-a647-4332-b269-05f143f2138f", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "materials" + }, + { + "typeName": "String", + "value": "material" + }, + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "s_a_struct_prim.prims[0].f" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "float" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "e7e85580-a647-4332-b269-05f143f2138f", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "materials" + }, + { + "typeName": "String", + "value": "material" + }, + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "s_prims.f" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "float" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "c51a5beb-cb1a-4460-b7d8-5da6282cdc11", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "v2" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "vector2f" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "e14cfbcf-2fac-47fe-84e8-d4108ed3d905", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "materials" + }, + { + "typeName": "String", + "value": "material" + }, + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "v2" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "vector2f" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "9bf4ce1c-e034-4d13-8018-bff7d49b2ca7", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "materials" + }, + { + "typeName": "String", + "value": "material" + }, + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "avec3" + }, + { + "typeName": "String", + "value": "2" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "vector3f" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "c443aa5d-2f10-4208-8966-460ad6a730d8", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "a_s_a_struct_prim[0].prims[0].v3" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "vector3f" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "c443aa5d-2f10-4208-8966-460ad6a730d8", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "a_s_prims[0].v3" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "vector3f" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "c443aa5d-2f10-4208-8966-460ad6a730d8", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "nested.prims.v3" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "vector3f" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "c443aa5d-2f10-4208-8966-460ad6a730d8", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "s_a_prims.avec3" + }, + { + "typeName": "String", + "value": "1" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "vector3f" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "c443aa5d-2f10-4208-8966-460ad6a730d8", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "s_a_struct_prim.prims[0].v3" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "vector3f" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "d2948231-30b7-4f3c-bef1-35fa9bde4590", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "avec3" + }, + { + "typeName": "String", + "value": "2" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "vector3f" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "e7e85580-a647-4332-b269-05f143f2138f", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "materials" + }, + { + "typeName": "String", + "value": "material" + }, + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "a_s_a_struct_prim[0].prims[0].v3" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "vector3f" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "e7e85580-a647-4332-b269-05f143f2138f", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "materials" + }, + { + "typeName": "String", + "value": "material" + }, + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "a_s_prims[0].v3" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "vector3f" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "e7e85580-a647-4332-b269-05f143f2138f", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "materials" + }, + { + "typeName": "String", + "value": "material" + }, + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "nested.prims.v3" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "vector3f" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "e7e85580-a647-4332-b269-05f143f2138f", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "materials" + }, + { + "typeName": "String", + "value": "material" + }, + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "s_a_prims.avec3" + }, + { + "typeName": "String", + "value": "1" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "vector3f" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "e7e85580-a647-4332-b269-05f143f2138f", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "materials" + }, + { + "typeName": "String", + "value": "material" + }, + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "s_a_struct_prim.prims[0].v3" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "3c1c0971-31a8-45b7-8be6-a96e0ac1639a", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "vector3f" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "642b030c-d1d1-4a28-ae7f-38adb9dfd5ba", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "materials" + }, + { + "typeName": "String", + "value": "material" + }, + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "fvec" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "dc75ba18-b463-4afa-a6ca-4b2bb0fb861e", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "fvec" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "c443aa5d-2f10-4208-8966-460ad6a730d8", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "s_a_prims.fvec" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "dc75ba18-b463-4afa-a6ca-4b2bb0fb861e", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "fvec" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "d78190c5-f339-458d-9ad4-f448cc12f936", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "fvec" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "dc75ba18-b463-4afa-a6ca-4b2bb0fb861e", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "fvec" + } + ] + } + }, + "typeName": "Link" + }, + { + "properties": { + "endObject": "e7e85580-a647-4332-b269-05f143f2138f", + "endProp": { + "properties": [ + { + "typeName": "String", + "value": "materials" + }, + { + "typeName": "String", + "value": "material" + }, + { + "typeName": "String", + "value": "uniforms" + }, + { + "typeName": "String", + "value": "s_a_prims.fvec" + } + ] + }, + "isValid": true, + "isWeak": false, + "startObject": "dc75ba18-b463-4afa-a6ca-4b2bb0fb861e", + "startProp": { + "properties": [ + { + "typeName": "String", + "value": "inputs" + }, + { + "typeName": "String", + "value": "fvec" + } + ] + } + }, + "typeName": "Link" + } + ], + "logicEngineVersion": [ + 1, + 4, + 2 + ], + "racoVersion": [ + 1, + 7, + 0 + ], + "ramsesVersion": [ + 27, + 0, + 130 + ], + "structPropMap": { + "AnchorPointOutputs": { + "depth": "Double::DisplayNameAnnotation::LinkStartAnnotation", + "viewportCoords": "Vec2f::DisplayNameAnnotation::LinkStartAnnotation" + }, + "BlendOptions": { + "blendColor": "Vec4f::DisplayNameAnnotation", + "blendFactorDestAlpha": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "blendFactorDestColor": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "blendFactorSrcAlpha": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "blendFactorSrcColor": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "blendOperationAlpha": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "blendOperationColor": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "cullmode": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "depthFunction": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "depthwrite": "Bool::DisplayNameAnnotation" + }, + "CameraViewport": { + "height": "Int::RangeAnnotationInt::DisplayNameAnnotation::LinkEndAnnotation", + "offsetX": "Int::RangeAnnotationInt::DisplayNameAnnotation::LinkEndAnnotation", + "offsetY": "Int::RangeAnnotationInt::DisplayNameAnnotation::LinkEndAnnotation", + "width": "Int::RangeAnnotationInt::DisplayNameAnnotation::LinkEndAnnotation" + }, + "DefaultResourceDirectories": { + "imageSubdirectory": "String::DisplayNameAnnotation::URIAnnotation", + "interfaceSubdirectory": "String::DisplayNameAnnotation::URIAnnotation", + "meshSubdirectory": "String::DisplayNameAnnotation::URIAnnotation", + "scriptSubdirectory": "String::DisplayNameAnnotation::URIAnnotation", + "shaderSubdirectory": "String::DisplayNameAnnotation::URIAnnotation" + }, + "LuaStandardModuleSelection": { + "base": "Bool::DisplayNameAnnotation", + "debug": "Bool::DisplayNameAnnotation", + "math": "Bool::DisplayNameAnnotation", + "string": "Bool::DisplayNameAnnotation", + "table": "Bool::DisplayNameAnnotation" + }, + "OrthographicFrustum": { + "bottomPlane": "Double::DisplayNameAnnotation::RangeAnnotationDouble::LinkEndAnnotation", + "farPlane": "Double::DisplayNameAnnotation::RangeAnnotationDouble::LinkEndAnnotation", + "leftPlane": "Double::DisplayNameAnnotation::RangeAnnotationDouble::LinkEndAnnotation", + "nearPlane": "Double::DisplayNameAnnotation::RangeAnnotationDouble::LinkEndAnnotation", + "rightPlane": "Double::DisplayNameAnnotation::RangeAnnotationDouble::LinkEndAnnotation", + "topPlane": "Double::DisplayNameAnnotation::RangeAnnotationDouble::LinkEndAnnotation" + }, + "TimerInput": { + "ticker_us": "Int64::DisplayNameAnnotation::LinkEndAnnotation" + }, + "TimerOutput": { + "ticker_us": "Int64::DisplayNameAnnotation::LinkStartAnnotation" + }, + "Vec2f": { + "x": "Double::DisplayNameAnnotation::RangeAnnotationDouble", + "y": "Double::DisplayNameAnnotation::RangeAnnotationDouble" + }, + "Vec2i": { + "i1": "Int::DisplayNameAnnotation::RangeAnnotationInt", + "i2": "Int::DisplayNameAnnotation::RangeAnnotationInt" + }, + "Vec3f": { + "x": "Double::DisplayNameAnnotation::RangeAnnotationDouble", + "y": "Double::DisplayNameAnnotation::RangeAnnotationDouble", + "z": "Double::DisplayNameAnnotation::RangeAnnotationDouble" + }, + "Vec3i": { + "i1": "Int::DisplayNameAnnotation::RangeAnnotationInt", + "i2": "Int::DisplayNameAnnotation::RangeAnnotationInt", + "i3": "Int::DisplayNameAnnotation::RangeAnnotationInt" + }, + "Vec4f": { + "w": "Double::DisplayNameAnnotation::RangeAnnotationDouble", + "x": "Double::DisplayNameAnnotation::RangeAnnotationDouble", + "y": "Double::DisplayNameAnnotation::RangeAnnotationDouble", + "z": "Double::DisplayNameAnnotation::RangeAnnotationDouble" + }, + "Vec4i": { + "i1": "Int::DisplayNameAnnotation::RangeAnnotationInt", + "i2": "Int::DisplayNameAnnotation::RangeAnnotationInt", + "i3": "Int::DisplayNameAnnotation::RangeAnnotationInt", + "i4": "Int::DisplayNameAnnotation::RangeAnnotationInt" + } + }, + "userTypePropMap": { + "AnchorPoint": { + "camera": "BaseCamera::DisplayNameAnnotation", + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "node": "Node::DisplayNameAnnotation", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "outputs": "AnchorPointOutputs::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" + }, + "Animation": { + "animationChannels": "Table::DisplayNameAnnotation", + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "outputs": "Table::DisplayNameAnnotation", + "progress": "Double::DisplayNameAnnotation::RangeAnnotationDouble::LinkEndAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" + }, + "AnimationChannel": { + "animationIndex": "Int::DisplayNameAnnotation", + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "samplerIndex": "Int::DisplayNameAnnotation", + "uri": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" + }, + "BlitPass": { + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "destinationX": "Int::RangeAnnotationInt::DisplayNameAnnotation", + "destinationY": "Int::RangeAnnotationInt::DisplayNameAnnotation", + "enabled": "Bool::DisplayNameAnnotation", + "height": "Int::RangeAnnotationInt::DisplayNameAnnotation", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "renderOrder": "Int::DisplayNameAnnotation", + "sourceRenderBuffer": "RenderBuffer::DisplayNameAnnotation::EmptyReferenceAllowable", + "sourceRenderBufferMS": "RenderBufferMS::DisplayNameAnnotation::EmptyReferenceAllowable", + "sourceX": "Int::RangeAnnotationInt::DisplayNameAnnotation", + "sourceY": "Int::RangeAnnotationInt::DisplayNameAnnotation", + "targetRenderBuffer": "RenderBuffer::DisplayNameAnnotation::EmptyReferenceAllowable", + "targetRenderBufferMS": "RenderBufferMS::DisplayNameAnnotation::EmptyReferenceAllowable", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", + "width": "Int::RangeAnnotationInt::DisplayNameAnnotation" + }, + "CubeMap": { + "anisotropy": "Int::DisplayNameAnnotation::RangeAnnotationInt", + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "generateMipmaps": "Bool::DisplayNameAnnotation", + "level2uriBack": "String::URIAnnotation::DisplayNameAnnotation", + "level2uriBottom": "String::URIAnnotation::DisplayNameAnnotation", + "level2uriFront": "String::URIAnnotation::DisplayNameAnnotation", + "level2uriLeft": "String::URIAnnotation::DisplayNameAnnotation", + "level2uriRight": "String::URIAnnotation::DisplayNameAnnotation", + "level2uriTop": "String::URIAnnotation::DisplayNameAnnotation", + "level3uriBack": "String::URIAnnotation::DisplayNameAnnotation", + "level3uriBottom": "String::URIAnnotation::DisplayNameAnnotation", + "level3uriFront": "String::URIAnnotation::DisplayNameAnnotation", + "level3uriLeft": "String::URIAnnotation::DisplayNameAnnotation", + "level3uriRight": "String::URIAnnotation::DisplayNameAnnotation", + "level3uriTop": "String::URIAnnotation::DisplayNameAnnotation", + "level4uriBack": "String::URIAnnotation::DisplayNameAnnotation", + "level4uriBottom": "String::URIAnnotation::DisplayNameAnnotation", + "level4uriFront": "String::URIAnnotation::DisplayNameAnnotation", + "level4uriLeft": "String::URIAnnotation::DisplayNameAnnotation", + "level4uriRight": "String::URIAnnotation::DisplayNameAnnotation", + "level4uriTop": "String::URIAnnotation::DisplayNameAnnotation", + "magSamplingMethod": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "minSamplingMethod": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "mipmapLevel": "Int::DisplayNameAnnotation::RangeAnnotationInt", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "textureFormat": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "uriBack": "String::URIAnnotation::DisplayNameAnnotation", + "uriBottom": "String::URIAnnotation::DisplayNameAnnotation", + "uriFront": "String::URIAnnotation::DisplayNameAnnotation", + "uriLeft": "String::URIAnnotation::DisplayNameAnnotation", + "uriRight": "String::URIAnnotation::DisplayNameAnnotation", + "uriTop": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", + "wrapUMode": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "wrapVMode": "Int::DisplayNameAnnotation::EnumerationAnnotation" + }, + "LuaInterface": { + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "inputs": "Table::DisplayNameAnnotation::LinkStartAnnotation::LinkEndAnnotation", + "luaModules": "Table::DisplayNameAnnotation::FeatureLevel", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "stdModules": "LuaStandardModuleSelection::DisplayNameAnnotation::FeatureLevel", + "uri": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" + }, + "LuaScript": { + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "inputs": "Table::DisplayNameAnnotation::LinkEndAnnotation", + "luaModules": "Table::DisplayNameAnnotation", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "outputs": "Table::DisplayNameAnnotation", + "stdModules": "LuaStandardModuleSelection::DisplayNameAnnotation", + "uri": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" + }, + "LuaScriptModule": { + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "stdModules": "LuaStandardModuleSelection::DisplayNameAnnotation", + "uri": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" + }, + "Material": { + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "options": "BlendOptions::DisplayNameAnnotation", + "tags": "Table::ArraySemanticAnnotation::HiddenProperty::TagContainerAnnotation::DisplayNameAnnotation", + "uniforms": "Table::DisplayNameAnnotation", + "uriDefines": "String::URIAnnotation::DisplayNameAnnotation", + "uriFragment": "String::URIAnnotation::DisplayNameAnnotation", + "uriGeometry": "String::URIAnnotation::DisplayNameAnnotation", + "uriVertex": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" + }, + "Mesh": { + "bakeMeshes": "Bool::DisplayNameAnnotation", + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "materialNames": "Table::ArraySemanticAnnotation::HiddenProperty", + "meshIndex": "Int::DisplayNameAnnotation", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "uri": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" + }, + "MeshNode": { + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "enabled": "Bool::DisplayNameAnnotation::LinkEndAnnotation::FeatureLevel", + "instanceCount": "Int::DisplayNameAnnotation::RangeAnnotationInt", + "materials": "Table::DisplayNameAnnotation", + "mesh": "Mesh::DisplayNameAnnotation", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "rotation": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "scaling": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "tags": "Table::ArraySemanticAnnotation::HiddenProperty::TagContainerAnnotation::DisplayNameAnnotation", + "translation": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", + "visibility": "Bool::DisplayNameAnnotation::LinkEndAnnotation" + }, + "Node": { + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "enabled": "Bool::DisplayNameAnnotation::LinkEndAnnotation::FeatureLevel", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "rotation": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "scaling": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "tags": "Table::ArraySemanticAnnotation::HiddenProperty::TagContainerAnnotation::DisplayNameAnnotation", + "translation": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", + "visibility": "Bool::DisplayNameAnnotation::LinkEndAnnotation" + }, + "OrthographicCamera": { + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "enabled": "Bool::DisplayNameAnnotation::LinkEndAnnotation::FeatureLevel", + "frustum": "OrthographicFrustum::DisplayNameAnnotation::LinkEndAnnotation", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "rotation": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "scaling": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "tags": "Table::ArraySemanticAnnotation::HiddenProperty::TagContainerAnnotation::DisplayNameAnnotation", + "translation": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", + "viewport": "CameraViewport::DisplayNameAnnotation::LinkEndAnnotation", + "visibility": "Bool::DisplayNameAnnotation::LinkEndAnnotation" + }, + "PerspectiveCamera": { + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "enabled": "Bool::DisplayNameAnnotation::LinkEndAnnotation::FeatureLevel", + "frustum": "Table::DisplayNameAnnotation::LinkEndAnnotation", + "frustumType": "Int::DisplayNameAnnotation::EnumerationAnnotation::FeatureLevel", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "rotation": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "scaling": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "tags": "Table::ArraySemanticAnnotation::HiddenProperty::TagContainerAnnotation::DisplayNameAnnotation", + "translation": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", + "viewport": "CameraViewport::DisplayNameAnnotation::LinkEndAnnotation", + "visibility": "Bool::DisplayNameAnnotation::LinkEndAnnotation" + }, + "Prefab": { + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" + }, + "PrefabInstance": { + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "enabled": "Bool::DisplayNameAnnotation::LinkEndAnnotation::FeatureLevel", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "rotation": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "scaling": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "tags": "Table::ArraySemanticAnnotation::HiddenProperty::TagContainerAnnotation::DisplayNameAnnotation", + "template": "Prefab::DisplayNameAnnotation", + "translation": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", + "visibility": "Bool::DisplayNameAnnotation::LinkEndAnnotation" + }, + "ProjectSettings": { + "backgroundColor": "Vec4f::DisplayNameAnnotation", + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "defaultResourceFolders": "DefaultResourceDirectories::DisplayNameAnnotation", + "featureLevel": "Int::DisplayNameAnnotation::ReadOnlyAnnotation", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "saveAsZip": "Bool::DisplayNameAnnotation", + "sceneId": "Int::DisplayNameAnnotation::RangeAnnotationInt", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", + "viewport": "Vec2i::DisplayNameAnnotation" + }, + "RenderBuffer": { + "anisotropy": "Int::DisplayNameAnnotation::RangeAnnotationInt", + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "format": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "height": "Int::RangeAnnotationInt::DisplayNameAnnotation", + "magSamplingMethod": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "minSamplingMethod": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", + "width": "Int::RangeAnnotationInt::DisplayNameAnnotation", + "wrapUMode": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "wrapVMode": "Int::DisplayNameAnnotation::EnumerationAnnotation" + }, + "RenderBufferMS": { + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "format": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "height": "Int::RangeAnnotationInt::DisplayNameAnnotation", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "sampleCount": "Int::RangeAnnotationInt::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", + "width": "Int::RangeAnnotationInt::DisplayNameAnnotation" + }, + "RenderLayer": { + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "materialFilterMode": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "materialFilterTags": "Table::ArraySemanticAnnotation::HiddenProperty::TagContainerAnnotation::DisplayNameAnnotation", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "renderableTags": "Table::RenderableTagContainerAnnotation::DisplayNameAnnotation", + "sortOrder": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "tags": "Table::ArraySemanticAnnotation::HiddenProperty::TagContainerAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" + }, + "RenderPass": { + "camera": "BaseCamera::DisplayNameAnnotation", + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "clearColor": "Vec4f::DisplayNameAnnotation::LinkEndAnnotation", + "enableClearColor": "Bool::DisplayNameAnnotation", + "enableClearDepth": "Bool::DisplayNameAnnotation", + "enableClearStencil": "Bool::DisplayNameAnnotation", + "enabled": "Bool::DisplayNameAnnotation::LinkEndAnnotation", + "layer0": "RenderLayer::DisplayNameAnnotation", + "layer1": "RenderLayer::DisplayNameAnnotation::EmptyReferenceAllowable", + "layer2": "RenderLayer::DisplayNameAnnotation::EmptyReferenceAllowable", + "layer3": "RenderLayer::DisplayNameAnnotation::EmptyReferenceAllowable", + "layer4": "RenderLayer::DisplayNameAnnotation::EmptyReferenceAllowable", + "layer5": "RenderLayer::DisplayNameAnnotation::EmptyReferenceAllowable", + "layer6": "RenderLayer::DisplayNameAnnotation::EmptyReferenceAllowable", + "layer7": "RenderLayer::DisplayNameAnnotation::EmptyReferenceAllowable", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "renderOnce": "Bool::DisplayNameAnnotation::LinkEndAnnotation::FeatureLevel", + "renderOrder": "Int::DisplayNameAnnotation::LinkEndAnnotation", + "target": "RenderTarget::DisplayNameAnnotation::EmptyReferenceAllowable", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" + }, + "RenderTarget": { + "buffer0": "RenderBuffer::DisplayNameAnnotation::EmptyReferenceAllowable", + "buffer1": "RenderBuffer::DisplayNameAnnotation::EmptyReferenceAllowable", + "buffer2": "RenderBuffer::DisplayNameAnnotation::EmptyReferenceAllowable", + "buffer3": "RenderBuffer::DisplayNameAnnotation::EmptyReferenceAllowable", + "buffer4": "RenderBuffer::DisplayNameAnnotation::EmptyReferenceAllowable", + "buffer5": "RenderBuffer::DisplayNameAnnotation::EmptyReferenceAllowable", + "buffer6": "RenderBuffer::DisplayNameAnnotation::EmptyReferenceAllowable", + "buffer7": "RenderBuffer::DisplayNameAnnotation::EmptyReferenceAllowable", + "bufferMS0": "RenderBufferMS::DisplayNameAnnotation::EmptyReferenceAllowable", + "bufferMS1": "RenderBufferMS::DisplayNameAnnotation::EmptyReferenceAllowable", + "bufferMS2": "RenderBufferMS::DisplayNameAnnotation::EmptyReferenceAllowable", + "bufferMS3": "RenderBufferMS::DisplayNameAnnotation::EmptyReferenceAllowable", + "bufferMS4": "RenderBufferMS::DisplayNameAnnotation::EmptyReferenceAllowable", + "bufferMS5": "RenderBufferMS::DisplayNameAnnotation::EmptyReferenceAllowable", + "bufferMS6": "RenderBufferMS::DisplayNameAnnotation::EmptyReferenceAllowable", + "bufferMS7": "RenderBufferMS::DisplayNameAnnotation::EmptyReferenceAllowable", + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" + }, + "Skin": { + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "joints": "Table::DisplayNameAnnotation", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "skinIndex": "Int::DisplayNameAnnotation", + "targets": "Table::DisplayNameAnnotation", + "uri": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" + }, + "Texture": { + "anisotropy": "Int::DisplayNameAnnotation::RangeAnnotationInt", + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "flipTexture": "Bool::DisplayNameAnnotation", + "generateMipmaps": "Bool::DisplayNameAnnotation", + "level2uri": "String::URIAnnotation::DisplayNameAnnotation", + "level3uri": "String::URIAnnotation::DisplayNameAnnotation", + "level4uri": "String::URIAnnotation::DisplayNameAnnotation", + "magSamplingMethod": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "minSamplingMethod": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "mipmapLevel": "Int::DisplayNameAnnotation::RangeAnnotationInt", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "textureFormat": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "uri": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", + "wrapUMode": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "wrapVMode": "Int::DisplayNameAnnotation::EnumerationAnnotation" + }, + "TextureExternal": { + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "magSamplingMethod": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "minSamplingMethod": "Int::DisplayNameAnnotation::EnumerationAnnotation", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" + }, + "Timer": { + "children": "Table::ArraySemanticAnnotation::HiddenProperty", + "inputs": "TimerInput::DisplayNameAnnotation", + "objectID": "String::HiddenProperty", + "objectName": "String::DisplayNameAnnotation", + "outputs": "TimerOutput::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" + } + } +} diff --git a/datamodel/libCore/tests/migrationTestData/scripts/uniform-array.lua b/datamodel/libCore/tests/migrationTestData/scripts/uniform-array.lua new file mode 100644 index 00000000..bd16d25d --- /dev/null +++ b/datamodel/libCore/tests/migrationTestData/scripts/uniform-array.lua @@ -0,0 +1,13 @@ + +function interface(INOUT) + INOUT.ivec = Type:Array(2, Type:Int32()) + INOUT.fvec = Type:Array(5, Type:Float()) + + INOUT.avec2 = Type:Array(4, Type:Vec2f()) + INOUT.avec3 = Type:Array(5, Type:Vec3f()) + INOUT.avec4 = Type:Array(6, Type:Vec4f()) + + INOUT.aivec2 = Type:Array(4, Type:Vec2i()) + INOUT.aivec3 = Type:Array(5, Type:Vec3i()) + INOUT.aivec4 = Type:Array(6, Type:Vec4i()) +end diff --git a/datamodel/libCore/tests/migrationTestData/scripts/uniform-structs.lua b/datamodel/libCore/tests/migrationTestData/scripts/uniform-structs.lua new file mode 100644 index 00000000..9941f48e --- /dev/null +++ b/datamodel/libCore/tests/migrationTestData/scripts/uniform-structs.lua @@ -0,0 +1,37 @@ + +function interface(INOUT) + local struct_prim = { + i = Type:Int32(), + f = Type:Float(), + + v2 = Type:Vec2f(), + v3 = Type:Vec3f(), + v4 = Type:Vec4f(), + + iv2 = Type:Vec2i(), + iv3 = Type:Vec3i(), + iv4 = Type:Vec4i() + } + + local struct_array_prim = { + ivec = Type:Array(2, Type:Int32()), + fvec = Type:Array(5, Type:Float()), + + avec2 = Type:Array(4, Type:Vec2f()), + avec3 = Type:Array(5, Type:Vec3f()), + avec4 = Type:Array(6, Type:Vec4f()), + + aivec2 = Type:Array(4, Type:Vec2i()), + aivec3 = Type:Array(5, Type:Vec3i()), + aivec4 = Type:Array(6, Type:Vec4i()) + } + + local struct_array_struct = { + prims = Type:Array(2, struct_prim) + } + + INOUT.s_prims = struct_prim + INOUT.s_a_prims = struct_array_prim + INOUT.a_s_prims = Type:Array(2, struct_prim) + INOUT.s_a_struct_prim = struct_array_struct +end diff --git a/datamodel/libCore/tests/migrationTestData/shaders/uniform-array.frag b/datamodel/libCore/tests/migrationTestData/shaders/uniform-array.frag new file mode 100644 index 00000000..5cc80df7 --- /dev/null +++ b/datamodel/libCore/tests/migrationTestData/shaders/uniform-array.frag @@ -0,0 +1,22 @@ +#version 300 es + +precision mediump float; + +uniform float scalar; + +uniform int ivec[2]; +uniform float fvec[5]; + +uniform vec2 avec2[4]; +uniform vec3 avec3[5]; +uniform vec4 avec4[6]; + +uniform ivec2 aivec2[4]; +uniform ivec3 aivec3[5]; +uniform ivec4 aivec4[6]; + +out mediump vec4 fragColor; + +void main(){ + fragColor = vec4(scalar * fvec[0], scalar * fvec[1], scalar * fvec[2], scalar * fvec[3]); +} \ No newline at end of file diff --git a/datamodel/libCore/tests/migrationTestData/shaders/uniform-array.vert b/datamodel/libCore/tests/migrationTestData/shaders/uniform-array.vert new file mode 100644 index 00000000..cb84866c --- /dev/null +++ b/datamodel/libCore/tests/migrationTestData/shaders/uniform-array.vert @@ -0,0 +1,11 @@ +#version 300 es + +precision mediump float; + +in vec3 a_Position; + +uniform mat4 u_MVPMatrix; + +void main() { + gl_Position = u_MVPMatrix * vec4(a_Position, 1.0); +} \ No newline at end of file diff --git a/datamodel/libCore/tests/migrationTestData/shaders/uniform-scalar.frag b/datamodel/libCore/tests/migrationTestData/shaders/uniform-scalar.frag new file mode 100644 index 00000000..cc80675d --- /dev/null +++ b/datamodel/libCore/tests/migrationTestData/shaders/uniform-scalar.frag @@ -0,0 +1,20 @@ +#version 300 es + +precision mediump float; + +uniform int i; +uniform float f; + +uniform vec2 v2; +uniform vec3 v3; +uniform vec4 v4; + +uniform ivec2 iv2; +uniform ivec3 iv3; +uniform ivec4 iv4; + +out mediump vec4 fragColor; + +void main(){ + fragColor = vec4(f, f, f, 1.0); +} \ No newline at end of file diff --git a/datamodel/libCore/tests/migrationTestData/shaders/uniform-scalar.vert b/datamodel/libCore/tests/migrationTestData/shaders/uniform-scalar.vert new file mode 100644 index 00000000..cb84866c --- /dev/null +++ b/datamodel/libCore/tests/migrationTestData/shaders/uniform-scalar.vert @@ -0,0 +1,11 @@ +#version 300 es + +precision mediump float; + +in vec3 a_Position; + +uniform mat4 u_MVPMatrix; + +void main() { + gl_Position = u_MVPMatrix * vec4(a_Position, 1.0); +} \ No newline at end of file diff --git a/datamodel/libCore/tests/migrationTestData/shaders/uniform-struct.frag b/datamodel/libCore/tests/migrationTestData/shaders/uniform-struct.frag new file mode 100644 index 00000000..be46af56 --- /dev/null +++ b/datamodel/libCore/tests/migrationTestData/shaders/uniform-struct.frag @@ -0,0 +1,75 @@ +#version 310 es + +precision mediump float; + +struct struct_prim { + int i; + float f; + + vec2 v2; + vec3 v3; + vec4 v4; + + ivec2 iv2; + ivec3 iv3; + ivec4 iv4; +}; + +struct struct_sampler { + sampler2D s_texture; + samplerCube s_cubemap; + sampler2D s_buffer; + mediump sampler2DMS s_buffer_ms; +}; + +struct struct_array_prim { + int ivec[2]; + float fvec[5]; + + vec2 avec2[4]; + vec3 avec3[5]; + vec4 avec4[6]; + + ivec2 aivec2[4]; + ivec3 aivec3[5]; + ivec4 aivec4[6]; +}; + +struct struct_array_struct_prim { + struct_prim prims[2]; +}; + +struct struct_array_struct_samplers { + struct_sampler samplers[2]; +}; + +struct struct_nested { + struct_prim prims; + struct_sampler samplers; +}; + +uniform struct_prim s_prims; + +uniform struct_sampler s_samplers; + +uniform struct_array_prim s_a_prims; + +uniform struct_nested nested; + +uniform struct_array_struct_prim s_a_struct_prim; + +uniform struct_array_struct_samplers s_a_struct_samplers; + +uniform struct_prim a_s_prims[2]; + +uniform struct_sampler a_s_samplers[2]; + +uniform struct_array_struct_prim a_s_a_struct_prim[2]; + +uniform struct_array_struct_samplers a_s_a_struct_samplers[2]; + +out mediump vec4 fragColor; + +void main(){ + fragColor = vec4(0.2, 0.3, 0.4, 1.0); +} \ No newline at end of file diff --git a/datamodel/libCore/tests/migrationTestData/shaders/uniform-struct.vert b/datamodel/libCore/tests/migrationTestData/shaders/uniform-struct.vert new file mode 100644 index 00000000..e7a25fbc --- /dev/null +++ b/datamodel/libCore/tests/migrationTestData/shaders/uniform-struct.vert @@ -0,0 +1,11 @@ +#version 310 es + +precision mediump float; + +in vec3 a_Position; + +uniform mat4 u_MVPMatrix; + +void main() { + gl_Position = u_MVPMatrix * vec4(a_Position, 1.0); +} \ No newline at end of file diff --git a/datamodel/libCore/tests/migrationTestData/version-current.rca b/datamodel/libCore/tests/migrationTestData/version-current.rca index bc28dcb3..b122d88d 100644 --- a/datamodel/libCore/tests/migrationTestData/version-current.rca +++ b/datamodel/libCore/tests/migrationTestData/version-current.rca @@ -2,7 +2,7 @@ "externalProjects": { }, "featureLevel": 5, - "fileVersion": 49, + "fileVersion": 51, "instances": [ { "properties": { @@ -1867,7 +1867,7 @@ "objectID": "9c2eeeea-cef0-42a5-9815-d32d38ccfd60", "objectName": "Timer", "outputs": { - "ticker_us": "675091740822" + "ticker_us": "1467063033252" } }, "typeName": "Timer" @@ -2238,17 +2238,17 @@ "logicEngineVersion": [ 1, 4, - 1 + 2 ], "racoVersion": [ 1, - 6, + 7, 0 ], "ramsesVersion": [ 27, 0, - 129 + 130 ], "structPropMap": { "AnchorPointOutputs": { @@ -2339,7 +2339,8 @@ "node": "Node::DisplayNameAnnotation", "objectID": "String::HiddenProperty", "objectName": "String::DisplayNameAnnotation", - "outputs": "AnchorPointOutputs::DisplayNameAnnotation" + "outputs": "AnchorPointOutputs::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" }, "Animation": { "animationChannels": "Table::DisplayNameAnnotation", @@ -2347,7 +2348,8 @@ "objectID": "String::HiddenProperty", "objectName": "String::DisplayNameAnnotation", "outputs": "Table::DisplayNameAnnotation", - "progress": "Double::DisplayNameAnnotation::RangeAnnotationDouble::LinkEndAnnotation" + "progress": "Double::DisplayNameAnnotation::RangeAnnotationDouble::LinkEndAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" }, "AnimationChannel": { "animationIndex": "Int::DisplayNameAnnotation", @@ -2355,7 +2357,8 @@ "objectID": "String::HiddenProperty", "objectName": "String::DisplayNameAnnotation", "samplerIndex": "Int::DisplayNameAnnotation", - "uri": "String::URIAnnotation::DisplayNameAnnotation" + "uri": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" }, "BlitPass": { "children": "Table::ArraySemanticAnnotation::HiddenProperty", @@ -2372,6 +2375,7 @@ "sourceY": "Int::RangeAnnotationInt::DisplayNameAnnotation", "targetRenderBuffer": "RenderBuffer::DisplayNameAnnotation::EmptyReferenceAllowable", "targetRenderBufferMS": "RenderBufferMS::DisplayNameAnnotation::EmptyReferenceAllowable", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", "width": "Int::RangeAnnotationInt::DisplayNameAnnotation" }, "CubeMap": { @@ -2408,6 +2412,7 @@ "uriLeft": "String::URIAnnotation::DisplayNameAnnotation", "uriRight": "String::URIAnnotation::DisplayNameAnnotation", "uriTop": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", "wrapUMode": "Int::DisplayNameAnnotation::EnumerationAnnotation", "wrapVMode": "Int::DisplayNameAnnotation::EnumerationAnnotation" }, @@ -2418,7 +2423,8 @@ "objectID": "String::HiddenProperty", "objectName": "String::DisplayNameAnnotation", "stdModules": "LuaStandardModuleSelection::DisplayNameAnnotation::FeatureLevel", - "uri": "String::URIAnnotation::DisplayNameAnnotation" + "uri": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" }, "LuaScript": { "children": "Table::ArraySemanticAnnotation::HiddenProperty", @@ -2428,14 +2434,16 @@ "objectName": "String::DisplayNameAnnotation", "outputs": "Table::DisplayNameAnnotation", "stdModules": "LuaStandardModuleSelection::DisplayNameAnnotation", - "uri": "String::URIAnnotation::DisplayNameAnnotation" + "uri": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" }, "LuaScriptModule": { "children": "Table::ArraySemanticAnnotation::HiddenProperty", "objectID": "String::HiddenProperty", "objectName": "String::DisplayNameAnnotation", "stdModules": "LuaStandardModuleSelection::DisplayNameAnnotation", - "uri": "String::URIAnnotation::DisplayNameAnnotation" + "uri": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" }, "Material": { "children": "Table::ArraySemanticAnnotation::HiddenProperty", @@ -2447,7 +2455,8 @@ "uriDefines": "String::URIAnnotation::DisplayNameAnnotation", "uriFragment": "String::URIAnnotation::DisplayNameAnnotation", "uriGeometry": "String::URIAnnotation::DisplayNameAnnotation", - "uriVertex": "String::URIAnnotation::DisplayNameAnnotation" + "uriVertex": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" }, "Mesh": { "bakeMeshes": "Bool::DisplayNameAnnotation", @@ -2456,7 +2465,8 @@ "meshIndex": "Int::DisplayNameAnnotation", "objectID": "String::HiddenProperty", "objectName": "String::DisplayNameAnnotation", - "uri": "String::URIAnnotation::DisplayNameAnnotation" + "uri": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" }, "MeshNode": { "children": "Table::ArraySemanticAnnotation::HiddenProperty", @@ -2470,6 +2480,7 @@ "scaling": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", "tags": "Table::ArraySemanticAnnotation::HiddenProperty::TagContainerAnnotation::DisplayNameAnnotation", "translation": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", "visibility": "Bool::DisplayNameAnnotation::LinkEndAnnotation" }, "Node": { @@ -2481,6 +2492,7 @@ "scaling": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", "tags": "Table::ArraySemanticAnnotation::HiddenProperty::TagContainerAnnotation::DisplayNameAnnotation", "translation": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", "visibility": "Bool::DisplayNameAnnotation::LinkEndAnnotation" }, "OrthographicCamera": { @@ -2493,6 +2505,7 @@ "scaling": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", "tags": "Table::ArraySemanticAnnotation::HiddenProperty::TagContainerAnnotation::DisplayNameAnnotation", "translation": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", "viewport": "CameraViewport::DisplayNameAnnotation::LinkEndAnnotation", "visibility": "Bool::DisplayNameAnnotation::LinkEndAnnotation" }, @@ -2507,13 +2520,15 @@ "scaling": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", "tags": "Table::ArraySemanticAnnotation::HiddenProperty::TagContainerAnnotation::DisplayNameAnnotation", "translation": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", "viewport": "CameraViewport::DisplayNameAnnotation::LinkEndAnnotation", "visibility": "Bool::DisplayNameAnnotation::LinkEndAnnotation" }, "Prefab": { "children": "Table::ArraySemanticAnnotation::HiddenProperty", "objectID": "String::HiddenProperty", - "objectName": "String::DisplayNameAnnotation" + "objectName": "String::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" }, "PrefabInstance": { "children": "Table::ArraySemanticAnnotation::HiddenProperty", @@ -2525,6 +2540,7 @@ "tags": "Table::ArraySemanticAnnotation::HiddenProperty::TagContainerAnnotation::DisplayNameAnnotation", "template": "Prefab::DisplayNameAnnotation", "translation": "Vec3f::DisplayNameAnnotation::LinkEndAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", "visibility": "Bool::DisplayNameAnnotation::LinkEndAnnotation" }, "ProjectSettings": { @@ -2536,6 +2552,7 @@ "objectName": "String::DisplayNameAnnotation", "saveAsZip": "Bool::DisplayNameAnnotation", "sceneId": "Int::DisplayNameAnnotation::RangeAnnotationInt", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", "viewport": "Vec2i::DisplayNameAnnotation" }, "RenderBuffer": { @@ -2547,6 +2564,7 @@ "minSamplingMethod": "Int::DisplayNameAnnotation::EnumerationAnnotation", "objectID": "String::HiddenProperty", "objectName": "String::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", "width": "Int::RangeAnnotationInt::DisplayNameAnnotation", "wrapUMode": "Int::DisplayNameAnnotation::EnumerationAnnotation", "wrapVMode": "Int::DisplayNameAnnotation::EnumerationAnnotation" @@ -2558,6 +2576,7 @@ "objectID": "String::HiddenProperty", "objectName": "String::DisplayNameAnnotation", "sampleCount": "Int::RangeAnnotationInt::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", "width": "Int::RangeAnnotationInt::DisplayNameAnnotation" }, "RenderLayer": { @@ -2568,7 +2587,8 @@ "objectName": "String::DisplayNameAnnotation", "renderableTags": "Table::RenderableTagContainerAnnotation::DisplayNameAnnotation", "sortOrder": "Int::DisplayNameAnnotation::EnumerationAnnotation", - "tags": "Table::ArraySemanticAnnotation::HiddenProperty::TagContainerAnnotation::DisplayNameAnnotation" + "tags": "Table::ArraySemanticAnnotation::HiddenProperty::TagContainerAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" }, "RenderPass": { "camera": "BaseCamera::DisplayNameAnnotation", @@ -2590,7 +2610,8 @@ "objectName": "String::DisplayNameAnnotation", "renderOnce": "Bool::DisplayNameAnnotation::LinkEndAnnotation::FeatureLevel", "renderOrder": "Int::DisplayNameAnnotation::LinkEndAnnotation", - "target": "RenderTarget::DisplayNameAnnotation::EmptyReferenceAllowable" + "target": "RenderTarget::DisplayNameAnnotation::EmptyReferenceAllowable", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" }, "RenderTarget": { "buffer0": "RenderBuffer::DisplayNameAnnotation::EmptyReferenceAllowable", @@ -2611,7 +2632,8 @@ "bufferMS7": "RenderBufferMS::DisplayNameAnnotation::EmptyReferenceAllowable", "children": "Table::ArraySemanticAnnotation::HiddenProperty", "objectID": "String::HiddenProperty", - "objectName": "String::DisplayNameAnnotation" + "objectName": "String::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" }, "Skin": { "children": "Table::ArraySemanticAnnotation::HiddenProperty", @@ -2620,7 +2642,8 @@ "objectName": "String::DisplayNameAnnotation", "skinIndex": "Int::DisplayNameAnnotation", "targets": "Table::DisplayNameAnnotation", - "uri": "String::URIAnnotation::DisplayNameAnnotation" + "uri": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" }, "Texture": { "anisotropy": "Int::DisplayNameAnnotation::RangeAnnotationInt", @@ -2637,6 +2660,7 @@ "objectName": "String::DisplayNameAnnotation", "textureFormat": "Int::DisplayNameAnnotation::EnumerationAnnotation", "uri": "String::URIAnnotation::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation", "wrapUMode": "Int::DisplayNameAnnotation::EnumerationAnnotation", "wrapVMode": "Int::DisplayNameAnnotation::EnumerationAnnotation" }, @@ -2645,14 +2669,16 @@ "magSamplingMethod": "Int::DisplayNameAnnotation::EnumerationAnnotation", "minSamplingMethod": "Int::DisplayNameAnnotation::EnumerationAnnotation", "objectID": "String::HiddenProperty", - "objectName": "String::DisplayNameAnnotation" + "objectName": "String::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" }, "Timer": { "children": "Table::ArraySemanticAnnotation::HiddenProperty", "inputs": "TimerInput::DisplayNameAnnotation", "objectID": "String::HiddenProperty", "objectName": "String::DisplayNameAnnotation", - "outputs": "TimerOutput::DisplayNameAnnotation" + "outputs": "TimerOutput::DisplayNameAnnotation", + "userTags": "Table::ArraySemanticAnnotation::HiddenProperty::UserTagContainerAnnotation::DisplayNameAnnotation" } } } diff --git a/datamodel/libTesting/include/testing/RacoBaseTest.h b/datamodel/libTesting/include/testing/RacoBaseTest.h index caa672e5..f3f6ab65 100644 --- a/datamodel/libTesting/include/testing/RacoBaseTest.h +++ b/datamodel/libTesting/include/testing/RacoBaseTest.h @@ -80,6 +80,8 @@ class RacoBaseTest : public BaseClass { EXPECT_TRUE(projectLink->startProp() == refLink.startProp()); EXPECT_TRUE(projectLink->isValid() == refLink.isValid()); EXPECT_TRUE(*projectLink->isWeak_ == *refLink.isWeak_); + auto refValid = raco::core::Queries::linkWouldBeValid(project, projectLink->startProp(), projectLink->endProp()); + EXPECT_TRUE(projectLink->isValid() == refValid); } } diff --git a/datamodel/libTesting/include/testing/TestEnvironmentCore.h b/datamodel/libTesting/include/testing/TestEnvironmentCore.h index 6a770530..e1398c54 100644 --- a/datamodel/libTesting/include/testing/TestEnvironmentCore.h +++ b/datamodel/libTesting/include/testing/TestEnvironmentCore.h @@ -38,6 +38,7 @@ #include "user_types/LuaInterface.h" #include "user_types/RenderLayer.h" #include "user_types/Skin.h" +#include "user_types/Texture.h" #include "user_types/UserObjectFactory.h" #include "user_types/PrefabInstance.h" #include "user_types/Enumerations.h" @@ -212,6 +213,12 @@ struct TestEnvironmentCoreT : public RacoBaseTest { return skin; } + raco::user_types::STexture create_texture(const std::string& name, const std::string& relpath) { + auto texture = create(name); + commandInterface.set({texture, {"uri"}}, (RacoBaseTest::test_path() / relpath).string()); + return texture; + } + raco::user_types::SPrefabInstance create_prefabInstance(raco::core::CommandInterface& cmd, const std::string& name, raco::user_types::SPrefab prefab, raco::user_types::SEditorObject parent = nullptr) { auto inst = create(cmd, name, parent); cmd.set({inst, {"template"}}, prefab); diff --git a/datamodel/libTesting/include/testing/TestUtil.h b/datamodel/libTesting/include/testing/TestUtil.h index 21a47f9f..a1636537 100644 --- a/datamodel/libTesting/include/testing/TestUtil.h +++ b/datamodel/libTesting/include/testing/TestUtil.h @@ -136,4 +136,40 @@ inline std::pair& value) { + EXPECT_EQ(handle[0].asDouble(), value[0]); + EXPECT_EQ(handle[1].asDouble(), value[1]); +} + +inline void checkVec3fValue(raco::core::ValueHandle handle, const std::array& value) { + EXPECT_EQ(handle[0].asDouble(), value[0]); + EXPECT_EQ(handle[1].asDouble(), value[1]); + EXPECT_EQ(handle[2].asDouble(), value[2]); +} + +inline void checkVec4fValue(raco::core::ValueHandle handle, const std::array& value) { + EXPECT_EQ(handle[0].asDouble(), value[0]); + EXPECT_EQ(handle[1].asDouble(), value[1]); + EXPECT_EQ(handle[2].asDouble(), value[2]); + EXPECT_EQ(handle[3].asDouble(), value[3]); +} + +inline void checkVec2iValue(raco::core::ValueHandle handle, const std::array& value) { + EXPECT_EQ(handle[0].asInt(), value[0]); + EXPECT_EQ(handle[1].asInt(), value[1]); +} + +inline void checkVec3iValue(raco::core::ValueHandle handle, const std::array& value) { + EXPECT_EQ(handle[0].asInt(), value[0]); + EXPECT_EQ(handle[1].asInt(), value[1]); + EXPECT_EQ(handle[2].asInt(), value[2]); +} + +inline void checkVec4iValue(raco::core::ValueHandle handle, const std::array& value) { + EXPECT_EQ(handle[0].asInt(), value[0]); + EXPECT_EQ(handle[1].asInt(), value[1]); + EXPECT_EQ(handle[2].asInt(), value[2]); + EXPECT_EQ(handle[3].asInt(), value[3]); +} + } // namespace raco diff --git a/datamodel/libUserTypes/include/user_types/BaseTexture.h b/datamodel/libUserTypes/include/user_types/BaseTexture.h index af8e75fa..b38c8164 100644 --- a/datamodel/libUserTypes/include/user_types/BaseTexture.h +++ b/datamodel/libUserTypes/include/user_types/BaseTexture.h @@ -11,7 +11,7 @@ #include "user_types/BaseObject.h" #include "user_types/DefaultValues.h" -#include "core/EngineInterface.h" +#include "core/CoreAnnotations.h" namespace raco::user_types { @@ -45,10 +45,10 @@ class BaseTexture : public BaseObject { properties_.emplace_back("anisotropy", &anisotropy_); } - Property wrapUMode_{DEFAULT_VALUE_TEXTURE_SAMPLER_TEXTURE_ADDRESS_MODE_CLAMP, DisplayNameAnnotation("Wrap U Mode"), EnumerationAnnotation{TextureAddressMode}}; - Property wrapVMode_{DEFAULT_VALUE_TEXTURE_SAMPLER_TEXTURE_ADDRESS_MODE_CLAMP, DisplayNameAnnotation("Wrap V Mode"), EnumerationAnnotation{TextureAddressMode}}; - Property minSamplingMethod_{DEFAULT_VALUE_TEXTURE_SAMPLER_TEXTURE_MIN_SAMPLING_METHOD_NEAREST, DisplayNameAnnotation("Min Sampling Method"), EnumerationAnnotation{TextureMinSamplingMethod}}; - Property magSamplingMethod_{DEFAULT_VALUE_TEXTURE_SAMPLER_TEXTURE_MAG_SAMPLING_METHOD_NEAREST, DisplayNameAnnotation("Mag Sampling Method"), EnumerationAnnotation{TextureMagSamplingMethod}}; + Property wrapUMode_{DEFAULT_VALUE_TEXTURE_SAMPLER_TEXTURE_ADDRESS_MODE_CLAMP, DisplayNameAnnotation("Wrap U Mode"), EnumerationAnnotation{EUserTypeEnumerations::TextureAddressMode}}; + Property wrapVMode_{DEFAULT_VALUE_TEXTURE_SAMPLER_TEXTURE_ADDRESS_MODE_CLAMP, DisplayNameAnnotation("Wrap V Mode"), EnumerationAnnotation{EUserTypeEnumerations::TextureAddressMode}}; + Property minSamplingMethod_{DEFAULT_VALUE_TEXTURE_SAMPLER_TEXTURE_MIN_SAMPLING_METHOD_NEAREST, DisplayNameAnnotation("Min Sampling Method"), EnumerationAnnotation{EUserTypeEnumerations::TextureMinSamplingMethod}}; + Property magSamplingMethod_{DEFAULT_VALUE_TEXTURE_SAMPLER_TEXTURE_MAG_SAMPLING_METHOD_NEAREST, DisplayNameAnnotation("Mag Sampling Method"), EnumerationAnnotation{EUserTypeEnumerations::TextureMagSamplingMethod}}; Property> anisotropy_{1, DisplayNameAnnotation{"Anisotropy Level"}, RangeAnnotation(1, 32000) }; }; diff --git a/datamodel/libUserTypes/include/user_types/CubeMap.h b/datamodel/libUserTypes/include/user_types/CubeMap.h index df90b025..68eff4fe 100644 --- a/datamodel/libUserTypes/include/user_types/CubeMap.h +++ b/datamodel/libUserTypes/include/user_types/CubeMap.h @@ -91,7 +91,7 @@ class CubeMap : public BaseTexture { void onAfterValueChanged(BaseContext& context, ValueHandle const& value) override; void updateFromExternalFile(BaseContext& context) override; - Property textureFormat_{DEFAULT_VALUE_TEXTURE_FORMAT_RGBA8, {"Format"}, {EngineEnumeration::TextureFormat}}; + Property textureFormat_{DEFAULT_VALUE_TEXTURE_FORMAT_RGBA8, {"Format"}, {EUserTypeEnumerations::TextureFormat}}; Property> mipmapLevel_{1, {"Mipmap Level"}, {1, 4}}; diff --git a/datamodel/libUserTypes/include/user_types/Enumerations.h b/datamodel/libUserTypes/include/user_types/Enumerations.h index 7ca07812..f6e91f06 100644 --- a/datamodel/libUserTypes/include/user_types/Enumerations.h +++ b/datamodel/libUserTypes/include/user_types/Enumerations.h @@ -9,32 +9,174 @@ */ #pragma once +#include "core/CoreAnnotations.h" + #include #include namespace raco::user_types { +const std::map& enumerationDescription(core::EUserTypeEnumerations type); + +// !!! Careful: !!! +// We can't change the numeric value of the members of any of the enumerations below since they +// define the property values in the data model which are serialized. + +// items match ramses::ECullMode +enum class ECullMode { + Disabled = 0, + FrontFacing, + BackFacing, + FrontAndBackFacing, + NUMBER_OF_ELEMENTS +}; +extern std::map enumDescriptionCullMode; + + +// item match ramses::EBlendOperation +enum class EBlendOperation { + Disabled = 0, + Add, + Subtract, + ReverseSubtract, + Min, + Max, + NUMBER_OF_ELEMENTS +}; +extern std::map enumDescriptionBlendOperation; + + + // items match ramses::EBlendFactor +enum class EBlendFactor { + Zero = 0, + One, + SrcAlpha, + OneMinusSrcAlpha, + DstAlpha, + OneMinusDstAlpha, + SrcColor, + OneMinusSrcColor, + DstColor, + OneMinusDstColor, + ConstColor, + OneMinusConstColor, + ConstAlpha, + OneMinusConstAlpha, + AlphaSaturate, + NUMBER_OF_ELEMENTS +}; +extern std::map enumDescriptionBlendFactor; + + +// items match ramses::EDepthFunc +enum class EDepthFunc { + Disabled = 0, + Greater, + GreaterEqual, + Less, + LessEqual, + Equal, + NotEqual, + Always, + Never, + NUMBER_OF_ELEMENTS +}; +extern std::map enumDescriptionDepthFunction; + + +// items match ETextureAddressMode +enum class ETextureAddressMode { + Clamp = 0, + Repeat, + Mirror, + NUMBER_OF_ELEMENTS +}; +extern std::map enumDescriptionTextureAddressMode; + + +// itemss match ramses::ETextureSamplingMethod +enum class ETextureSamplingMethod { + Nearest = 0, + Linear, + Nearest_MipMapNearest, + Nearest_MipMapLinear, + Linear_MipMapNearest, + Linear_MipMapLinear, + NUMBER_OF_ELEMENTS +}; + +extern std::map enumDescriptionTextureMinSamplingMethod; + +extern std::map enumDescriptionTextureMagSamplingMethod; + + +// items match ramses::ETextureFormat +enum class ETextureFormat { + //Invalid = 0, + R8 = 1, + RG8 = 2, + RGB8 = 3, + //RGB565 = 4, + RGBA8 = 5, + //RGBA4 = 6, + //RGBA5551 = 7, + //ETC2RGB = 8, + //ETC2RGBA = 9, + //R16F = 10, + //R32F = 11, + //RG16F = 12, + //RG32F = 13, + RGB16F = 14, + //RGB32F = 15, + RGBA16F = 16, + //RGBA32F = 17, + SRGB8 = 18, + SRGB8_ALPHA8 = 19, +}; +extern std::map enumDescriptionTextureFormat; + + +// items match ramses::ERenderBufferFormat +enum class ERenderBufferFormat { + RGBA4 = 0, + R8, + RG8, + RGB8, + RGBA8, + R16F, + R32F, + RG16F, + RG32F, + RGB16F, + RGB32F, + RGBA16F, + RGBA32F, + + Depth24, + Depth24_Stencil8 +}; +extern std::map enumDescriptionRenderBufferFormat; + + enum class ERenderLayerOrder { Manual = 0, SceneGraph }; - -extern std::map enumerationRenderLayerOrder; - +extern std::map enumDescriptionRenderLayerOrder; enum class ERenderLayerMaterialFilterMode { Inclusive = 0, Exclusive }; -extern std::map enumerationRenderLayerMaterialFilterMode; - +extern std::map enumDescriptionRenderLayerMaterialFilterMode; enum class EFrustumType { Aspect_FieldOfView = 0, Planes }; -extern std::map enumerationFrustumType; +extern std::map enumDescriptionFrustumType; + -} \ No newline at end of file +} // namespace raco::user_types \ No newline at end of file diff --git a/datamodel/libUserTypes/include/user_types/Material.h b/datamodel/libUserTypes/include/user_types/Material.h index cd3b12ad..b85a8a26 100644 --- a/datamodel/libUserTypes/include/user_types/Material.h +++ b/datamodel/libUserTypes/include/user_types/Material.h @@ -85,15 +85,15 @@ class BlendOptions : public StructBase { } Property depthwrite_{true, DisplayNameAnnotation("Depth Write")}; - Property depthFunction_{DEFAULT_VALUE_MATERIAL_DEPTH_FUNCTION, DisplayNameAnnotation("Depth Function"), EnumerationAnnotation{EngineEnumeration::DepthFunction}}; - - Property cullmode_{DEFAULT_VALUE_MATERIAL_CULL_MODE, DisplayNameAnnotation("Cull Mode"), EnumerationAnnotation{EngineEnumeration::CullMode}}; - Property blendOperationColor_{DEFAULT_VALUE_MATERIAL_BLEND_OPERATION_COLOR, {"Blend Operation Color"}, {EngineEnumeration::BlendOperation}}; - Property blendOperationAlpha_{DEFAULT_VALUE_MATERIAL_BLEND_OPERATION_ALPHA, {"Blend Operation Alpha"}, {EngineEnumeration::BlendOperation}}; - Property blendFactorSrcColor_{DEFAULT_VALUE_MATERIAL_BLEND_FACTOR_SRC_COLOR, {"Blend Factor Src Color"}, {EngineEnumeration::BlendFactor}}; - Property blendFactorDestColor_{DEFAULT_VALUE_MATERIAL_BLEND_FACTOR_DEST_COLOR, {"Blend Factor Dest Color"}, {EngineEnumeration::BlendFactor}}; - Property blendFactorSrcAlpha_{DEFAULT_VALUE_MATERIAL_BLEND_FACTOR_SRC_ALPHA, {"Blend Factor Src Alpha"}, {EngineEnumeration::BlendFactor}}; - Property blendFactorDestAlpha_{DEFAULT_VALUE_MATERIAL_BLEND_FACTOR_DEST_ALPHA, {"Blend Factor Dest Alpha"}, {EngineEnumeration::BlendFactor}}; + Property depthFunction_{DEFAULT_VALUE_MATERIAL_DEPTH_FUNCTION, DisplayNameAnnotation("Depth Function"), EnumerationAnnotation{EUserTypeEnumerations::DepthFunction}}; + + Property cullmode_{DEFAULT_VALUE_MATERIAL_CULL_MODE, DisplayNameAnnotation("Cull Mode"), EnumerationAnnotation{EUserTypeEnumerations::CullMode}}; + Property blendOperationColor_{DEFAULT_VALUE_MATERIAL_BLEND_OPERATION_COLOR, {"Blend Operation Color"}, {EUserTypeEnumerations::BlendOperation}}; + Property blendOperationAlpha_{DEFAULT_VALUE_MATERIAL_BLEND_OPERATION_ALPHA, {"Blend Operation Alpha"}, {EUserTypeEnumerations::BlendOperation}}; + Property blendFactorSrcColor_{DEFAULT_VALUE_MATERIAL_BLEND_FACTOR_SRC_COLOR, {"Blend Factor Src Color"}, {EUserTypeEnumerations::BlendFactor}}; + Property blendFactorDestColor_{DEFAULT_VALUE_MATERIAL_BLEND_FACTOR_DEST_COLOR, {"Blend Factor Dest Color"}, {EUserTypeEnumerations::BlendFactor}}; + Property blendFactorSrcAlpha_{DEFAULT_VALUE_MATERIAL_BLEND_FACTOR_SRC_ALPHA, {"Blend Factor Src Alpha"}, {EUserTypeEnumerations::BlendFactor}}; + Property blendFactorDestAlpha_{DEFAULT_VALUE_MATERIAL_BLEND_FACTOR_DEST_ALPHA, {"Blend Factor Dest Alpha"}, {EUserTypeEnumerations::BlendFactor}}; Property blendColor_{{}, {"Blend Color"}}; }; diff --git a/datamodel/libUserTypes/include/user_types/PerspectiveCamera.h b/datamodel/libUserTypes/include/user_types/PerspectiveCamera.h index 943de1a8..3b3be179 100644 --- a/datamodel/libUserTypes/include/user_types/PerspectiveCamera.h +++ b/datamodel/libUserTypes/include/user_types/PerspectiveCamera.h @@ -42,7 +42,7 @@ class PerspectiveCamera : public BaseCamera { void onAfterValueChanged(BaseContext& context, ValueHandle const& value) override; - Property frustumType_{static_cast(EFrustumType::Aspect_FieldOfView), {"Frustum Type"}, {EngineEnumeration::FrustumType}, {2}}; + Property frustumType_{static_cast(EFrustumType::Aspect_FieldOfView), {"Frustum Type"}, {EUserTypeEnumerations::FrustumType}, {2}}; Property frustum_{{}, {"Frustum"}, {}}; private: diff --git a/datamodel/libUserTypes/include/user_types/RenderBuffer.h b/datamodel/libUserTypes/include/user_types/RenderBuffer.h index 173515fb..9dd53f4c 100644 --- a/datamodel/libUserTypes/include/user_types/RenderBuffer.h +++ b/datamodel/libUserTypes/include/user_types/RenderBuffer.h @@ -9,9 +9,11 @@ */ #pragma once -#include "core/EngineInterface.h" -#include "user_types/DefaultValues.h" #include "user_types/BaseTexture.h" +#include "user_types/DefaultValues.h" +#include "user_types/Enumerations.h" +#include "core/EngineInterface.h" +#include "user_types/Enumerations.h" namespace raco::user_types { @@ -38,10 +40,8 @@ class RenderBuffer : public TextureSampler2DBase { } bool areSamplingParametersSupported(EngineInterface const& engineInterface) const { - // This is a temporary hack. We need to refactor the enums in general, and the format_ enum in particular now that the user_types need to know things about it. - auto const& enumMap = engineInterface.enumerationDescription(EngineEnumeration::RenderBufferFormat); - const auto it = enumMap.find(format_.asInt()); - return it == enumMap.end() || (it->second != "Depth24" && it->second != "Depth24_Stencil8"); + auto format = static_cast(*format_); + return format != ERenderBufferFormat::Depth24 && format != ERenderBufferFormat::Depth24_Stencil8; } bool isSamplingProperty(ValueHandle const& valueHandle) const { @@ -55,7 +55,7 @@ class RenderBuffer : public TextureSampler2DBase { Property, DisplayNameAnnotation> width_{256, {1, 7680}, {"Width"}}; Property, DisplayNameAnnotation> height_{256, {1, 7680}, {"Height"}}; - Property format_{DEFAULT_VALUE_RENDER_BUFFER_FORMAT, DisplayNameAnnotation("Format"), EnumerationAnnotation{EngineEnumeration::RenderBufferFormat}}; + Property format_{DEFAULT_VALUE_RENDER_BUFFER_FORMAT, DisplayNameAnnotation("Format"), EnumerationAnnotation{EUserTypeEnumerations::RenderBufferFormat}}; private: }; diff --git a/datamodel/libUserTypes/include/user_types/RenderBufferMS.h b/datamodel/libUserTypes/include/user_types/RenderBufferMS.h index 5cd475f9..190edf1b 100644 --- a/datamodel/libUserTypes/include/user_types/RenderBufferMS.h +++ b/datamodel/libUserTypes/include/user_types/RenderBufferMS.h @@ -48,7 +48,7 @@ class RenderBufferMS : public BaseObject { Property, DisplayNameAnnotation> width_{256, {1, 7680}, {"Width"}}; Property, DisplayNameAnnotation> height_{256, {1, 7680}, {"Height"}}; - Property format_{DEFAULT_VALUE_RENDER_BUFFER_FORMAT, DisplayNameAnnotation("Format"), EnumerationAnnotation{EngineEnumeration::RenderBufferFormat}}; + Property format_{DEFAULT_VALUE_RENDER_BUFFER_FORMAT, DisplayNameAnnotation("Format"), EnumerationAnnotation{EUserTypeEnumerations::RenderBufferFormat}}; Property, DisplayNameAnnotation> sampleCount_{SAMPLE_COUNT_MIN, {SAMPLE_COUNT_MIN, SAMPLE_COUNT_MAX}, {"Sample Count"}}; diff --git a/datamodel/libUserTypes/include/user_types/RenderLayer.h b/datamodel/libUserTypes/include/user_types/RenderLayer.h index 79ce90c8..d9ae5ac2 100644 --- a/datamodel/libUserTypes/include/user_types/RenderLayer.h +++ b/datamodel/libUserTypes/include/user_types/RenderLayer.h @@ -69,9 +69,9 @@ class RenderLayer : public BaseObject { Property renderableTags_{{}, {}, {"Renderable Tags"}}; Property materialFilterTags_{{}, {}, {}, {}, {"Material Filter Tags"}}; - Property materialFilterMode_{static_cast(ERenderLayerMaterialFilterMode::Exclusive), {"Material Filter Mode"}, EngineEnumeration::RenderLayerMaterialFilterMode}; + Property materialFilterMode_{static_cast(ERenderLayerMaterialFilterMode::Exclusive), {"Material Filter Mode"}, EUserTypeEnumerations::RenderLayerMaterialFilterMode}; - Property sortOrder_{static_cast(ERenderLayerOrder::Manual), {"Render Order"}, EngineEnumeration::RenderLayerOrder}; + Property sortOrder_{static_cast(ERenderLayerOrder::Manual), {"Render Order"}, EUserTypeEnumerations::RenderLayerOrder}; }; using SRenderLayer = std::shared_ptr; diff --git a/datamodel/libUserTypes/include/user_types/Texture.h b/datamodel/libUserTypes/include/user_types/Texture.h index 9d8ef8d3..6aff85d6 100644 --- a/datamodel/libUserTypes/include/user_types/Texture.h +++ b/datamodel/libUserTypes/include/user_types/Texture.h @@ -46,7 +46,7 @@ class Texture : public TextureSampler2DBase { void updateFromExternalFile(BaseContext& context) override; - Property textureFormat_{DEFAULT_VALUE_TEXTURE_FORMAT_RGBA8, {"Format"}, {EngineEnumeration::TextureFormat}}; + Property textureFormat_{DEFAULT_VALUE_TEXTURE_FORMAT_RGBA8, {"Format"}, {EUserTypeEnumerations::TextureFormat}}; Property flipTexture_{false, DisplayNameAnnotation("Flip Vertically")}; Property generateMipmaps_{false, DisplayNameAnnotation("Generate Mipmaps")}; diff --git a/datamodel/libUserTypes/include/user_types/TextureExternal.h b/datamodel/libUserTypes/include/user_types/TextureExternal.h index 7c69de33..4e5550dd 100644 --- a/datamodel/libUserTypes/include/user_types/TextureExternal.h +++ b/datamodel/libUserTypes/include/user_types/TextureExternal.h @@ -41,8 +41,8 @@ class TextureExternal : public BaseObject { // Using TextureMagSamplingMethod enumeration for min sampler is weird, but for external textures // only nearest and linear are allowed by ramses so instead of creating a new enumeration with the same // content we just reuse the mag sampling method one. - Property minSamplingMethod_{DEFAULT_VALUE_TEXTURE_SAMPLER_TEXTURE_MAG_SAMPLING_METHOD_NEAREST, DisplayNameAnnotation("Min Sampling Method"), EnumerationAnnotation{TextureMagSamplingMethod}}; - Property magSamplingMethod_{DEFAULT_VALUE_TEXTURE_SAMPLER_TEXTURE_MAG_SAMPLING_METHOD_NEAREST, DisplayNameAnnotation("Mag Sampling Method"), EnumerationAnnotation{TextureMagSamplingMethod}}; + Property minSamplingMethod_{DEFAULT_VALUE_TEXTURE_SAMPLER_TEXTURE_MAG_SAMPLING_METHOD_NEAREST, DisplayNameAnnotation("Min Sampling Method"), EnumerationAnnotation{EUserTypeEnumerations::TextureMagSamplingMethod}}; + Property magSamplingMethod_{DEFAULT_VALUE_TEXTURE_SAMPLER_TEXTURE_MAG_SAMPLING_METHOD_NEAREST, DisplayNameAnnotation("Mag Sampling Method"), EnumerationAnnotation{EUserTypeEnumerations::TextureMagSamplingMethod}}; }; using STextureExternal = std::shared_ptr; diff --git a/datamodel/libUserTypes/include/user_types/UserObjectFactory.h b/datamodel/libUserTypes/include/user_types/UserObjectFactory.h index 8e75932e..791420e0 100644 --- a/datamodel/libUserTypes/include/user_types/UserObjectFactory.h +++ b/datamodel/libUserTypes/include/user_types/UserObjectFactory.h @@ -182,6 +182,7 @@ class UserObjectFactory : public raco::core::UserObjectFactoryInterface { // EditorObject Property, + Property, Property, Property, diff --git a/datamodel/libUserTypes/src/Enumerations.cpp b/datamodel/libUserTypes/src/Enumerations.cpp index 15e4823e..8faf0308 100644 --- a/datamodel/libUserTypes/src/Enumerations.cpp +++ b/datamodel/libUserTypes/src/Enumerations.cpp @@ -9,21 +9,149 @@ */ #include "user_types/Enumerations.h" + #include #include +#include namespace raco::user_types { -std::map enumerationRenderLayerOrder{ +const std::map& enumerationDescription(core::EUserTypeEnumerations type) { + static const std::map enumerationEmpty; + + switch (type) { + case core::EUserTypeEnumerations::CullMode: + return raco::user_types::enumDescriptionCullMode; + case core::EUserTypeEnumerations::BlendOperation: + return raco::user_types::enumDescriptionBlendOperation; + case core::EUserTypeEnumerations::BlendFactor: + return raco::user_types::enumDescriptionBlendFactor; + case core::EUserTypeEnumerations::DepthFunction: + return raco::user_types::enumDescriptionDepthFunction; + case core::EUserTypeEnumerations::TextureAddressMode: + return raco::user_types::enumDescriptionTextureAddressMode; + case core::EUserTypeEnumerations::TextureMinSamplingMethod: + return raco::user_types::enumDescriptionTextureMinSamplingMethod; + case core::EUserTypeEnumerations::TextureMagSamplingMethod: + return raco::user_types::enumDescriptionTextureMagSamplingMethod; + case core::EUserTypeEnumerations::TextureFormat: + return raco::user_types::enumDescriptionTextureFormat; + + case core::EUserTypeEnumerations::RenderBufferFormat: + return raco::user_types::enumDescriptionRenderBufferFormat; + + case core::EUserTypeEnumerations::RenderLayerOrder: + return raco::user_types::enumDescriptionRenderLayerOrder; + + case core::EUserTypeEnumerations::RenderLayerMaterialFilterMode: + return raco::user_types::enumDescriptionRenderLayerMaterialFilterMode; + + case core::EUserTypeEnumerations::FrustumType: + return raco::user_types::enumDescriptionFrustumType; + + default: + assert(false); + return enumerationEmpty; + } +} + +std::map enumDescriptionCullMode{ + {static_cast(ECullMode::Disabled), "Disabled"}, + {static_cast(ECullMode::FrontFacing), "Front"}, + {static_cast(ECullMode::BackFacing), "Back"}, + {static_cast(ECullMode::FrontAndBackFacing), "Front and Back"}}; + +std::map enumDescriptionBlendOperation{ + {static_cast(EBlendOperation::Disabled), "Disabled"}, + {static_cast(EBlendOperation::Add), "Add"}, + {static_cast(EBlendOperation::Subtract), "Subtract"}, + {static_cast(EBlendOperation::ReverseSubtract), "Reverse Subtract"}, + {static_cast(EBlendOperation::Min), "Min"}, + {static_cast(EBlendOperation::Max), "Max"}}; + +std::map enumDescriptionBlendFactor{ + {static_cast(EBlendFactor::Zero), "Zero"}, + {static_cast(EBlendFactor::One), "One"}, + {static_cast(EBlendFactor::SrcAlpha), "Src Alpha"}, + {static_cast(EBlendFactor::OneMinusSrcAlpha), "One minus Src Alpha"}, + {static_cast(EBlendFactor::DstAlpha), "Dst Alpha"}, + {static_cast(EBlendFactor::OneMinusDstAlpha), "One minus Dst Alpha"}, + {static_cast(EBlendFactor::SrcColor), "Src Color"}, + {static_cast(EBlendFactor::OneMinusSrcColor), "One minus Src Color"}, + {static_cast(EBlendFactor::DstColor), "Dst Color"}, + {static_cast(EBlendFactor::OneMinusDstColor), "One minus Dst Color"}, + {static_cast(EBlendFactor::ConstColor), "Const Color"}, + {static_cast(EBlendFactor::OneMinusConstColor), "One minus Const Color"}, + {static_cast(EBlendFactor::ConstAlpha), "Const Alpha"}, + {static_cast(EBlendFactor::OneMinusConstAlpha), "One minus Const Alpha"}, + {static_cast(EBlendFactor::AlphaSaturate), "Alpha Saturated"}}; + +std::map enumDescriptionDepthFunction{ + {static_cast(EDepthFunc::Disabled), "Disabled"}, + {static_cast(EDepthFunc::Greater), ">"}, + {static_cast(EDepthFunc::GreaterEqual), ">="}, + {static_cast(EDepthFunc::Less), "<"}, + {static_cast(EDepthFunc::LessEqual), "<="}, + {static_cast(EDepthFunc::Equal), "="}, + {static_cast(EDepthFunc::NotEqual), "!="}, + {static_cast(EDepthFunc::Always), "true"}, + {static_cast(EDepthFunc::Never), "false"}}; + +std::map enumDescriptionTextureAddressMode{ + {static_cast(ETextureAddressMode::Clamp), "Clamp"}, + {static_cast(ETextureAddressMode::Repeat), "Repeat"}, + {static_cast(ETextureAddressMode::Mirror), "Mirror"}}; + +std::map enumDescriptionTextureMinSamplingMethod{ + {static_cast(ETextureSamplingMethod::Nearest), "Nearest"}, + {static_cast(ETextureSamplingMethod::Linear), "Linear"}, + {static_cast(ETextureSamplingMethod::Nearest_MipMapNearest), "Nearest MipMapNearest"}, + {static_cast(ETextureSamplingMethod::Nearest_MipMapLinear), "Nearest MipMapLinear"}, + {static_cast(ETextureSamplingMethod::Linear_MipMapNearest), "Linear MipMapNearest"}, + {static_cast(ETextureSamplingMethod::Linear_MipMapLinear), "Linear MipMapLinear"}}; + +std::map enumDescriptionTextureMagSamplingMethod{ + {static_cast(ETextureSamplingMethod::Nearest), "Nearest"}, + {static_cast(ETextureSamplingMethod::Linear), "Linear"}}; + +std::map enumDescriptionTextureFormat{ + {static_cast(ETextureFormat::R8), "R8"}, + {static_cast(ETextureFormat::RG8), "RG8"}, + {static_cast(ETextureFormat::RGB8), "RGB8"}, + {static_cast(ETextureFormat::RGBA8), "RGBA8"}, + {static_cast(ETextureFormat::RGB16F), "RGB16F"}, + {static_cast(ETextureFormat::RGBA16F), "RGBA16F"}, + {static_cast(ETextureFormat::SRGB8), "SRGB8"}, + {static_cast(ETextureFormat::SRGB8_ALPHA8), "SRGB8_ALPHA8"}, +}; + +std::map enumDescriptionRenderBufferFormat{ + {static_cast(ERenderBufferFormat::RGBA4), "RGBA4"}, + {static_cast(ERenderBufferFormat::R8), "R8"}, + {static_cast(ERenderBufferFormat::RG8), "RG8"}, + {static_cast(ERenderBufferFormat::RGB8), "RGB8"}, + {static_cast(ERenderBufferFormat::RGBA8), "RGBA8"}, + {static_cast(ERenderBufferFormat::R16F), "R16F"}, + {static_cast(ERenderBufferFormat::R32F), "R32F"}, + {static_cast(ERenderBufferFormat::RG16F), "RG16F"}, + {static_cast(ERenderBufferFormat::RG32F), "RG32F"}, + {static_cast(ERenderBufferFormat::RGB16F), "RGB16F"}, + {static_cast(ERenderBufferFormat::RGB32F), "RGB32F"}, + {static_cast(ERenderBufferFormat::RGBA16F), "RGBA16F"}, + {static_cast(ERenderBufferFormat::RGBA32F), "RGBA32F"}, + + {static_cast(ERenderBufferFormat::Depth24), "Depth24"}, + {static_cast(ERenderBufferFormat::Depth24_Stencil8), "Depth24_Stencil8"}}; + +std::map enumDescriptionRenderLayerOrder{ {static_cast(ERenderLayerOrder::Manual), "Render order value in 'Renderable Tags'"}, {static_cast(ERenderLayerOrder::SceneGraph), "Scene graph order"}}; -std::map enumerationRenderLayerMaterialFilterMode{ +std::map enumDescriptionRenderLayerMaterialFilterMode{ {static_cast(ERenderLayerMaterialFilterMode::Inclusive), "Include materials with any of the listed tags"}, {static_cast(ERenderLayerMaterialFilterMode::Exclusive), "Exclude materials with any of the listed tags"}}; - -std::map enumerationFrustumType{ +std::map enumDescriptionFrustumType{ {static_cast(EFrustumType::Aspect_FieldOfView), "Aspect & Field Of View"}, {static_cast(EFrustumType::Planes), "Planes"}}; diff --git a/gui/libCommonWidgets/include/common_widgets/ExportDialog.h b/gui/libCommonWidgets/include/common_widgets/ExportDialog.h index c0485b6f..9fb4d94f 100644 --- a/gui/libCommonWidgets/include/common_widgets/ExportDialog.h +++ b/gui/libCommonWidgets/include/common_widgets/ExportDialog.h @@ -12,10 +12,10 @@ #include "PropertyBrowserButton.h" #include "application/RaCoApplication.h" #include +#include #include #include #include -#include #include namespace raco::common_widgets { @@ -31,10 +31,12 @@ class ExportDialog final : public QDialog { void updateButtonStates(); QGridLayout* layout_; + QGridLayout* optionLayout_; QCheckBox* compressEdit_; QLineEdit* ramsesEdit_; QLineEdit* logicEdit_; QDialogButtonBox* buttonBox_; + QComboBox* luaSavingModeCombo_; application::RaCoApplication* application_; void setupFilePickerButton(PropertyBrowserButton* button, QLineEdit* pathEdit, const std::string& fileType); diff --git a/gui/libCommonWidgets/include/common_widgets/LogView.h b/gui/libCommonWidgets/include/common_widgets/LogView.h index d35b61e2..9bc7ef48 100644 --- a/gui/libCommonWidgets/include/common_widgets/LogView.h +++ b/gui/libCommonWidgets/include/common_widgets/LogView.h @@ -12,9 +12,6 @@ #include "common_widgets/log_model/LogViewSink.h" #include "common_widgets/log_model/LogViewSortFilterProxyModel.h" -#include -#include -#include #include #include #include @@ -31,19 +28,13 @@ public Q_SLOTS: void updateWarningErrorLabel(); void customMenuRequested(QPoint pos); -protected: - QTableView* tableView_; - - bool event(QEvent* event) override; +private: void copySelectedRows(); - void keyPressEvent(QKeyEvent* event) override; - -private: + QTableView* tableView_; LogViewModel* model_; LogViewSortFilterProxyModel* proxyModel_; QLabel* warningErrorLabel_; - }; } // namespace raco::common_widgets \ No newline at end of file diff --git a/gui/libCommonWidgets/src/ExportDialog.cpp b/gui/libCommonWidgets/src/ExportDialog.cpp index 72860e9a..5386fc03 100644 --- a/gui/libCommonWidgets/src/ExportDialog.cpp +++ b/gui/libCommonWidgets/src/ExportDialog.cpp @@ -116,6 +116,19 @@ ExportDialog::ExportDialog(application::RaCoApplication* application, LogViewMod contentLayout->addWidget(compressEdit_, 2, 1); compressEdit_->setChecked(true); + contentLayout->addWidget(new QLabel{"Lua saving mode:", content}, 3, 0); + luaSavingModeCombo_ = new QComboBox(content); + luaSavingModeCombo_->addItem("SourceCodeOnly", static_cast(raco::application::ELuaSavingMode::SourceCodeOnly)); + luaSavingModeCombo_->addItem("ByteCodeOnly", static_cast(raco::application::ELuaSavingMode::ByteCodeOnly)); + luaSavingModeCombo_->addItem("SourceAndByteCode", static_cast(raco::application::ELuaSavingMode::SourceAndByteCode)); + // SourceCodeOnly is default setting + luaSavingModeCombo_->setCurrentIndex(0); + contentLayout->addWidget(luaSavingModeCombo_, 3, 1); + + if (application->activeRaCoProject().project()->featureLevel() < 2) { + luaSavingModeCombo_->setEnabled(false); + } + if (!application_->activeProjectPath().empty()) { ramsesEdit_->setText(application_->activeRaCoProject().name() + "." + raco::names::FILE_EXTENSION_RAMSES_EXPORT); logicEdit_->setText(application_->activeRaCoProject().name() + "." + raco::names::FILE_EXTENSION_LOGIC_EXPORT); @@ -195,7 +208,10 @@ void ExportDialog::exportProject() { if (application_->exportProject( ramsesFilePath.string(), logicFilePath.string(), - compressEdit_->isChecked(), error, true)) { + compressEdit_->isChecked(), + error, + true, + static_cast(luaSavingModeCombo_->currentData().toInt()))) { accept(); } else { QMessageBox::critical( diff --git a/gui/libCommonWidgets/src/LogView.cpp b/gui/libCommonWidgets/src/LogView.cpp index c55fe725..ccbb2490 100644 --- a/gui/libCommonWidgets/src/LogView.cpp +++ b/gui/libCommonWidgets/src/LogView.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -120,26 +121,11 @@ LogView::LogView(LogViewModel* model, QWidget* parent) : model_(model) { logViewLayout->addWidget(tableView_); logViewLayout->addWidget(filterLayoutWidget); -} - -bool LogView::event(QEvent* event) { - // We want to override the application wide Ctrl+C handling if this widget is focussed. - if (event->type() == QEvent::ShortcutOverride) { - QKeyEvent* keyEvent = static_cast(event); - if (keyEvent->matches(QKeySequence::Copy)) { - keyEvent->setAccepted(true); - return true; - } - } - return QWidget::event(event); -} - -void LogView::keyPressEvent(QKeyEvent* event) { - if (event->matches(QKeySequence::Copy)) { + auto copyShortcut = new QShortcut(QKeySequence::Copy, this, nullptr, nullptr, Qt::WidgetWithChildrenShortcut); + QObject::connect(copyShortcut, &QShortcut::activated, this, [this]() { copySelectedRows(); - event->setAccepted(true); - } + }); } void LogView::customMenuRequested(QPoint pos) { diff --git a/gui/libObjectTree/include/object_tree_view/ObjectTreeView.h b/gui/libObjectTree/include/object_tree_view/ObjectTreeView.h index a1add5f0..a8cf9ba8 100644 --- a/gui/libObjectTree/include/object_tree_view/ObjectTreeView.h +++ b/gui/libObjectTree/include/object_tree_view/ObjectTreeView.h @@ -60,11 +60,13 @@ class ObjectTreeView : public QTreeView { public Q_SLOTS: void resetSelection(); - void globalCopyCallback(); - void cut(); + + void copyObjects(); + void pasteObjects(const QModelIndex &index, bool asExtRef = false); + void cutObjects(); + void deleteObjects(); void duplicateObjects(); - void globalPasteCallback(const QModelIndex &index, bool asExtRef = false); - void shortcutDelete(); + void selectObject(const QString &objectID); void expandAllParentsOfObject(const QString &objectID); void expanded(const QModelIndex &index); diff --git a/gui/libObjectTree/include/object_tree_view_model/ObjectTreeNode.h b/gui/libObjectTree/include/object_tree_view_model/ObjectTreeNode.h index 0028d135..fd8c883c 100644 --- a/gui/libObjectTree/include/object_tree_view_model/ObjectTreeNode.h +++ b/gui/libObjectTree/include/object_tree_view_model/ObjectTreeNode.h @@ -50,6 +50,7 @@ class ObjectTreeNode { ObjectTreeNodeType getType() const; std::string getID() const; + std::vector getUserTags() const; std::string getDisplayName() const; std::string getDisplayType() const; std::string getTypeName() const; diff --git a/gui/libObjectTree/include/object_tree_view_model/ObjectTreeViewDefaultModel.h b/gui/libObjectTree/include/object_tree_view_model/ObjectTreeViewDefaultModel.h index 103d6e7c..d2d0d8d9 100644 --- a/gui/libObjectTree/include/object_tree_view_model/ObjectTreeViewDefaultModel.h +++ b/gui/libObjectTree/include/object_tree_view_model/ObjectTreeViewDefaultModel.h @@ -47,6 +47,8 @@ class ObjectTreeViewDefaultModel : public QAbstractItemModel { COLUMNINDEX_TYPE, // invisible column that is used for ID-based filtering in the tree views COLUMNINDEX_ID, + // invisible column used for tag based filtering + COLUMNINDEX_USERTAGS, COLUMNINDEX_PROJECT, COLUMNINDEX_COLUMN_COUNT }; diff --git a/gui/libObjectTree/src/object_tree_view/ObjectTreeDock.cpp b/gui/libObjectTree/src/object_tree_view/ObjectTreeDock.cpp index 9ad012fa..512ea94d 100644 --- a/gui/libObjectTree/src/object_tree_view/ObjectTreeDock.cpp +++ b/gui/libObjectTree/src/object_tree_view/ObjectTreeDock.cpp @@ -35,7 +35,10 @@ ObjectTreeDock::ObjectTreeDock(const char *dockTitle, QWidget *parent) filterLineEdit_ = new QLineEdit(this); filterLineEdit_->setPlaceholderText("Filter Objects..."); filterByComboBox_ = new QComboBox(this); - filterByComboBox_->addItems({"Filter by Name", "Filter by Type", "Filter by Object ID"}); + filterByComboBox_->addItem("Filter by Name", QVariant(raco::object_tree::model::ObjectTreeViewDefaultModel::ColumnIndex::COLUMNINDEX_NAME)); + filterByComboBox_->addItem("Filter by Type", QVariant(raco::object_tree::model::ObjectTreeViewDefaultModel::ColumnIndex::COLUMNINDEX_TYPE)); + filterByComboBox_->addItem("Filter by Object ID", QVariant(raco::object_tree::model::ObjectTreeViewDefaultModel::ColumnIndex::COLUMNINDEX_ID)); + filterByComboBox_->addItem("Filter by User Tag", QVariant(raco::object_tree::model::ObjectTreeViewDefaultModel::ColumnIndex::COLUMNINDEX_USERTAGS)); auto treeDockSettingsWidget = new QWidget(treeDockContent_); treeDockSettingsLayout_ = new raco::common_widgets::NoContentMarginsLayout(treeDockSettingsWidget); @@ -54,7 +57,7 @@ ObjectTreeDock::ObjectTreeDock(const char *dockTitle, QWidget *parent) }); connect(filterByComboBox_, &QComboBox::currentTextChanged, [this]() { - auto currentIndex = filterByComboBox_->currentIndex(); + auto currentIndex = filterByComboBox_->currentData().toInt(); getActiveTreeView()->setFilterKeyColumn(currentIndex); diff --git a/gui/libObjectTree/src/object_tree_view/ObjectTreeView.cpp b/gui/libObjectTree/src/object_tree_view/ObjectTreeView.cpp index 88d0353a..8165d28c 100644 --- a/gui/libObjectTree/src/object_tree_view/ObjectTreeView.cpp +++ b/gui/libObjectTree/src/object_tree_view/ObjectTreeView.cpp @@ -64,6 +64,7 @@ ObjectTreeView::ObjectTreeView(const QString &viewTitle, ObjectTreeViewDefaultMo // hidden column for data only used for filtering, enable to reveal object IDs setColumnHidden(ObjectTreeViewDefaultModel::COLUMNINDEX_ID, true); + setColumnHidden(ObjectTreeViewDefaultModel::COLUMNINDEX_USERTAGS, true); connect(this, &QTreeView::customContextMenuRequested, this, &ObjectTreeView::showContextMenu); connect(this, &QTreeView::expanded, this, &ObjectTreeView::expanded); @@ -93,10 +94,18 @@ ObjectTreeView::ObjectTreeView(const QString &viewTitle, ObjectTreeViewDefaultMo setColumnWidth(ObjectTreeViewDefaultModel::COLUMNINDEX_NAME, width() / 3); + auto copyShortcut = new QShortcut(QKeySequence::Copy, this, nullptr, nullptr, Qt::WidgetShortcut); + QObject::connect(copyShortcut, &QShortcut::activated, this, &ObjectTreeView::copyObjects); + + auto pasteShortcut = new QShortcut(QKeySequence::Paste, this, nullptr, nullptr, Qt::WidgetShortcut); + QObject::connect(pasteShortcut, &QShortcut::activated, this, [this]() { + pasteObjects(getSelectedInsertionTargetIndex()); + }); + auto cutShortcut = new QShortcut(QKeySequence::Cut, this, nullptr, nullptr, Qt::WidgetShortcut); - QObject::connect(cutShortcut, &QShortcut::activated, this, &ObjectTreeView::cut); + QObject::connect(cutShortcut, &QShortcut::activated, this, &ObjectTreeView::cutObjects); auto deleteShortcut = new QShortcut({"Del"}, this, nullptr, nullptr, Qt::WidgetShortcut); - QObject::connect(deleteShortcut, &QShortcut::activated, this, &ObjectTreeView::shortcutDelete); + QObject::connect(deleteShortcut, &QShortcut::activated, this, &ObjectTreeView::deleteObjects); auto duplicateShortcut = new QShortcut({"Ctrl+D"}, this, nullptr, nullptr, Qt::WidgetShortcut); QObject::connect(duplicateShortcut, &QShortcut::activated, this, &ObjectTreeView::duplicateObjects); @@ -169,7 +178,7 @@ std::vector ObjectTreeView::getSortedSelectedEditorObjects( return result; } -void ObjectTreeView::globalCopyCallback() { +void ObjectTreeView::copyObjects() { auto selectedIndices = getSelectedIndices(true); if (!selectedIndices.empty()) { if (canCopyAtIndices(selectedIndices)) { @@ -178,7 +187,22 @@ void ObjectTreeView::globalCopyCallback() { } } -void ObjectTreeView::shortcutDelete() { +void ObjectTreeView::pasteObjects(const QModelIndex &index, bool asExtRef) { + if (canPasteIntoIndex(index, asExtRef)) { + treeModel_->pasteObjectAtIndex(index, asExtRef); + } else if (canPasteIntoIndex({}, asExtRef)) { + treeModel_->pasteObjectAtIndex({}, asExtRef); + } +} + +void ObjectTreeView::cutObjects() { + auto selectedIndices = getSelectedIndices(true); + if (!selectedIndices.isEmpty()) { + treeModel_->cutObjectsAtIndices(selectedIndices, false); + } +} + +void ObjectTreeView::deleteObjects() { auto selectedIndices = getSelectedIndices(); if (!selectedIndices.empty()) { auto delObjAmount = treeModel_->deleteObjectsAtIndices(selectedIndices); @@ -189,6 +213,13 @@ void ObjectTreeView::shortcutDelete() { } } +void raco::object_tree::view::ObjectTreeView::duplicateObjects() { + auto selectedIndices = getSelectedIndices(true); + if (!selectedIndices.isEmpty() && treeModel_->canDuplicateAtIndices(selectedIndices)) { + treeModel_->duplicateObjectsAtIndices(selectedIndices); + } +} + void ObjectTreeView::selectObject(const QString &objectID) { if (objectID.isEmpty()) { resetSelection(); @@ -234,28 +265,6 @@ void ObjectTreeView::collapseRecusively(const QModelIndex& index) { } } -void ObjectTreeView::cut() { - auto selectedIndices = getSelectedIndices(true); - if (!selectedIndices.isEmpty()) { - treeModel_->cutObjectsAtIndices(selectedIndices, false); - } -} - -void raco::object_tree::view::ObjectTreeView::duplicateObjects() { - auto selectedIndices = getSelectedIndices(true); - if (!selectedIndices.isEmpty() && treeModel_->canDuplicateAtIndices(selectedIndices)) { - treeModel_->duplicateObjectsAtIndices(selectedIndices); - } -} - -void ObjectTreeView::globalPasteCallback(const QModelIndex &index, bool asExtRef) { - if (canPasteIntoIndex(index, asExtRef)) { - treeModel_->pasteObjectAtIndex(index, asExtRef); - } else if (canPasteIntoIndex({}, asExtRef)) { - treeModel_->pasteObjectAtIndex({}, asExtRef); - } -} - QString ObjectTreeView::getViewTitle() const { return viewTitle_; } diff --git a/gui/libObjectTree/src/object_tree_view_model/ObjectTreeNode.cpp b/gui/libObjectTree/src/object_tree_view_model/ObjectTreeNode.cpp index 76fb2b8d..c83f7210 100644 --- a/gui/libObjectTree/src/object_tree_view_model/ObjectTreeNode.cpp +++ b/gui/libObjectTree/src/object_tree_view_model/ObjectTreeNode.cpp @@ -99,7 +99,9 @@ ObjectTreeNodeType ObjectTreeNode::getType() const { namespace { std::map irregularObjectTypePluralNames{ {raco::serialization::proxy::meshTypeName, "Meshes"}, - {raco::serialization::proxy::renderPassTypeName, "RenderPasses"}}; + {raco::serialization::proxy::renderPassTypeName, "RenderPasses"}, + {raco::serialization::proxy::blitPassTypeName, "BlitPasses"}, + {raco::serialization::proxy::renderBufferMSTypeName, "RenderBufferMS"}}; } std::string ObjectTreeNode::getDisplayName() const { @@ -183,6 +185,13 @@ std::string ObjectTreeNode::getID() const { } } +std::vector ObjectTreeNode::getUserTags() const { + if (type_ == ObjectTreeNodeType::EditorObject) { + return representedObject_->userTags_->asVector(); + } + return {}; +} + SEditorObject ObjectTreeNode::getRepresentedObject() const { return representedObject_; } diff --git a/gui/libObjectTree/src/object_tree_view_model/ObjectTreeViewDefaultModel.cpp b/gui/libObjectTree/src/object_tree_view_model/ObjectTreeViewDefaultModel.cpp index 7f0e6f7f..49050386 100644 --- a/gui/libObjectTree/src/object_tree_view_model/ObjectTreeViewDefaultModel.cpp +++ b/gui/libObjectTree/src/object_tree_view_model/ObjectTreeViewDefaultModel.cpp @@ -167,6 +167,13 @@ QVariant ObjectTreeViewDefaultModel::data(const QModelIndex& index, int role) co return QVariant(QString::fromStdString(treeNode->getDisplayType())); case COLUMNINDEX_ID: return QVariant(QString::fromStdString(treeNode->getID())); + case COLUMNINDEX_USERTAGS: { + QStringList qtags; + for (const auto& tag : treeNode->getUserTags()) { + qtags.append(QString::fromStdString(tag)); + } + return QVariant(qtags.join(", ")); + } case COLUMNINDEX_PROJECT: return QVariant(QString::fromStdString(treeNode->getExternalProjectName())); case COLUMNINDEX_VISIBILITY: @@ -191,6 +198,8 @@ QVariant ObjectTreeViewDefaultModel::headerData(int section, Qt::Orientation ori return QVariant("Type"); case COLUMNINDEX_ID: return QVariant("ID"); + case COLUMNINDEX_USERTAGS: + return QVariant("User Tags"); case COLUMNINDEX_PROJECT: return QVariant("Project Name"); } diff --git a/gui/libObjectTree/tests/ObjectTreeViewDefaultModel_test.cpp b/gui/libObjectTree/tests/ObjectTreeViewDefaultModel_test.cpp index ca47fded..de08f88a 100644 --- a/gui/libObjectTree/tests/ObjectTreeViewDefaultModel_test.cpp +++ b/gui/libObjectTree/tests/ObjectTreeViewDefaultModel_test.cpp @@ -77,6 +77,12 @@ void ObjectTreeViewDefaultModelTest::compareValuesInTree(const SEditorObject &ob treeValue = objTreeNode->getRepresentedObject()->objectID(); objValue = obj->objectID(); } + break; + case ObjectTreeViewDefaultModel::COLUMNINDEX_USERTAGS: { + auto treeValue = objTreeNode->getUserTags(); + auto objValue = obj->userTags_->asVector(); + ASSERT_EQ(treeValue, objValue); + } break; default: { FAIL() << "Need to check value equivalence for new ObjectTreeViewDefaultModel column enum value"; diff --git a/gui/libPropertyBrowser/src/PropertyBrowserItem.cpp b/gui/libPropertyBrowser/src/PropertyBrowserItem.cpp index 0b3e99a4..e66ecb05 100644 --- a/gui/libPropertyBrowser/src/PropertyBrowserItem.cpp +++ b/gui/libPropertyBrowser/src/PropertyBrowserItem.cpp @@ -253,8 +253,8 @@ bool PropertyBrowserItem::editable() noexcept { } bool PropertyBrowserItem::expandable() const noexcept { - return valueHandle_.isObject() || - valueHandle_.hasSubstructure() && !query(); + return valueHandle_.isObject() || + valueHandle_.hasSubstructure() && !query() && !query(); } bool PropertyBrowserItem::showChildren() const { diff --git a/gui/libPropertyBrowser/src/PropertyBrowserWidget.cpp b/gui/libPropertyBrowser/src/PropertyBrowserWidget.cpp index 3e45d123..fd451f99 100644 --- a/gui/libPropertyBrowser/src/PropertyBrowserWidget.cpp +++ b/gui/libPropertyBrowser/src/PropertyBrowserWidget.cpp @@ -200,17 +200,10 @@ void PropertyBrowserWidget::setValueHandle(core::ValueHandle valueHandle) { restorableObjectId_ = valueHandle.rootObject()->objectID(); subscription_ = dispatcher_->registerOnObjectsLifeCycle([](auto) {}, [this, valueHandle](core::SEditorObject obj) { if (valueHandle.rootObject() == obj) { - // SaveAs with new project ID will delete the ProjecSettings object and create a new one in order to change the object ID. - // We want to move a ProjectSettings property browser to the new ProjectSettings object automatically, - // so we detect this case and instead of clearing we find the new settings object and set a new ValueHandle with it. - if (obj->isType()) { - setValueHandle({commandInterface_->project()->settings()}); - } else { - if (locked_) { - setLocked(false); - } - clearValueHandle(true); + if (locked_) { + setLocked(false); } + clearValueHandle(true); } }); propertyBrowser_.reset(new PropertyBrowserView{sceneBackend_, new PropertyBrowserItem{valueHandle, dispatcher_, commandInterface_, sceneBackend_, model_}, model_, this}); diff --git a/gui/libPropertyBrowser/src/WidgetFactory.cpp b/gui/libPropertyBrowser/src/WidgetFactory.cpp index ad063c12..8c4d9659 100644 --- a/gui/libPropertyBrowser/src/WidgetFactory.cpp +++ b/gui/libPropertyBrowser/src/WidgetFactory.cpp @@ -76,7 +76,7 @@ PropertyEditor* WidgetFactory::createPropertyEditor(PropertyBrowserItem* item, Q return new PropertyEditor{ item, parent }; } case PrimitiveType::Table: - if (item->query() || item->query()) { + if (item->query() || item->query() || item->query()) { return new TagContainerEditor{ item, parent }; } return new PropertyEditor{ item, parent }; diff --git a/gui/libPropertyBrowser/src/editors/EnumerationEditor.cpp b/gui/libPropertyBrowser/src/editors/EnumerationEditor.cpp index 4db68c78..601d17e6 100644 --- a/gui/libPropertyBrowser/src/editors/EnumerationEditor.cpp +++ b/gui/libPropertyBrowser/src/editors/EnumerationEditor.cpp @@ -17,6 +17,8 @@ #include "property_browser/PropertyBrowserLayouts.h" #include "property_browser/controls/MouseWheelGuard.h" #include "style/Colors.h" +#include "user_types/Enumerations.h" +#include "core/EngineInterface.h" #include @@ -29,7 +31,7 @@ EnumerationEditor::EnumerationEditor(PropertyBrowserItem* item, QWidget* parent) comboBox_->installEventFilter(new MouseWheelGuard()); layout->addWidget(comboBox_); - auto& values = item->engineInterface().enumerationDescription(static_cast(item->query()->type_.asInt())); + auto& values = raco::user_types::enumerationDescription(static_cast(item->query()->type_.asInt())); for (const auto& [entryEnumValue, entryEnumString] : values) { comboBox_->addItem(entryEnumString.c_str()); ramsesEnumIndexToComboBoxIndex_[entryEnumValue] = comboBoxIndexToRamsesEnumIndex_.size(); diff --git a/gui/libPropertyBrowser/src/editors/TagContainerEditor.cpp b/gui/libPropertyBrowser/src/editors/TagContainerEditor.cpp index 01da309d..ee5f08fd 100644 --- a/gui/libPropertyBrowser/src/editors/TagContainerEditor.cpp +++ b/gui/libPropertyBrowser/src/editors/TagContainerEditor.cpp @@ -34,7 +34,9 @@ namespace raco::property_browser { TagContainerEditor::TagContainerEditor(PropertyBrowserItem* item, QWidget* parent) : PropertyEditor(item, parent) { auto* layout{new PropertyBrowserGridLayout{this}}; - if (item->valueHandle().rootObject()->isType()) { + if (item->valueHandle().isRefToProp(&user_types::EditorObject::userTags_)) { + tagType_ = raco::core::TagType::UserTags; + } else if (item->valueHandle().rootObject()->isType()) { tagType_ = raco::core::TagType::MaterialTags; } else if (item->valueHandle().rootObject()->isType()) { if (item->valueHandle().isRefToProp(&user_types::RenderLayer::materialFilterTags_)) { diff --git a/gui/libPropertyBrowser/src/editors/TagContainerEditor/TagContainerEditor_Popup.cpp b/gui/libPropertyBrowser/src/editors/TagContainerEditor/TagContainerEditor_Popup.cpp index d99b979f..f9431124 100644 --- a/gui/libPropertyBrowser/src/editors/TagContainerEditor/TagContainerEditor_Popup.cpp +++ b/gui/libPropertyBrowser/src/editors/TagContainerEditor/TagContainerEditor_Popup.cpp @@ -135,6 +135,9 @@ namespace raco::property_browser { availableTagsItemModel_->addTag(tag, listOfRenderLayerNames, forbiddenTags_.find(tag.toStdString()) == forbiddenTags_.end()); } listOfAvailableTags_.setModel(availableTagsItemModel_); + if (tagType_ == raco::core::TagType::UserTags) { + listOfAvailableTags_.header()->hideSection(1); + } if (showRenderedBy()) { referencedBy_.setWordWrap(true); @@ -213,6 +216,9 @@ namespace raco::property_browser { raco::core::Queries::findRenderLayerForbiddenRenderableTags(*tagDataCache_, item_->valueHandle().rootObject()->as(), forbiddenTags_); break; } + case raco::core::TagType::UserTags: { + break; + } } tagListItemModel_->setForbiddenTags(forbiddenTags_); availableTagsItemModel_->setForbiddenTags(forbiddenTags_); diff --git a/resources/scripts/logging-test.lua b/resources/scripts/logging-test.lua new file mode 100644 index 00000000..fe2072ae --- /dev/null +++ b/resources/scripts/logging-test.lua @@ -0,0 +1,13 @@ +function interface(IN,OUT) + IN.choice = Type:Int32() +end + +function run(IN,OUT) + if IN.choice < 0 then + rl_logError(string.format("choice < 0: %s", IN.choice)) + elseif IN.choice == 0 then + rl_logWarn("choice == 0") + else + rl_logInfo(string.format("choice > 0: %s", IN.choice)) + end +end diff --git a/resources/scripts/uniform-array.lua b/resources/scripts/uniform-array.lua new file mode 100644 index 00000000..bd16d25d --- /dev/null +++ b/resources/scripts/uniform-array.lua @@ -0,0 +1,13 @@ + +function interface(INOUT) + INOUT.ivec = Type:Array(2, Type:Int32()) + INOUT.fvec = Type:Array(5, Type:Float()) + + INOUT.avec2 = Type:Array(4, Type:Vec2f()) + INOUT.avec3 = Type:Array(5, Type:Vec3f()) + INOUT.avec4 = Type:Array(6, Type:Vec4f()) + + INOUT.aivec2 = Type:Array(4, Type:Vec2i()) + INOUT.aivec3 = Type:Array(5, Type:Vec3i()) + INOUT.aivec4 = Type:Array(6, Type:Vec4i()) +end diff --git a/resources/scripts/uniform-structs.lua b/resources/scripts/uniform-structs.lua new file mode 100644 index 00000000..9941f48e --- /dev/null +++ b/resources/scripts/uniform-structs.lua @@ -0,0 +1,37 @@ + +function interface(INOUT) + local struct_prim = { + i = Type:Int32(), + f = Type:Float(), + + v2 = Type:Vec2f(), + v3 = Type:Vec3f(), + v4 = Type:Vec4f(), + + iv2 = Type:Vec2i(), + iv3 = Type:Vec3i(), + iv4 = Type:Vec4i() + } + + local struct_array_prim = { + ivec = Type:Array(2, Type:Int32()), + fvec = Type:Array(5, Type:Float()), + + avec2 = Type:Array(4, Type:Vec2f()), + avec3 = Type:Array(5, Type:Vec3f()), + avec4 = Type:Array(6, Type:Vec4f()), + + aivec2 = Type:Array(4, Type:Vec2i()), + aivec3 = Type:Array(5, Type:Vec3i()), + aivec4 = Type:Array(6, Type:Vec4i()) + } + + local struct_array_struct = { + prims = Type:Array(2, struct_prim) + } + + INOUT.s_prims = struct_prim + INOUT.s_a_prims = struct_array_prim + INOUT.a_s_prims = Type:Array(2, struct_prim) + INOUT.s_a_struct_prim = struct_array_struct +end diff --git a/resources/shaders/uniform-samplers.frag b/resources/shaders/uniform-samplers.frag new file mode 100644 index 00000000..e9d7cf4b --- /dev/null +++ b/resources/shaders/uniform-samplers.frag @@ -0,0 +1,14 @@ +#version 310 es + +precision mediump float; + +uniform sampler2D s_texture; +uniform samplerCube s_cubemap; +uniform sampler2D s_buffer; +uniform mediump sampler2DMS s_buffer_ms; + +out mediump vec4 fragColor; + +void main(){ + fragColor = vec4(0.2, 0.4, 0.6, 1.0); +} \ No newline at end of file diff --git a/resources/shaders/uniform-samplers.vert b/resources/shaders/uniform-samplers.vert new file mode 100644 index 00000000..e7a25fbc --- /dev/null +++ b/resources/shaders/uniform-samplers.vert @@ -0,0 +1,11 @@ +#version 310 es + +precision mediump float; + +in vec3 a_Position; + +uniform mat4 u_MVPMatrix; + +void main() { + gl_Position = u_MVPMatrix * vec4(a_Position, 1.0); +} \ No newline at end of file diff --git a/resources/shaders/uniform-struct.frag b/resources/shaders/uniform-struct.frag new file mode 100644 index 00000000..be46af56 --- /dev/null +++ b/resources/shaders/uniform-struct.frag @@ -0,0 +1,75 @@ +#version 310 es + +precision mediump float; + +struct struct_prim { + int i; + float f; + + vec2 v2; + vec3 v3; + vec4 v4; + + ivec2 iv2; + ivec3 iv3; + ivec4 iv4; +}; + +struct struct_sampler { + sampler2D s_texture; + samplerCube s_cubemap; + sampler2D s_buffer; + mediump sampler2DMS s_buffer_ms; +}; + +struct struct_array_prim { + int ivec[2]; + float fvec[5]; + + vec2 avec2[4]; + vec3 avec3[5]; + vec4 avec4[6]; + + ivec2 aivec2[4]; + ivec3 aivec3[5]; + ivec4 aivec4[6]; +}; + +struct struct_array_struct_prim { + struct_prim prims[2]; +}; + +struct struct_array_struct_samplers { + struct_sampler samplers[2]; +}; + +struct struct_nested { + struct_prim prims; + struct_sampler samplers; +}; + +uniform struct_prim s_prims; + +uniform struct_sampler s_samplers; + +uniform struct_array_prim s_a_prims; + +uniform struct_nested nested; + +uniform struct_array_struct_prim s_a_struct_prim; + +uniform struct_array_struct_samplers s_a_struct_samplers; + +uniform struct_prim a_s_prims[2]; + +uniform struct_sampler a_s_samplers[2]; + +uniform struct_array_struct_prim a_s_a_struct_prim[2]; + +uniform struct_array_struct_samplers a_s_a_struct_samplers[2]; + +out mediump vec4 fragColor; + +void main(){ + fragColor = vec4(0.2, 0.3, 0.4, 1.0); +} \ No newline at end of file diff --git a/resources/shaders/uniform-struct.vert b/resources/shaders/uniform-struct.vert new file mode 100644 index 00000000..e7a25fbc --- /dev/null +++ b/resources/shaders/uniform-struct.vert @@ -0,0 +1,11 @@ +#version 310 es + +precision mediump float; + +in vec3 a_Position; + +uniform mat4 u_MVPMatrix; + +void main() { + gl_Position = u_MVPMatrix * vec4(a_Position, 1.0); +} \ No newline at end of file