OpenXRExtensionWrapper
Наследует: Object
Наследуется от: OpenXRAndroidThreadSettingsExtension, OpenXRExtensionWrapperExtension, OpenXRFrameSynthesisExtension, OpenXRFutureExtension, OpenXRRenderModelExtension, OpenXRSpatialAnchorCapability, OpenXRSpatialEntityExtension, OpenXRSpatialMarkerTrackingCapability, OpenXRSpatialPlaneTrackingCapability
Позволяет реализовывать расширения OpenXR с помощью GDExtension.
Описание
OpenXRExtensionWrapper позволяет реализовывать расширения OpenXR с помощью GDExtension. Расширение должно быть зарегистрировано с помощью register_extension_wrapper().
Когда OpenXRInterface инициализируется как основной интерфейс, и для любого Viewport параметр Viewport.use_xr установлен в true, OpenXR будет участвовать в процессе рендеринга Godot. Если ProjectSettings.rendering/driver/threads/thread_model установлен в "Separate", рендерер Godot будет работать в собственном потоке, и необходимо проявлять особую осторожность во всех OpenXRExtensionWrapper, чтобы предотвратить сбои или неожиданное поведение. Некоторые виртуальные методы будут вызываться в потоке рендеринга, и любые данные, к которым они обращаются, не должны записываться напрямую в основной поток. Это необходимо для предотвращения двух потенциальных проблем:
Изменения, предназначенные для следующего кадра, вступают в силу в текущем кадре. При использовании модели «Раздельные потоки» основной поток немедленно начнет работу над следующим кадром, в то время как поток рендеринга может все еще рендерить текущий кадр. Если основной поток напрямую изменяет что-либо, используемое потоком рендеринга, это изменение может быть использовано на один кадр раньше, чем предполагалось.
Чтение и запись одних и тех же данных одновременно из разных потоков может привести к тому, что поток рендеринга будет использовать данные в недопустимом состоянии.
В большинстве случаев решение состоит в использовании RenderingServer.call_on_render_thread() для планирования вызовов Callable для записи любых данных, используемых в потоке рендеринга. При использовании модели «Раздельные потоки» эти вызовы Callable будут выполняться после завершения рендеринга текущего кадра и до начала рендеринга следующего кадра. При использовании другого режима они будут выполняться немедленно, поэтому рекомендуется всегда использовать RenderingServer.call_on_render_thread() в таких случаях, что позволит вашему коду выполнять правильные действия независимо от модели потоков.
Ниже будут указаны все виртуальные методы, выполняющиеся в потоке рендеринга.
Методы
Описания метода
int _get_composition_layer(index: int) virtual 🔗
Возвращает указатель на структуру XrCompositionLayerBaseHeader, которая предоставляет заданный слой композиции.
Этот метод будет вызван только в том случае, если расширение ранее зарегистрировалось с помощью OpenXRAPIExtension.register_composition_layer_provider().
Примечание: Этот виртуальный метод будет вызван в потоке рендеринга. Кроме того, возвращаемые им данные будут использованы вскоре после вызова этого метода, поэтому они должны оставаться действительными до следующего запуска _on_pre_render().
int _get_composition_layer_count() virtual 🔗
Возвращает количество слоев композиции, предоставляемых этим расширением через _get_composition_layer().
Этот метод будет вызван только в том случае, если расширение ранее зарегистрировалось с помощью OpenXRAPIExtension.register_composition_layer_provider().
Примечание: Этот виртуальный метод будет вызываться в потоке рендеринга. Кроме того, возвращаемые им данные будут использоваться вскоре после вызова этого метода, поэтому они должны оставаться действительными до следующего запуска _on_pre_render().
int _get_composition_layer_order(index: int) virtual 🔗
Возвращает целое число, которое будет использоваться для сортировки заданного слоя композиции, предоставленного с помощью _get_composition_layer(). Меньшие числа переместят слой в начало списка, а большие — в конец. Слой проекции по умолчанию имеет порядок 0, поэтому слои, предоставляемые этим методом, вероятно, должны быть выше или ниже (но не точно) 0.
Этот метод будет вызываться только в том случае, если расширение ранее зарегистрировалось с помощью OpenXRAPIExtension.register_composition_layer_provider().
Примечание: Этот виртуальный метод будет вызываться в потоке рендеринга. Кроме того, возвращаемые им данные будут использоваться вскоре после вызова этого метода, поэтому они должны оставаться действительными до следующего запуска _on_pre_render().
Dictionary _get_requested_extensions(xr_version: int) virtual 🔗
Возвращает Dictionary расширений OpenXR, связанных с этим расширением. xr_version указывает версию OpenXR, которую мы создаём. Это значение будет равно нулю, если редактор запросит этот список для обозначения поддерживаемых функций. Dictionary должен содержать имя расширения, сопоставленное с bool *, преобразованным в целое число:
Если
bool *являетсяnullptr, это расширение является обязательным.Если
bool *указывает на логическое значение, логическое значение будет обновлено доtrue, если расширение включено.
PackedStringArray _get_suggested_tracker_names() virtual 🔗
Возвращает PackedStringArray имен позиционных трекеров, которые используются внутри оболочки расширения.
Array[Dictionary] _get_viewport_composition_layer_extension_properties() virtual 🔗
Получает массив объектов типа Dictionary, представляющих свойства, подобно методу Object._get_property_list(), которые будут добавлены к узлам OpenXRCompositionLayer.
Примечание: Этот виртуальный метод будет вызываться в потоке рендеринга.
Dictionary _get_viewport_composition_layer_extension_property_defaults() virtual 🔗
Получает Dictionary, содержащий значения по умолчанию для свойств, возвращаемых _get_viewport_composition_layer_extension_properties().
void _on_before_instance_created() virtual 🔗
Вызывается до создания экземпляра OpenXR.
Примечание: Этот виртуальный метод будет вызван в основном потоке, однако он будет вызван до участия OpenXR в рендеринге, поэтому безопасно записывать данные, которые будут использоваться потоком рендеринга.
bool _on_event_polled(event: const void*) virtual 🔗
Вызывается, когда есть событие OpenXR для обработки. При реализации верните true, если событие было обработано, в противном случае верните false.
void _on_instance_created(instance: int) virtual 🔗
Вызывается сразу после создания экземпляра OpenXR.
Примечание: Этот виртуальный метод будет вызываться в основном потоке, однако он будет вызван до участия OpenXR в рендеринге, поэтому безопасно записывать данные, которые будут использоваться потоком рендеринга.
void _on_instance_destroyed() virtual 🔗
Вызывается непосредственно перед уничтожением экземпляра OpenXR.
Примечание: Этот виртуальный метод будет вызван в основном потоке, однако он будет вызван после завершения участия OpenXR в рендеринге, поэтому безопасно записывать данные, которые использовались потоком рендеринга.
void _on_main_swapchains_created() virtual 🔗
Вызывается сразу после (повторного) создания основных цепочек обмена.
Примечание: Этот виртуальный метод будет вызываться в потоке рендеринга.
void _on_post_draw_viewport(viewport: RID) virtual 🔗
Вызывается сразу после отрисовки указанного видового окна.
Примечание: Команды отрисовки могут быть только поставлены в очередь на этом этапе, но не выполнены.
Примечание: Этот виртуальный метод будет вызван в потоке отрисовки.
void _on_pre_draw_viewport(viewport: RID) virtual 🔗
Вызывается непосредственно перед отрисовкой указанного области просмотра.
Примечание: Этот виртуальный метод будет вызван в потоке отрисовки.
void _on_pre_render() virtual 🔗
Вызывается непосредственно перед началом рендеринга XR-окнов.
Примечание: Этот виртуальный метод будет вызываться в потоке рендеринга.
void _on_process() virtual 🔗
Вызывается как часть обработки процесса OpenXR. Это происходит прямо перед общими и физическими этапами обработки основного цикла. Во время этого этапа данные контроллера запрашиваются и становятся доступными для игровой логики.
void _on_register_metadata() virtual 🔗
Позволяет расширениям регистрировать дополнительные метаданные контроллера. Эта функция вызывается даже тогда, когда API OpenXR не создан, так как метаданные должны быть доступны редактору.
Расширения также должны предоставлять метаданные независимо от того, поддерживаются ли они в хост-системе. Данные контроллера используются для настройки карт действий для пользователей, которые могут иметь доступ к соответствующему оборудованию.
void _on_session_created(session: int) virtual 🔗
Вызывается сразу после создания сессии OpenXR.
Примечание: Этот виртуальный метод будет вызван в основном потоке, однако он будет вызван до участия OpenXR в рендеринге, поэтому безопасно записывать данные, которые будут использоваться потоком рендеринга.
void _on_session_destroyed() virtual 🔗
Вызывается непосредственно перед уничтожением сессии OpenXR.
Примечание: Этот виртуальный метод будет вызван в основном потоке, однако он будет вызван после завершения участия OpenXR в рендеринге, поэтому безопасно записывать данные, которые использовались потоком рендеринга.
void _on_state_exiting() virtual 🔗
Вызывается, когда состояние сеанса OpenXR изменяется на выход.
void _on_state_focused() virtual 🔗
Вызывается, когда состояние сеанса OpenXR меняется на сфокусированное. Это состояние является активным, когда игра запущена.
void _on_state_idle() virtual 🔗
Вызывается, когда состояние сеанса OpenXR изменяется на состояние ожидания.
void _on_state_loss_pending() virtual 🔗
Вызывается, когда состояние сеанса OpenXR изменяется на «ожидание потери».
void _on_state_ready() virtual 🔗
Вызывается, когда состояние сеанса OpenXR меняется на ready. Это означает, что OpenXR готов настроить сеанс.
void _on_state_stopping() virtual 🔗
Вызывается, когда состояние сеанса OpenXR изменяется на остановку.
void _on_state_synchronized() virtual 🔗
Вызывается, когда состояние сеанса OpenXR меняется на синхронизированное. OpenXR также возвращается в это состояние, когда приложение теряет фокус.
void _on_state_visible() virtual 🔗
Вызывается, когда состояние сеанса OpenXR меняется на видимое. Это означает, что OpenXR теперь готов принимать кадры.
void _on_sync_actions() virtual 🔗
Вызывается, когда OpenXR выполнил свое действие синхронизации.
void _on_viewport_composition_layer_destroyed(layer: const void*) virtual 🔗
Вызывается, когда слой композиции, созданный через OpenXRCompositionLayer, уничтожается.
layer — это указатель на структуру XrCompositionLayerBaseHeader.
void _prepare_view_configuration(view_count: int) virtual 🔗
Вызывается перед методом _set_view_configuration_and_get_next_pointer(), чтобы позволить расширению зарезервировать данные для заданного количества представлений.
void _print_view_configuration_info(view: int) virtual const 🔗
Эта функция вызывается для того, чтобы расширение могло выводить дополнительную информацию о своей конфигурации представления, если таковая имеется. Она будет вызываться только в том случае, если включен подробный вывод.
int _set_android_surface_swapchain_create_info_and_get_next_pointer(property_values: Dictionary, next_pointer: void*) virtual 🔗
Добавьте дополнительные структуры данных в цепочки обмена поверхностями Android, созданные с помощью OpenXRCompositionLayer.
property_values содержит значения свойств, возвращаемых _get_viewport_composition_layer_extension_properties().
Примечание: Этот виртуальный метод будет вызываться в потоке рендеринга.
int _set_frame_end_info_and_get_next_pointer(next_pointer: void*) virtual 🔗
Добавьте дополнительные структуры данных в XrFrameEndInfo.
Этот метод будет вызываться только в том случае, если расширение ранее зарегистрировалось с помощью OpenXRAPIExtension.register_frame_info_extension().
Примечание: Этот виртуальный метод будет вызываться в потоке рендеринга. Кроме того, возвращаемые им данные будут использоваться вскоре после вызова этого метода, поэтому они должны оставаться действительными до следующего запуска _on_pre_render().
int _set_frame_wait_info_and_get_next_pointer(next_pointer: void*) virtual 🔗
Добавьте дополнительные структуры данных в XrFrameWaitInfo.
Этот метод будет вызываться только в том случае, если расширение ранее зарегистрировалось с помощью OpenXRAPIExtension.register_frame_info_extension().
Примечание: Этот виртуальный метод будет вызываться в потоке рендеринга.
int _set_hand_joint_locations_and_get_next_pointer(hand_index: int, next_pointer: void*) virtual 🔗
При создании каждого трекера рук необходимо добавлять дополнительные структуры данных.
int _set_instance_create_info_and_get_next_pointer(xr_version: int, next_pointer: void*) virtual 🔗
Добавьте дополнительные структуры данных при создании экземпляра OpenXR. xr_version указывает версию OpenXR, которую мы создаём.
int _set_projection_views_and_get_next_pointer(view_index: int, next_pointer: void*) virtual 🔗
Добавьте дополнительные структуры данных в проекционное представление заданного view_index.
Примечание: Этот виртуальный метод будет вызываться в потоке рендеринга. Кроме того, возвращаемые им данные будут использоваться вскоре после вызова этого метода, поэтому они должны оставаться действительными до следующего запуска _on_pre_render().
int _set_reference_space_create_info_and_get_next_pointer(reference_space_type: int, next_pointer: void*) virtual 🔗
Добавьте дополнительные структуры данных в XrReferenceSpaceCreateInfo.
int _set_session_create_and_get_next_pointer(next_pointer: void*) virtual 🔗
Добавьте дополнительные структуры данных при создании сессии OpenXR.
int _set_swapchain_create_info_and_get_next_pointer(next_pointer: void*) virtual 🔗
При создании цепочек обмена OpenXR добавьте дополнительные структуры данных.
int _set_system_properties_and_get_next_pointer(next_pointer: void*) virtual 🔗
При запросе информации о возможностях системы OpenXR следует добавлять дополнительные структуры данных.
int _set_view_configuration_and_get_next_pointer(view: int, next_pointer: void*) virtual 🔗
Добавьте дополнительные структуры данных при запросе конфигурации представления OpenXR.
int _set_view_locate_info_and_get_next_pointer(next_pointer: void*) virtual 🔗
Добавьте дополнительные структуры данных в XrViewLocateInfo.
Этот метод будет вызываться только в том случае, если расширение ранее зарегистрировалось с помощью OpenXRAPIExtension.register_frame_info_extension().
Примечание: Этот виртуальный метод будет вызываться в потоке рендеринга. Кроме того, возвращаемые им данные будут использоваться вскоре после вызова этого метода, поэтому они должны оставаться действительными до следующего запуска _on_pre_render().
int _set_viewport_composition_layer_and_get_next_pointer(layer: const void*, property_values: Dictionary, next_pointer: void*) virtual 🔗
Добавьте дополнительные структуры данных к слоям композиции, созданным с помощью OpenXRCompositionLayer.
property_values содержит значения свойств, возвращаемых _get_viewport_composition_layer_extension_properties().
layer — указатель на структуру XrCompositionLayerBaseHeader.
Примечание: Этот виртуальный метод будет вызываться в потоке рендеринга. Кроме того, возвращаемые им данные будут использоваться вскоре после вызова этого метода, поэтому они должны оставаться действительными до следующего запуска _on_pre_render().
OpenXRAPIExtension get_openxr_api() 🔗
Возвращает созданный OpenXRAPIExtension, который можно использовать для доступа к API OpenXR.
void register_extension_wrapper() 🔗
Регистрирует расширение. Это должно происходить на уровне инициализации основного модуля.
Примечание: Эту функцию нельзя вызвать после инициализации OpenXR.