XR_EXT_spatial_persistence

Name String

XR_EXT_spatial_persistence

نوع الإضافة

إضافة مثيل

رقم الإضافة المسجَّل

764

المراجعة

1

حالة التصديق

تمت المصادقة عليه

الاعتماد على الإضافات والإصدارات

XR_EXT_spatial_entity
و
XR_EXT_future

المساهمون

"نيهف جين"، Google
"جاريد فايندر"، Google
"ناتالي فلوري"، Meta
"يويتشي تاغوتشي"، Meta
"رون بيسمز"، Meta
"يين لي"، Microsoft
"جيمي ألامبارامبيل"، ByteDance
"تشيبينغ ليو"، ByteDance
"جون يان"، ByteDance

نظرة عامة

تتيح هذه الإضافة للتطبيقات استكشاف الكيانات المكانية وربطها في جلسات التطبيقات وجلسات OpenXR وسياقات OpenXR المكانية المتعدّدة ضمن جلسة واحدة. تحدّد الإضافة XR_EXT_spatial_entity أنّ الكيان ضمن XrSpatialContextEXT يتم تمثيله من خلال XrSpatialEntityIdEXT . توسّع هذه الإضافة هذا المفهوم من خلال تحديد أنّ الكيان، إذا تم الاحتفاظ به، يتم تمثيله من خلال XrUuid في جميع جلسات التطبيق وOpenXR، أي أنّ التطبيق يمكنه استخدام XrUuid الذي توفّره هذه الإضافة لتحديد كيان في جميع الجلسات. توفّر هذه الإضافة أيضًا تداخلات مفيدة مع الإضافة XR_EXT_spatial_entity لاكتشاف الكيانات الثابتة في بيئة المستخدم والقدرة على الاستعلام عن بيانات المكوّنات الخاصة بها.

سياق الاستمرارية المكانية

إنشاء سياق ثبات مكاني

XR_DEFINE_HANDLE(XrSpatialPersistenceContextEXT)

يمثّل المقبض XrSpatialPersistenceContextEXT الاتصال بوحدة تخزين الكيانات المكانية الدائمة.

يتم تعريف الدالة xrCreateSpatialPersistenceContextAsyncEXT على النحو التالي:

XrResult xrCreateSpatialPersistenceContextAsyncEXT(
    XrSession                                   session,
    const XrSpatialPersistenceContextCreateInfoEXT* createInfo,
    XrFutureEXT*                                future);

أوصاف المَعلمات

  • ‫session هو XrSession سيكون فيه سياق الثبات المكاني نشطًا.
  • ‫createInfo هي السمة XrSpatialPersistenceContextCreateInfoEXT المستخدَمة لتحديد مَعلمات سياق الثبات المكاني.
  • ‫future هو مؤشر إلى XrFutureEXT .

يمكن للتطبيق إنشاء معرِّف XrSpatialPersistenceContextEXT باستخدام دالة xrCreateSpatialPersistenceContextAsyncEXT وضبط نطاق سياق الثبات في createInfo .

يجب أن يعرض وقت التشغيل XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT إذا لم يتم تعداد scope من خلال xrEnumerateSpatialPersistenceScopesEXT في XrSpatialPersistenceContextCreateInfoEXT .

إذا فرض وقت التشغيل نظام أذونات للتحكّم في وصول التطبيق إلى مساحة التخزين الثابتة التي يمثّلها XrSpatialPersistenceContextEXT، يجب أن يعرض وقت التشغيل XR_ERROR_PERMISSION_INSUFFICIENT إذا لم يتم منح هذه الأذونات لهذا التطبيق.

الاستخدام الصالح (ضمني)

رموز الإرجاع

Success

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

تعذّر الإجراء

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT
  • XR_ERROR_VALIDATION_FAILURE

يتم تعريف بنية XrSpatialPersistenceContextCreateInfoEXT على النحو التالي:

typedef struct XrSpatialPersistenceContextCreateInfoEXT {
    XrStructureType                 type;
    const void*                     next;
    XrSpatialPersistenceScopeEXT    scope;
} XrSpatialPersistenceContextCreateInfoEXT;

أوصاف الأعضاء

  • ‫type هو XrStructureType لهذه البنية.
  • ‫next هو NULL أو مؤشر إلى البنية التالية في سلسلة البنى. لا يتم تحديد مثل هذه البُنى في OpenXR الأساسية أو هذه الإضافة.
  • ‫scope هو XrSpatialPersistenceScopeEXT يحدّد نطاق تخزين سياق الثبات.

تصف بنية XrSpatialPersistenceContextCreateInfoEXT المعلومات اللازمة لإنشاء مؤشر XrSpatialPersistenceContextEXT.

الاستخدام الصالح (ضمني)

typedef enum XrSpatialPersistenceScopeEXT {
    XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT = 1,
    XR_SPATIAL_PERSISTENCE_SCOPE_LOCAL_ANCHORS_EXT = 1000781000,
    XR_SPATIAL_PERSISTENCE_SCOPE_ANCHORS_FOR_CLOUD_SHARING_ANDROIDX1 = 1000808000,
    XR_SPATIAL_PERSISTENCE_SCOPE_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPersistenceScopeEXT;

يحدّد تعداد XrSpatialPersistenceScopeEXT الأنواع المختلفة من نطاقات سياق الثبات.

تحمل التعدادات المعاني التالية:

وصف التعداد

XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT

يمنح هذا الإذن التطبيق إمكانية الوصول للقراءة فقط (أي لا يمكن للتطبيق تعديل المتجر المرتبط بهذا النطاق) إلى الكيانات المكانية التي يحتفظ بها النظام ويديرها. يمكن للتطبيق استخدام معرّف UUID في مكوّن الثبات لهذا النطاق لربط الكيانات عبر السياقات المكانية وعمليات إعادة تشغيل الجهاز.

XR_SPATIAL_PERSISTENCE_SCOPE_LOCAL_ANCHORS_EXT

تقتصر عمليات الاحتفاظ بالبيانات والوصول إليها على نقاط الارتكاز المكانية، على الجهاز نفسه، للمستخدم نفسه والتطبيق نفسه (تمت إضافتها من خلال إضافة XR_EXT_spatial_persistence_operations)

XR_SPATIAL_PERSISTENCE_SCOPE_ANCHORS_FOR_CLOUD_SHARING_ANDROIDX1

تقتصر عمليات الاستمرارية والوصول إلى البيانات على نقاط الارتكاز المكانية التي يملكها ويديرها المشروع نفسه على السحابة الإلكترونية. (تمت الإضافة من خلال إضافة XR_ANDROIDX1_spatial_anchor_cloud_sharing)

يتم تعريف الدالة xrEnumerateSpatialPersistenceScopesEXT على النحو التالي:

XrResult xrEnumerateSpatialPersistenceScopesEXT(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    uint32_t                                    persistenceScopeCapacityInput,
    uint32_t*                                   persistenceScopeCountOutput,
    XrSpatialPersistenceScopeEXT*               persistenceScopes);

أوصاف المَعلمات

  • ‫instance هو اسم حساب لـ XrInstance .
  • ‫systemId هو XrSystemId الذي سيتم تعداد نطاقات ثباته المكانية.
  • ‫persistenceScopeCapacityInput هي سعة مصفوفة persistenceScopes، أو 0 للإشارة إلى طلب استرداد السعة المطلوبة.
  • ‫persistenceScopeCountOutput هو عدد نطاقات الثبات أو السعة المطلوبة في حال عدم كفاية persistenceScopeCapacityInput.
  • ‫persistenceScopes هو مصفوفة من XrSpatialPersistenceScopeEXT . يمكن أن تكون القيمة NULL إذا كانت قيمة persistenceScopeCapacityInput هي 0.
  • يُرجى الاطّلاع على فصل مَعلمات حجم ذاكرة التخزين المؤقت للحصول على وصف تفصيلي لاسترداد حجم persistenceScopes المطلوب.

يمكن للتطبيق تعداد قائمة نطاقات الثبات المكاني التي يتيحها XrSystemId معيّن باستخدام xrEnumerateSpatialPersistenceScopesEXT .

الاستخدام الصالح (ضمني)

  • يجب تفعيل إضافة XR_EXT_spatial_persistence قبل طلب xrEnumerateSpatialPersistenceScopesEXT
  • يجب أن يكون instance مقبض XrInstance صالحًا
  • يجب أن يكون persistenceScopeCountOutput مؤشرًا إلى قيمة uint32_t
  • إذا لم تكن قيمة persistenceScopeCapacityInput هي 0، يجب أن تكون قيمة persistenceScopes مؤشرًا إلى مصفوفة من قيم persistenceScopeCapacityInput XrSpatialPersistenceScopeEXT

رموز الإرجاع

Success

  • XR_SUCCESS

تعذّر الإجراء

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_ERROR_SYSTEM_INVALID
  • XR_ERROR_VALIDATION_FAILURE

يتم تحديد الدالة xrCreateSpatialPersistenceContextCompleteEXT على النحو التالي:

XrResult xrCreateSpatialPersistenceContextCompleteEXT(
    XrSession                                   session,
    XrFutureEXT                                 future,
    XrCreateSpatialPersistenceContextCompletionEXT* completion);

أوصاف المَعلمات

تُكمل الدالة xrCreateSpatialPersistenceContextCompleteEXT العملية غير المتزامنة التي بدأتها الدالة xrCreateSpatialPersistenceContextAsyncEXT . يجب أن يعرض وقت التشغيل XR_ERROR_FUTURE_PENDING_EXT إذا لم يكن future في حالة الاستعداد. يجب أن يعرض وقت التشغيل القيمة XR_ERROR_FUTURE_INVALID_EXT إذا سبق أن تم إكمال future أو إلغاؤه.

الاستخدام الصالح (ضمني)

رموز الإرجاع

Success

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

تعذّر الإجراء

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_FUTURE_INVALID_EXT
  • XR_ERROR_FUTURE_PENDING_EXT
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_VALIDATION_FAILURE

يتم تحديد بنية XrCreateSpatialPersistenceContextCompletionEXT على النحو التالي:

typedef struct XrCreateSpatialPersistenceContextCompletionEXT {
    XrStructureType                         type;
    void*                                   next;
    XrResult                                futureResult;
    XrSpatialPersistenceContextResultEXT    createResult;
    XrSpatialPersistenceContextEXT          persistenceContext;
} XrCreateSpatialPersistenceContextCompletionEXT;

أوصاف الأعضاء

رموز الإرجاع المستقبلية

قيم futureResult:

Success

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

تعذّر الإجراء

  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_PERMISSION_INSUFFICIENT

إذا كان كل من futureResult وcreateResult رمزي نجاح، يجب أن يكون persistenceContext صالحًا. إذا كان persistenceContext صالحًا، يجب أن يظل كذلك خلال مراحل نشاط xrCreateSpatialPersistenceContextAsyncEXT :: session أو إلى أن يستخدم التطبيق xrDestroySpatialPersistenceContextEXT مع persistenceContext ، أيهما أقرب.

يجب أن يضبط وقت التشغيل createResult فقط إذا كان futureResult رمز نجاح.

الاستخدام الصالح (ضمني)

typedef enum XrSpatialPersistenceContextResultEXT {
    XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_SUCCESS_EXT = 0,
    XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_ENTITY_NOT_TRACKING_EXT = -1000781001,
    XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_PERSIST_UUID_NOT_FOUND_EXT = -1000781002,
    XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_LOCALIZATION_FAILURE_ANDROIDX1 = -1000808000,
    XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_MAP_FEATURE_INSUFFICIENT_ANDROIDX1 = -1000808001,
    XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_FAILURE_ANDROIDX1 = -1000808002,
    XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_TIMEOUT_ANDROIDX1 = -1000808003,
    XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPersistenceContextResultEXT;

يحدّد التعداد XrSpatialPersistenceContextResultEXT الأنواع المختلفة لرموز النتائج لعملية الاحتفاظ بالبيانات. لا يمكن للتطبيق دائمًا التحكّم في حالات الفشل أثناء عمليات الاحتفاظ بالبيانات، ويتم استخدام هذا التعداد لنقل هذه الحالات. على غرار XrResult، تكون رموز النجاح في تعداد XrSpatialPersistenceContextResultEXT قيمًا غير سالبة، ورموز الفشل قيمًا سالبة.

تحمل التعدادات المعاني التالية:

وصف التعداد

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_SUCCESS_EXT

نجحت عملية سياق الثبات.

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_ENTITY_NOT_TRACKING_EXT

تعذّر تنفيذ عملية الاستمرارية لأنّه تعذّر تتبُّع الكيان من خلال بيئة التشغيل. (تمت الإضافة من خلال إضافة XR_EXT_spatial_persistence_operations)

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_PERSIST_UUID_NOT_FOUND_EXT

لم يتم العثور على معرّف UUID الثابت المقدَّم في مساحة التخزين. (تمت الإضافة من خلال إضافة XR_EXT_spatial_persistence_operations)

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_LOCALIZATION_FAILURE_ANDROIDX1

تعذّر تنفيذ عملية الثبات بسبب تعذُّر عملية الترجمة. (تمت الإضافة من خلال إضافة XR_ANDROIDX1_spatial_anchor_cloud_sharing)

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_MAP_FEATURE_INSUFFICIENT_ANDROIDX1

تعذّر تنفيذ عملية الثبات لأنّ ميزة خريطة الأقلمة غير كافية. (تمت الإضافة من خلال إضافة XR_ANDROIDX1_spatial_anchor_cloud_sharing)

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_FAILURE_ANDROIDX1

تعذّر تنفيذ عملية الاحتفاظ بالبيانات بسبب تعذُّر الاتصال بالشبكة. (تمت الإضافة من خلال إضافة XR_ANDROIDX1_spatial_anchor_cloud_sharing)

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_TIMEOUT_ANDROIDX1

تعذّر تنفيذ عملية الاحتفاظ بالبيانات بسبب انتهاء مهلة الشبكة. (تمت الإضافة من خلال إضافة XR_ANDROIDX1_spatial_anchor_cloud_sharing)

إلغاء سياق الثبات المكاني

يتم تعريف الدالة xrDestroySpatialPersistenceContextEXT على النحو التالي:

XrResult xrDestroySpatialPersistenceContextEXT(
    XrSpatialPersistenceContextEXT              persistenceContext);

أوصاف المَعلمات

يمكن للتطبيق استخدام xrDestroySpatialPersistenceContextEXT لإلغاء معالجة persistenceContext عند الانتهاء من مهام الثبات المكاني.

يجب ألا يتلف وقت التشغيل الموارد الأساسية لـ persistenceContext عند استدعاء xrDestroySpatialPersistenceContextEXT إذا كانت هناك أي مؤشرات XrSpatialContextEXT صالحة تم ربط persistenceContext بها من خلال XrSpatialContextPersistenceConfigEXT . وذلك لأنّ موارد سياق الثبات لا تزال مستخدَمة من قِبل السياق المكاني لاكتشاف الكيانات الثابتة. يؤدي تدمير مؤشر سياق الثبات في مثل هذه الحالة إلى إزالة وصول التطبيق إلى هذه الموارد فقط.

يجب إخلاء موارد XrSpatialPersistenceContextEXT الذي تم تدميره عند تدمير جميع مؤشرات XrSpatialContextEXT التي كان سياق الثبات مرتبطًا بها.

الاستخدام الصالح (ضمني)

أمان Thread

  • يجب مزامنة الوصول إلى persistenceContext وأي معرّفات فرعية خارجيًا

رموز الإرجاع

Success

  • XR_SUCCESS

تعذّر الإجراء

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_RUNTIME_FAILURE

استكشاف الكيانات المحفوظة

مكوّن الاستمرارية

تحتوي الكيانات المكانية المحفوظة على مكوّن الحفظ الذي يجب أن يتضمّنه وقت التشغيل في لقطات الاستكشاف والتعديل إذا تم تفعيل XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT أثناء إنشاء XrSpatialContextEXT وتم تضمينه في XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes أو XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes .

بيانات المكوّن

يتم تعريف بنية XrSpatialPersistenceDataEXT على النحو التالي:

typedef struct XrSpatialPersistenceDataEXT {
    XrUuid                          persistUuid;
    XrSpatialPersistenceStateEXT    persistState;
} XrSpatialPersistenceDataEXT;

أوصاف الأعضاء

الاستخدام الصالح (ضمني)

typedef enum XrSpatialPersistenceStateEXT {
    XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT = 1,
    XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT = 2,
    XR_SPATIAL_PERSISTENCE_STATE_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPersistenceStateEXT;

يحدّد تعداد XrSpatialPersistenceStateEXT الحالات المختلفة لمعرّف uuid الثابت.

تحمل التعدادات المعاني التالية:

وصف التعداد

XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT

تم تحميل المعرّف الفريد العالمي (UUID) الثابت بنجاح من مساحة التخزين.

XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT

لم يتم العثور على معرّف UUID الثابت في مساحة التخزين، وقد تمت إزالته منها أو لم يكن موجودًا فيها من قبل.

بنية قائمة المكوّنات لطلب البيانات

يتم تحديد بنية XrSpatialComponentPersistenceListEXT على النحو التالي:

typedef struct XrSpatialComponentPersistenceListEXT {
    XrStructureType                 type;
    void*                           next;
    uint32_t                        persistDataCount;
    XrSpatialPersistenceDataEXT*    persistData;
} XrSpatialComponentPersistenceListEXT;

أوصاف الأعضاء

  • ‫type هو XrStructureType لهذه البنية.
  • ‫next هو NULL أو مؤشر إلى البنية التالية في سلسلة البنى. لا يتم تحديد مثل هذه البُنى في OpenXR الأساسية أو هذه الإضافة.
  • ‫persistDataCount هو uint32_t يصف عدد العناصر في مصفوفة persistData.
  • ‫persistData هو مصفوفة من XrSpatialPersistenceDataEXT .

يجب أن يعرض وقت التشغيل XR_ERROR_VALIDATION_FAILURE من xrQuerySpatialComponentDataEXT إذا كان XrSpatialComponentPersistenceListEXT في السلسلة التالية من XrSpatialComponentDataQueryResultEXT :: next ولكن لم يتم تضمين XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT في XrSpatialComponentDataQueryConditionEXT :: componentTypes .

يجب أن يعرض وقت التشغيل XR_ERROR_SIZE_INSUFFICIENT من xrQuerySpatialComponentDataEXT إذا كان persistDataCount أقل من XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .

على عكس المكوّنات الأخرى، يجب أن يضبط وقت التشغيل بيانات XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT بغض النظر عن XrSpatialEntityTrackingStateEXT .

الاستخدام الصالح (ضمني)

الإعداد

إذا تم تعداد XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT في XrSpatialCapabilityComponentTypesEXT :: componentTypes لبعض الإمكانات، يمكن للتطبيق تفعيلها من خلال تضمين التعداد في قائمة XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents. لا يتطلّب هذا المكوّن أي إعدادات خاصة ليتم تضمينه في السلسلة التالية من XrSpatialCapabilityConfigurationBaseHeaderEXT . إذا كان التطبيق يتضمّن XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT في قائمة المكوّنات المفعَّلة، يجب أن يتضمّن أيضًا XrSpatialContextPersistenceConfigEXT في السلسلة التالية من XrSpatialContextCreateInfoEXT وإلا يجب أن يعرض وقت التشغيل XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT من xrCreateSpatialContextAsyncEXT .

ضبط السياق المكاني باستخدام سياقات الاستمرارية

يتم تعريف بنية XrSpatialContextPersistenceConfigEXT على النحو التالي:

typedef struct XrSpatialContextPersistenceConfigEXT {
    XrStructureType                          type;
    const void*                              next;
    uint32_t                                 persistenceContextCount;
    const XrSpatialPersistenceContextEXT*    persistenceContexts;
} XrSpatialContextPersistenceConfigEXT;

أوصاف الأعضاء

  • ‫type هو XrStructureType لهذه البنية.
  • ‫next هو NULL أو مؤشر إلى البنية التالية في سلسلة البنى. لا يتم تحديد مثل هذه البُنى في OpenXR الأساسية أو هذه الإضافة.
  • ‫persistenceContextCount هو uint32_t يصف عدد العناصر في مصفوفة persistenceContexts.
  • ‫persistenceContexts هو مصفوفة من XrSpatialPersistenceContextEXT .

يمكن للتطبيق إضافة XrSpatialContextPersistenceConfigEXT إلى السلسلة التالية من XrSpatialContextCreateInfoEXT . سيؤدي ذلك إلى ضبط XrSpatialContextEXT الذي تم إنشاؤه باستخدام persistenceContexts والسماح للتطبيق باكتشاف الكيانات المكانية المحفوظة في مساحة التخزين التي تمثّلها عناصر التحكّم XrSpatialPersistenceContextEXT في persistenceContexts .

الاستخدام الصالح (ضمني)

إنشاء نبذة عن الاكتشاف

اكتشاف الكيانات التي تتضمّن معرّفات UUID معيّنة

يتم تعريف بنية XrSpatialDiscoveryPersistenceUuidFilterEXT على النحو التالي:

typedef struct XrSpatialDiscoveryPersistenceUuidFilterEXT {
    XrStructureType    type;
    const void*        next;
    uint32_t           persistedUuidCount;
    const XrUuid*      persistedUuids;
} XrSpatialDiscoveryPersistenceUuidFilterEXT;

أوصاف الأعضاء

  • ‫type هو XrStructureType لهذه البنية.
  • ‫next هو NULL أو مؤشر إلى البنية التالية في سلسلة البنى. لا يتم تحديد مثل هذه البُنى في OpenXR الأساسية أو هذه الإضافة.
  • ‫persistedUuidCount هي قيمة من النوع uint32_t تصف عدد العناصر في مصفوفة persistedUuids
  • ‫persistedUuids هي مصفوفة من XrUuid .

يمكن للتطبيق استخدام XrSpatialDiscoveryPersistenceUuidFilterEXT في السلسلة التالية من XrSpatialDiscoverySnapshotCreateInfoEXT لتحديد نطاق عملية الاكتشاف على الكيانات التي تكون معرّفات UUID المحفوظة لها ضمن مجموعة معرّفات UUID المقدَّمة في persistedUuids .

إذا أضاف التطبيق XrSpatialDiscoveryPersistenceUuidFilterEXT في السلسلة التالية من XrSpatialDiscoverySnapshotCreateInfoEXT ولكن لم يتم ضبط xrCreateSpatialDiscoverySnapshotAsyncEXT :: spatialContext باستخدام أي XrSpatialPersistenceContextEXT باستخدام XrSpatialContextPersistenceConfigEXT، يجب أن يعرض وقت التشغيل XR_ERROR_VALIDATION_FAILURE من xrCreateSpatialDiscoverySnapshotAsyncEXT .

يجب أن يتعامل وقت التشغيل مع الفلتر XrSpatialDiscoveryPersistenceUuidFilterEXT كشرط "AND" مع أي فلاتر أخرى مقدَّمة في XrSpatialDiscoverySnapshotCreateInfoEXT أو السلسلة التالية. يجب أن يتعامل وقت التشغيل مع مصفوفة persistedUuids نفسها كشرط "OR"، أي فلترة الكيانات التي تتضمّن أيًا من معرّفات UUID المقدَّمة في تلك المصفوفة.

يجب أن يتضمّن وقت التشغيل إدخالاً واحدًا في اللقطة التي تم إنشاؤها لكل معرّف UUID في persistedUuids تمكّن من تحديد حالة XrSpatialPersistenceStateEXT له في هذا الوقت.

  • إذا عثر وقت التشغيل على معرّف UUID في مساحة التخزين الخاصة به، فسيحدث ما يلي:

    • يجب أن يضبط وقت التشغيل XrSpatialPersistenceStateEXT في XrSpatialPersistenceDataEXT لهذا الكيان على XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT .
    • يجب أن يتضمّن وقت التشغيل XrSpatialEntityIdEXT صالحًا لهذا الكيان في اللقطة التي تم إنشاؤها.
    • يجب أن يضبط وقت التشغيل السمة XrSpatialEntityTrackingStateEXT لهذا الكيان على XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT إذا كان يتتبّع الكيان بشكل نشط ولديه بيانات صالحة لمكوّناته. بخلاف ذلك، يجب أن يضبط وقت التشغيل XrSpatialEntityTrackingStateEXT على XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT .
  • إذا حدّد وقت التشغيل أنّ معرّف UUID غير متوفّر في مساحة التخزين (بغض النظر عمّا إذا كان معرّف UUID هذا غير متوفّر في مساحة التخزين أو كان متوفّرًا في السابق ولكن تمت إزالته)، عندئذٍ:

    • يجب أن يضبط وقت التشغيل السمة XrSpatialPersistenceStateEXT في XrSpatialPersistenceDataEXT لهذا الكيان على XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT للإشارة إلى التطبيق بأنّ معرّف UUID هذا لم يعُد متوفّرًا في مساحة التخزين.
    • يجب أن تضبط بيئة التشغيل السمة XrSpatialEntityIdEXT لهذا الكيان في اللقطة التي تم إنشاؤها على XR_NULL_SPATIAL_ENTITY_ID_EXT .
    • يجب أن يضبط وقت التشغيل السمة XrSpatialEntityTrackingStateEXT لهذا الكيان على XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXT للإشارة إلى التطبيق بأنّه لن يتم تتبُّع هذا الكيان أبدًا.
  • إذا لم يتمكّن وقت التشغيل من تحديد ما إذا كان معرّف UUID متوفّرًا في مساحة التخزين أم لا، يجب عدم تضمينه في اللقطة.

يمكن للتطبيق أيضًا استخدام XrSpatialDiscoveryPersistenceUuidFilterEXT في السلسلة التالية من XrSpatialComponentDataQueryConditionEXT لطلب البحث عن كيانات ذات معرّفات UUID معيّنة في اللقطات الحالية. عند استخدامها مع XrSpatialComponentDataQueryConditionEXT، إذا كان XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids يحتوي على أي XrUuid غير موجود في XrSpatialSnapshotEXT، يجب ألا يتضمّن وقت التشغيل إدخالاً لـ XrUuid في نتيجة طلب البحث. بالإضافة إلى ذلك، قد لا يتطابق ترتيب (تسلسل) الكيانات في نتيجة طلب البحث مع ترتيب معرّفات UUID المقدَّمة في XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids . يجب أن يتضمّن التطبيق XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT في XrSpatialComponentDataQueryConditionEXT :: componentTypes وXrSpatialComponentPersistenceListEXT في السلسلة التالية من XrSpatialComponentDataQueryResultEXT، ثم التحقّق من XrSpatialPersistenceDataEXT :: persistUuid لكل فهرس لنتائج طلب البحث من أجل معرفة معرّف UUID الذي يتوافق معه فهرس النتائج الحالي.

الاستخدام الصالح (ضمني)

الاطّلاع على جميع الكيانات المحفوظة

إذا كان التطبيق يستخدم xrCreateSpatialDiscoverySnapshotAsyncEXT بدون XrSpatialDiscoveryPersistenceUuidFilterEXT ومع XrSpatialContextEXT تم ضبطه باستخدام XrSpatialPersistenceContextEXT، يجب أن يتضمّن وقت التشغيل تلك الكيانات في اللقطة التي تم إنشاؤها والتي يتم الاحتفاظ بها في مساحة التخزين التي يمثّلها XrSpatialPersistenceContextEXT وتستوفي الفلاتر المقدَّمة في XrSpatialDiscoverySnapshotCreateInfoEXT . بالنسبة إلى هذه الجهات،

  • يجب أن يضبط وقت التشغيل XrSpatialPersistenceStateEXT في XrSpatialPersistenceDataEXT لهذا الكيان على XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT .
  • يجب أن يتضمّن وقت التشغيل XrSpatialEntityIdEXT صالحًا لهذا الكيان في اللقطة التي تم إنشاؤها.
  • يجب أن يضبط وقت التشغيل السمة XrSpatialEntityTrackingStateEXT لهذا الكيان على XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT إذا كان يتتبّع الكيان بشكل نشط ولديه بيانات صالحة لمكوّناته. بخلاف ذلك، يجب أن يضبط وقت التشغيل XrSpatialEntityTrackingStateEXT على XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT .

أنواع العناصر الجديدة

الأوامر الجديدة

منشآت جديدة

عمليات تعداد جديدة

ثوابت تعداد جديدة

  • XR_EXT_SPATIAL_PERSISTENCE_EXTENSION_NAME
  • XR_EXT_spatial_persistence_SPEC_VERSION
  • توسيع XrObjectType :

    • XR_OBJECT_TYPE_SPATIAL_PERSISTENCE_CONTEXT_EXT
  • توسيع XrResult :

    • XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT
  • توسيع XrSpatialComponentTypeEXT :

    • XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT
  • توسيع XrStructureType :

    • XR_TYPE_CREATE_SPATIAL_PERSISTENCE_CONTEXT_COMPLETION_EXT
    • XR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXT
    • XR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXT
    • XR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXT
    • XR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXT

مثال على الشفرة

إنشاء سياق الثبات

// Check if the required persistence scope supported
uint32_t scopeCount;
CHK_XR(xrEnumerateSpatialPersistenceScopesEXT(instance, systemId, 0, &scopeCount, nullptr));
std::vector<XrSpatialPersistenceScopeEXT> persistenceScopes(scopeCount);
CHK_XR(xrEnumerateSpatialPersistenceScopesEXT(instance, systemId, scopeCount, &scopeCount, persistenceScopes.data()));

if (std::find(persistenceScopes.begin(), persistenceScopes.end(), XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT) == persistenceScopes.end()) {
  return;
}

XrSpatialPersistenceContextEXT persistenceContext{};

XrSpatialPersistenceContextCreateInfoEXT persistenceContextCreateInfo{XR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXT};
persistenceContextCreateInfo.scope = XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT;
XrFutureEXT createContextFuture;
CHK_XR(xrCreateSpatialPersistenceContextAsyncEXT(session, &persistenceContextCreateInfo, &createContextFuture));

waitUntilReady(createContextFuture);

XrCreateSpatialPersistenceContextCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_PERSISTENCE_CONTEXT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialPersistenceContextCompleteEXT(session, createContextFuture, &completion));
if (completion.futureResult != XR_SUCCESS || completion.createResult != XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_SUCCESS_EXT) {
  return;
}

persistenceContext = completion.persistenceContext;

// ...
// Connect persistence context to a spatial context and discover persisted entities.
// ...

CHK_XR(xrDestroySpatialPersistenceContextEXT(persistenceContext));

ربط سياق الاستمرارية بسياق مكاني

// Note: Anchor capability is just used as an example here. Persistence can be
// supported by other capabilities too. xrEnumerateSpatialCapabilityComponentTypesEXT() can
// be used to check if a certain capability supports persistence.
if (!isSpatialCapabilitySupported(instance, systemId, XR_SPATIAL_CAPABILITY_ANCHOR_EXT)) {
  return;
}

const bool supportsPersistenceComponent = isSpatialComponentSupported(instance, systemId, XR_SPATIAL_CAPABILITY_ANCHOR_EXT, XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT);

// Create a spatial spatial context
XrSpatialContextEXT spatialContext{};
{

  std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
    XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT,
  };

  if (supportsPersistenceComponent) {
    enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT);
  }

  XrSpatialCapabilityConfigurationAnchorEXT anchorConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXT};
  anchorConfig.capability = XR_SPATIAL_CAPABILITY_ANCHOR_EXT;
  anchorConfig.enabledComponentCount = enabledComponents.size();
  anchorConfig.enabledComponents = enabledComponents.data();

  std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
    reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&anchorConfig),
  };

  XrSpatialContextCreateInfoEXT spatialContextCreateInfo{XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
  spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
  spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();

  XrSpatialContextPersistenceConfigEXT persistenceConfig{XR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXT};
  persistenceConfig.persistenceContextCount = 1;
  persistenceConfig.persistenceContexts = &persistenceContext;

  if (supportsPersistenceComponent) {
    spatialContextCreateInfo.next = &persistenceConfig;
  }

  XrFutureEXT createContextFuture;
  CHK_XR(xrCreateSpatialContextAsyncEXT(session, &spatialContextCreateInfo, &createContextFuture));

  waitUntilReady(createContextFuture);

  XrCreateSpatialContextCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialContextCompleteEXT(session, createContextFuture, &completion));
  if (completion.futureResult != XR_SUCCESS) {
    return;
  }

  spatialContext = completion.spatialContext;
}

// ...
// Discover persisted anchors.
// ...

CHK_XR(xrDestroySpatialContextEXT(spatialContext));

الاطّلاع على جميع الكيانات المحفوظة

XrFutureEXT future = XR_NULL_FUTURE_EXT;

// We want to look for entities that have the following components.
std::vector<XrSpatialComponentTypeEXT> snapshotComponents = {
  XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT,
};

auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
  XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
  snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
  snapshotCreateInfo.componentTypes = snapshotComponents.data();
  CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));

  waitUntilReady(future);

  XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
  completionInfo.baseSpace = localSpace;
  completionInfo.time = time;
  completionInfo.future = future;

  XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
  if (completion.futureResult == XR_SUCCESS) {

    // Query for the semantic label component data
    XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
    queryCond.componentTypeCount = snapshotComponents.size();
    queryCond.componentTypes = snapshotComponents.data();

    XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));

    std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
    std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityIdCountOutput);
    queryResult.entityIdCapacityInput = entityIds.size();
    queryResult.entityIds = entityIds.data();
    queryResult.entityStateCapacityInput = entityStates.size();
    queryResult.entityStates = entityStates.data();

    std::vector<XrSpatialPersistenceDataEXT> persistenceData(queryResult.entityIdCountOutput);
    XrSpatialComponentPersistenceListEXT persistenceDataList{XR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXT};
    persistenceDataList.persistDataCount = persistenceData.size();
    persistenceDataList.persistData = persistenceData.data();
    queryResult.next = &persistenceDataList;

    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));

    for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
      // persistenceData[i].persistUuid is the UUID of the persisted entity whose entity ID is entityIds[i].
      // The persistenceData array is essentially the uuids persisted in the scope that the current
      // XrSpatialPersistenceContextEXT is configured with.
    }

    CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
  }
};

while (1) {
  // ...
  // For every frame in frame loop
  // ...

  XrFrameState frameState;  // previously returned from xrWaitFrame
  const XrTime time = frameState.predictedDisplayTime;

  // Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
  XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
  XrResult result = xrPollEvent(instance, &event);
  if (result == XR_SUCCESS) {
      switch (event.type) {
          case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
              const XrEventDataSpatialDiscoveryRecommendedEXT& eventdata =
                  *reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT*>(&event);
              // Discover spatial entities for the context that we received the "discovery
              // recommended" event for.
              discoverSpatialEntities(eventdata.spatialContext, time);
              break;
          }
      }
  }

  // ...
  // Finish frame loop
  // ...
}

اكتشاف الكيانات التي تتضمّن معرّفات UUID معيّنة

XrFutureEXT future = XR_NULL_FUTURE_EXT;

// Load up the uuids that the app has stored on its own i.e. the uuids it is interested in.
std::vector<XrUuid> uuidsStoredByApp = loadPersistedUuids();

// We want to look for entities that have the following components.
std::vector<XrSpatialComponentTypeEXT> snapshotComponents = {
  XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT,
};

auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
  XrSpatialDiscoveryPersistenceUuidFilterEXT persistenceFilter{XR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXT};
  persistenceFilter.persistedUuidCount = uuidsStoredByApp.size();
  persistenceFilter.persistedUuids = uuidsStoredByApp.data();

  XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
  snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
  snapshotCreateInfo.componentTypes = snapshotComponents.data();
  snapshotCreateInfo.next = &persistenceFilter;

  CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));

  waitUntilReady(future);

  XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
  completionInfo.baseSpace = localSpace;
  completionInfo.time = time;
  completionInfo.future = future;

  XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
  if (completion.futureResult == XR_SUCCESS) {

    // Query for the semantic label component data
    XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
    queryCond.componentTypeCount = snapshotComponents.size();
    queryCond.componentTypes = snapshotComponents.data();

    XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));

    std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
    std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityIdCountOutput);
    queryResult.entityIdCapacityInput = entityIds.size();
    queryResult.entityIds = entityIds.data();
    queryResult.entityStateCapacityInput = entityStates.size();
    queryResult.entityStates = entityStates.data();

    std::vector<XrSpatialPersistenceDataEXT> persistenceData(queryResult.entityIdCountOutput);
    XrSpatialComponentPersistenceListEXT persistenceDataList{XR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXT};
    persistenceDataList.persistDataCount = persistenceData.size();
    persistenceDataList.persistData = persistenceData.data();
    queryResult.next = &persistenceDataList;

    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));

    for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
      if (persistenceData[i].persistState == XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT) {
        // persistenceData[i].persistUuid, requested by the app, is present in the persistence scope
        // and its corresponding entity ID and state are entityIds[i] & entityStates[i] respectively.
      } else if (persistenceData[i].persistState == XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT) {
        // persistenceData[i].persistUuid, requested by the app, is NOT present in the persistence scope
        // and its corresponding entity ID (entityIds[i]) would be XR_NULL_SPATIAL_ENTITY_ID_EXT
        // and tracking state (entityStates[i]) would be XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXT.
      }
    }

    CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
  }
};

while (1) {
  // ...
  // For every frame in frame loop
  // ...

  XrFrameState frameState;  // previously returned from xrWaitFrame
  const XrTime time = frameState.predictedDisplayTime;

  // Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
  XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
  XrResult result = xrPollEvent(instance, &event);
  if (result == XR_SUCCESS) {
      switch (event.type) {
          case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
              const XrEventDataSpatialDiscoveryRecommendedEXT& eventdata =
                  *reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT*>(&event);
              // Discover spatial entities for the context that we received the "discovery
              // recommended" event for.
              discoverSpatialEntities(eventdata.spatialContext, time);
              break;
          }
      }
  }

  // ...
  // Finish frame loop
  // ...
}

المشاكل

سجلّ الإصدارات

  • الإصدار 1، ‏29-08-2024 (نيهف جين، Google)

    • الوصف الأولي للإضافة