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 إذا لم يتم منح هذه الأذونات لهذا التطبيق.
الاستخدام الصالح (ضمني)
- يجب تفعيل إضافة
XR_EXT_spatial_persistenceقبل طلب xrCreateSpatialPersistenceContextAsyncEXT - يجب أن يكون
sessionاسم معرِّف XrSession صالحًا -
createInfoيجب أن يكون مؤشرًا إلى بنية XrSpatialPersistenceContextCreateInfoEXT صالحة - يجب أن يكون
futureمؤشرًا إلى قيمةXrFutureEXT
رموز الإرجاع
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXTXR_ERROR_VALIDATION_FAILURE
يتم تعريف بنية XrSpatialPersistenceContextCreateInfoEXT على النحو التالي:
typedef struct XrSpatialPersistenceContextCreateInfoEXT {
XrStructureType type;
const void* next;
XrSpatialPersistenceScopeEXT scope;
} XrSpatialPersistenceContextCreateInfoEXT;
أوصاف الأعضاء
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. لا يتم تحديد مثل هذه البُنى في OpenXR الأساسية أو هذه الإضافة. -
scopeهو XrSpatialPersistenceScopeEXT يحدّد نطاق تخزين سياق الثبات.
تصف بنية XrSpatialPersistenceContextCreateInfoEXT المعلومات اللازمة لإنشاء مؤشر XrSpatialPersistenceContextEXT.
الاستخدام الصالح (ضمني)
- يجب تفعيل إضافة
XR_EXT_spatial_persistenceقبل استخدام XrSpatialPersistenceContextCreateInfoEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية -
scopeيجب أن تكون قيمة XrSpatialPersistenceScopeEXT صالحة
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مؤشرًا إلى مصفوفة من قيمpersistenceScopeCapacityInputXrSpatialPersistenceScopeEXT
رموز الإرجاع
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_ERROR_VALIDATION_FAILURE
يتم تحديد الدالة xrCreateSpatialPersistenceContextCompleteEXT على النحو التالي:
XrResult xrCreateSpatialPersistenceContextCompleteEXT(
XrSession session,
XrFutureEXT future,
XrCreateSpatialPersistenceContextCompletionEXT* completion);
أوصاف المَعلمات
-
sessionهو XrSession الذي تم تمريره سابقًا إلى xrCreateSpatialPersistenceContextAsyncEXT ::session. -
futureهوXrFutureEXTالذي تم تلقّيه من xrCreateSpatialPersistenceContextAsyncEXT . -
completionهو مؤشر إلى XrCreateSpatialPersistenceContextCompletionEXT .
تُكمل الدالة xrCreateSpatialPersistenceContextCompleteEXT العملية غير المتزامنة التي بدأتها الدالة xrCreateSpatialPersistenceContextAsyncEXT . يجب أن يعرض وقت التشغيل XR_ERROR_FUTURE_PENDING_EXT إذا لم يكن future في حالة الاستعداد. يجب أن يعرض وقت التشغيل القيمة XR_ERROR_FUTURE_INVALID_EXT إذا سبق أن تم إكمال future أو إلغاؤه.
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_persistenceقبل استدعاء xrCreateSpatialPersistenceContextCompleteEXT - يجب أن يكون
sessionاسم معرِّف XrSession صالحًا -
completionيجب أن يكون مؤشرًا إلى بنية XrCreateSpatialPersistenceContextCompletionEXT
رموز الإرجاع
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_FUTURE_INVALID_EXTXR_ERROR_FUTURE_PENDING_EXTXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
يتم تحديد بنية XrCreateSpatialPersistenceContextCompletionEXT على النحو التالي:
typedef struct XrCreateSpatialPersistenceContextCompletionEXT {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialPersistenceContextResultEXT createResult;
XrSpatialPersistenceContextEXT persistenceContext;
} XrCreateSpatialPersistenceContextCompletionEXT;
أوصاف الأعضاء
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. -
futureResultهي XrResult لعملية إنشاء سياق الثبات المكاني. -
createResultهي XrSpatialPersistenceContextResultEXT لعملية إنشاء سياق الثبات المكاني. -
persistenceContextهو XrSpatialPersistenceContextEXT تم إنشاؤه باستخدام البيانات والإعدادات في xrCreateSpatialPersistenceContextAsyncEXT ::createInfo.
رموز الإرجاع المستقبلية
قيم futureResult:
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_PERMISSION_INSUFFICIENT
إذا كان كل من futureResult وcreateResult رمزي نجاح، يجب أن يكون persistenceContext صالحًا. إذا كان persistenceContext صالحًا، يجب أن يظل كذلك خلال مراحل نشاط xrCreateSpatialPersistenceContextAsyncEXT :: session أو إلى أن يستخدم التطبيق xrDestroySpatialPersistenceContextEXT مع persistenceContext ، أيهما أقرب.
يجب أن يضبط وقت التشغيل createResult فقط إذا كان futureResult رمز نجاح.
الاستخدام الصالح (ضمني)
- يجب تفعيل إضافة
XR_EXT_spatial_persistenceقبل استخدام XrCreateSpatialPersistenceContextCompletionEXT - يجب أن يكون
typeXR_TYPE_CREATE_SPATIAL_PERSISTENCE_CONTEXT_COMPLETION_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية - يجب أن تكون قيمة
futureResultصالحة لـ XrResult -
createResultيجب أن تكون قيمة XrSpatialPersistenceContextResultEXT صالحة - يجب أن يكون
persistenceContextاسمًا معرِّفًا صالحًا لـ XrSpatialPersistenceContextEXT
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);
أوصاف المَعلمات
-
persistenceContextهو XrSpatialPersistenceContextEXT تم إنشاؤه سابقًا بواسطة xrCreateSpatialPersistenceContextAsyncEXT .
يمكن للتطبيق استخدام xrDestroySpatialPersistenceContextEXT لإلغاء معالجة persistenceContext عند الانتهاء من مهام الثبات المكاني.
يجب ألا يتلف وقت التشغيل الموارد الأساسية لـ persistenceContext عند استدعاء xrDestroySpatialPersistenceContextEXT إذا كانت هناك أي مؤشرات XrSpatialContextEXT صالحة تم ربط persistenceContext بها من خلال XrSpatialContextPersistenceConfigEXT . وذلك لأنّ موارد سياق الثبات لا تزال مستخدَمة من قِبل السياق المكاني لاكتشاف الكيانات الثابتة. يؤدي تدمير مؤشر سياق الثبات في مثل هذه الحالة إلى إزالة وصول التطبيق إلى هذه الموارد فقط.
يجب إخلاء موارد XrSpatialPersistenceContextEXT الذي تم تدميره عند تدمير جميع مؤشرات XrSpatialContextEXT التي كان سياق الثبات مرتبطًا بها.
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_persistenceقبل استدعاء xrDestroySpatialPersistenceContextEXT - يجب أن يكون
persistenceContextاسمًا معرِّفًا صالحًا لـ XrSpatialPersistenceContextEXT
أمان Thread
- يجب مزامنة الوصول إلى
persistenceContextوأي معرّفات فرعية خارجيًا
رموز الإرجاع
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
استكشاف الكيانات المحفوظة
مكوّن الاستمرارية
تحتوي الكيانات المكانية المحفوظة على مكوّن الحفظ الذي يجب أن يتضمّنه وقت التشغيل في لقطات الاستكشاف والتعديل إذا تم تفعيل XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT أثناء إنشاء XrSpatialContextEXT وتم تضمينه في XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes أو XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes .
بيانات المكوّن
يتم تعريف بنية XrSpatialPersistenceDataEXT على النحو التالي:
typedef struct XrSpatialPersistenceDataEXT {
XrUuid persistUuid;
XrSpatialPersistenceStateEXT persistState;
} XrSpatialPersistenceDataEXT;
أوصاف الأعضاء
-
persistUuidهو XrUuid . -
persistStateهو XrSpatialPersistenceStateEXT يمثّل حالة ثباتpersistUuid
الاستخدام الصالح (ضمني)
- يجب تفعيل إضافة
XR_EXT_spatial_persistenceقبل استخدام XrSpatialPersistenceDataEXT -
persistStateيجب أن تكون قيمة XrSpatialPersistenceStateEXT صالحة
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_EXT_spatial_persistenceقبل استخدام XrSpatialComponentPersistenceListEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية -
persistDataيجب أن يكون مؤشرًا إلى مصفوفة من هياكلpersistDataCountXrSpatialPersistenceDataEXT - يجب أن تكون المَعلمة
persistDataCountأكبر من0
الإعداد
إذا تم تعداد 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 .
الاستخدام الصالح (ضمني)
- يجب تفعيل إضافة
XR_EXT_spatial_persistenceقبل استخدام XrSpatialContextPersistenceConfigEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية - يجب أن تكون السمة
persistenceContextsمؤشرًا إلى مصفوفة من مؤشراتpersistenceContextCountصالحة من النوع XrSpatialPersistenceContextEXT - يجب أن تكون المَعلمة
persistenceContextCountأكبر من0
إنشاء نبذة عن الاكتشاف
اكتشاف الكيانات التي تتضمّن معرّفات 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.
- يجب أن يضبط وقت التشغيل XrSpatialPersistenceStateEXT في XrSpatialPersistenceDataEXT لهذا الكيان على
إذا حدّد وقت التشغيل أنّ معرّف 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للإشارة إلى التطبيق بأنّه لن يتم تتبُّع هذا الكيان أبدًا.
- يجب أن يضبط وقت التشغيل السمة XrSpatialPersistenceStateEXT في XrSpatialPersistenceDataEXT لهذا الكيان على
إذا لم يتمكّن وقت التشغيل من تحديد ما إذا كان معرّف 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 الذي يتوافق معه فهرس النتائج الحالي.
الاستخدام الصالح (ضمني)
- يجب تفعيل إضافة
XR_EXT_spatial_persistenceقبل استخدام XrSpatialDiscoveryPersistenceUuidFilterEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية - يجب أن يكون
persistedUuidsمؤشرًا إلى مصفوفة من بُنىpersistedUuidCountXrUuid - يجب أن تكون المَعلمة
persistedUuidCountأكبر من0
الاطّلاع على جميع الكيانات المحفوظة
إذا كان التطبيق يستخدم 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.
أنواع العناصر الجديدة
الأوامر الجديدة
- xrCreateSpatialPersistenceContextAsyncEXT
- xrCreateSpatialPersistenceContextCompleteEXT
- xrDestroySpatialPersistenceContextEXT
- xrEnumerateSpatialPersistenceScopesEXT
منشآت جديدة
- XrCreateSpatialPersistenceContextCompletionEXT
- XrSpatialPersistenceContextCreateInfoEXT
- XrSpatialPersistenceDataEXT
توسيع XrSpatialContextCreateInfoEXT :
توسيع XrSpatialDiscoverySnapshotCreateInfoEXT وXrSpatialComponentDataQueryConditionEXT :
عمليات تعداد جديدة
ثوابت تعداد جديدة
XR_EXT_SPATIAL_PERSISTENCE_EXTENSION_NAMEXR_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_EXTXR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXTXR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXTXR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXTXR_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)
- الوصف الأولي للإضافة