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 से दिखाया जाता है. यह एक्सटेंशन, इस सिद्धांत को आगे बढ़ाता है.इसके लिए, यह तय किया जाता है कि अगर कोई इकाई बनी रहती है, तो उसे ऐप्लिकेशन और OpenXR सेशन में XrUuid से दिखाया जाता है. इसका मतलब है कि कोई ऐप्लिकेशन, सेशन के दौरान किसी इकाई की पहचान करने के लिए, इस एक्सटेंशन से मिले 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का पॉइंटर है .
कोई ऐप्लिकेशन, xrCreateSpatialPersistenceContextAsyncEXT फ़ंक्शन का इस्तेमाल करके, XrSpatialPersistenceContextEXT हैंडल बना सकता है. साथ ही, createInfo में पर्सिस्टेंस कॉन्टेक्स्ट का स्कोप कॉन्फ़िगर कर सकता है.
अगर xrEnumerateSpatialPersistenceScopesEXT, XrSpatialPersistenceContextCreateInfoEXT :: scope की गिनती नहीं करता है, तो रनटाइम को XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT दिखाना चाहिए.
अगर कोई रनटाइम, XrSpatialPersistenceContextEXT से दिखाए गए पर्सिस्टेंस स्टोरेज के लिए ऐप्लिकेशन के ऐक्सेस को कंट्रोल करने के लिए, अनुमति सिस्टम लागू करता है, तो रनटाइम को XR_ERROR_PERMISSION_INSUFFICIENT दिखाना चाहिए. ऐसा तब करना चाहिए, जब इस ऐप्लिकेशन को वे अनुमतियां न दी गई हों.
सही इस्तेमाल (इंप्लिसिट)
- xrCreateSpatialPersistenceContextAsyncEXT को कॉल करने से पहले,
XR_EXT_spatial_persistenceएक्सटेंशन को चालू करना ज़रूरी है -
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 हैंडल बनाने के लिए ज़रूरी जानकारी दी गई है.
सही इस्तेमाल (इंप्लिसिट)
- XrSpatialPersistenceContextCreateInfoEXT का इस्तेमाल करने से पहले,
XR_EXT_spatial_persistenceएक्सटेंशन चालू करना ज़रूरी है -
typeकी वैल्यूXR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXTहोनी चाहिए -
nextNULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए -
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 एन्यूमरेशन, पर्सिस्टेंस कॉन्टेक्स्ट के अलग-अलग तरह के स्कोप की पहचान करता है.
इन enum का मतलब यह है:
Enum की जानकारी
XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT
यह ऐप्लिकेशन को रीड-ओनली ऐक्सेस देता है.इसका मतलब है कि ऐप्लिकेशन, इस स्कोप से जुड़े स्टोर में बदलाव नहीं कर सकता. यह स्टोर, सिस्टम की ओर से सेव की गई और मैनेज की गई स्पेशल इकाइयों के लिए होता है. इस स्कोप के लिए, ऐप्लिकेशन पर्सिस्टेंस कॉम्पोनेंट में यूयूआईडी का इस्तेमाल कर सकता है. इससे, अलग-अलग जगहों और डिवाइस के रीबूट होने पर, इकाइयों को आपस में जोड़ा जा सकता है.
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 का एक कलेक्शन है. अगरpersistenceScopeCapacityInputकी वैल्यू 0 है, तो यहNULLहो सकती है.- ज़रूरी
persistenceScopesसाइज़ को वापस पाने के बारे में ज़्यादा जानकारी के लिए, बफ़र साइज़ पैरामीटर चैप्टर देखें.
ऐप्लिकेशन, xrEnumerateSpatialPersistenceScopesEXT का इस्तेमाल करके, किसी XrSystemId के साथ काम करने वाले स्पेशल पर्सिस्टेंस स्कोप की सूची को एन्यूमेरेबल कर सकता है.
सही इस्तेमाल (इंप्लिसिट)
- xrEnumerateSpatialPersistenceScopesEXT को कॉल करने से पहले,
XR_EXT_spatial_persistenceएक्सटेंशन को चालू करना ज़रूरी है -
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, xrCreateSpatialPersistenceContextAsyncEXT से मिलाXrFutureEXTहै.completion, XrCreateSpatialPersistenceContextCompletionEXT का पॉइंटर है.
xrCreateSpatialPersistenceContextCompleteEXT, xrCreateSpatialPersistenceContextAsyncEXT से शुरू किए गए एसिंक्रोनस ऑपरेशन को पूरा करता है. अगर future तैयार नहीं है, तो रनटाइम को XR_ERROR_FUTURE_PENDING_EXT दिखाना चाहिए. अगर future पहले ही पूरा हो चुका है या रद्द कर दिया गया है, तो रनटाइम को XR_ERROR_FUTURE_INVALID_EXT दिखाना चाहिए.
सही इस्तेमाल (इंप्लिसिट)
- xrCreateSpatialPersistenceContextCompleteEXT को कॉल करने से पहले,
XR_EXT_spatial_persistenceएक्सटेंशन चालू करना ज़रूरी है -
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 की लाइफ़साइकल के दौरान या ऐप्लिकेशन के persistenceContext के साथ xrDestroySpatialPersistenceContextEXT का इस्तेमाल करने तक, इनमें से जो भी पहले हो, मान्य रहना चाहिए.
रनटाइम को createResult को सिर्फ़ तब सेट करना चाहिए, जब futureResult एक सक्सेस कोड हो.
सही इस्तेमाल (इंप्लिसिट)
- XrCreateSpatialPersistenceContextCompletionEXT का इस्तेमाल करने से पहले,
XR_EXT_spatial_persistenceएक्सटेंशन चालू करना ज़रूरी है -
typeकी वैल्यूXR_TYPE_CREATE_SPATIAL_PERSISTENCE_CONTEXT_COMPLETION_EXTहोनी चाहिए -
nextNULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए -
futureResultmust be a valid XrResult value -
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 एन्यूमरेशन में सफलता के कोड, शून्य से कम नहीं होते. साथ ही, गड़बड़ी के कोड, शून्य से कम होते हैं.
इन enum का मतलब यह है:
Enum की जानकारी
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
स्टोरेज में, दिया गया यूयूआईडी नहीं मिला. (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 हैंडल को रिलीज़ कर सकता है.
अगर xrDestroySpatialPersistenceContextEXT को कॉल किया जाता है, तो रनटाइम को persistenceContext के लिए मौजूद संसाधनों को नष्ट नहीं करना चाहिए. ऐसा तब होना चाहिए, जब XrSpatialContextEXT के कोई मान्य हैंडल मौजूद हों, जिनसे persistenceContext को XrSpatialContextPersistenceConfigEXT के ज़रिए लिंक किया गया हो. ऐसा इसलिए होता है, क्योंकि स्पेसियल कॉन्टेक्स्ट, सेव की गई इकाइयों को खोजने के लिए, पर्सिस्टेंस कॉन्टेक्स्ट के संसाधनों का इस्तेमाल करता है. ऐसी स्थिति में, पर्सिस्टेंस कॉन्टेक्स्ट हैंडल को खत्म करने से, ऐप्लिकेशन का इन संसाधनों का ऐक्सेस हट जाता है.
नष्ट किए गए XrSpatialPersistenceContextEXT के संसाधनों को तब खाली किया जाना चाहिए, जब वे सभी XrSpatialContextEXT हैंडल नष्ट हो जाएं जिनसे पर्सिस्टेंस कॉन्टेक्स्ट लिंक किया गया था.
सही इस्तेमाल (इंप्लिसिट)
- xrDestroySpatialPersistenceContextEXT को कॉल करने से पहले,
XR_EXT_spatial_persistenceएक्सटेंशन को चालू करना ज़रूरी है -
persistenceContextको एक मान्य XrSpatialPersistenceContextEXT हैंडल होना चाहिए
Thread की सुरक्षा
persistenceContextऔर किसी भी चाइल्ड हैंडल का ऐक्सेस, बाहरी तौर पर सिंक किया जाना ज़रूरी है
रिटर्न कोड
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
सेव की गई इकाइयों को देखना
पर्सिस्टेंस कॉम्पोनेंट
सेव की गई स्पेशल इकाइयों में, सेव करने वाला कॉम्पोनेंट होता है. रनटाइम को इसे डिस्कवरी और अपडेट स्नैपशॉट में ज़रूर शामिल करना चाहिए. ऐसा तब करना चाहिए, जब XrSpatialContextEXT को बनाते समय XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT चालू किया गया हो और XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes या XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes में शामिल किया गया हो.
कॉम्पोनेंट डेटा
XrSpatialPersistenceDataEXT स्ट्रक्चर को इस तरह से तय किया गया है:
typedef struct XrSpatialPersistenceDataEXT {
XrUuid persistUuid;
XrSpatialPersistenceStateEXT persistState;
} XrSpatialPersistenceDataEXT;
सदस्यों की जानकारी
persistUuidएक XrUuid है .persistStateएक XrSpatialPersistenceStateEXT है, जोpersistUuidके पर्सिस्टेंस स्टेट को दिखाता है
सही इस्तेमाल (इंप्लिसिट)
- XrSpatialPersistenceDataEXT का इस्तेमाल करने से पहले,
XR_EXT_spatial_persistenceएक्सटेंशन को चालू करना ज़रूरी है -
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 की अलग-अलग स्थितियों की पहचान करता है.
इन enum का मतलब यह है:
Enum की जानकारी
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT
स्टोरेज से यूयूआईडी को लोड किया गया.
XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT
स्टोरेज में सेव किया गया यूयूआईडी नहीं मिला. इसे स्टोरेज से हटा दिया गया था या यह कभी उसमें मौजूद ही नहीं था.
डेटा के बारे में क्वेरी करने के लिए कॉम्पोनेंट की सूची का स्ट्रक्चर
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 का एक कलेक्शन है.
अगर XrSpatialComponentPersistenceListEXT, XrSpatialComponentDataQueryResultEXT :: next की अगली चेन में है, तो रनटाइम को xrQuerySpatialComponentDataEXT से XR_ERROR_VALIDATION_FAILURE दिखाना ज़रूरी है. हालांकि, XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT को XrSpatialComponentDataQueryConditionEXT :: componentTypes में शामिल नहीं किया गया है.
अगर persistDataCount, XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput से कम है, तो रनटाइम को xrQuerySpatialComponentDataEXT से XR_ERROR_SIZE_INSUFFICIENT को ज़रूर दिखाना चाहिए.
अन्य कॉम्पोनेंट के उलट, रनटाइम को XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT के लिए डेटा सेट करना ज़रूरी है. भले ही, XrSpatialEntityTrackingStateEXT कुछ भी हो.
सही इस्तेमाल (इंप्लिसिट)
- XrSpatialComponentPersistenceListEXT का इस्तेमाल करने से पहले,
XR_EXT_spatial_persistenceएक्सटेंशन को चालू करना ज़रूरी है -
typeकी वैल्यूXR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXTहोनी चाहिए -
nextNULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए -
persistDataकोpersistDataCountXrSpatialPersistenceDataEXT स्ट्रक्चर के कलेक्शन का पॉइंटर होना चाहिए -
persistDataCountपैरामीटर की वैल्यू,0से ज़्यादा होनी चाहिए
कॉन्फ़िगरेशन
अगर किसी क्षमता के लिए, XrSpatialCapabilityComponentTypesEXT :: componentTypes में XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT को शामिल किया गया है, तो ऐप्लिकेशन उसे चालू कर सकता है. इसके लिए, उसे XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents सूची में enum को शामिल करना होगा. इस कॉम्पोनेंट को XrSpatialCapabilityConfigurationBaseHeaderEXT की अगली चेन में शामिल करने के लिए, किसी खास कॉन्फ़िगरेशन की ज़रूरत नहीं होती. अगर ऐप्लिकेशन, चालू किए गए कॉम्पोनेंट की सूची में XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT को शामिल कर रहा है, तो उसे XrSpatialContextCreateInfoEXT की अगली चेन में XrSpatialContextPersistenceConfigEXT को भी शामिल करना चाहिए. ऐसा न करने पर, रनटाइम को xrCreateSpatialContextAsyncEXT से XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT को वापस करना चाहिए.
पर्सिस्टेंस कॉन्टेक्स्ट के साथ स्पेशल कॉन्टेक्स्ट को कॉन्फ़िगर करना
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 का एक कलेक्शन है.
कोई ऐप्लिकेशन, XrSpatialContextCreateInfoEXT की अगली चेन में XrSpatialContextPersistenceConfigEXT को जोड़ सकता है . इससे, बनाए गए XrSpatialContextEXT को persistenceContexts के साथ कॉन्फ़िगर किया जाएगा. साथ ही, ऐप्लिकेशन को persistenceContexts में XrSpatialPersistenceContextEXT हैंडल से दिखाए गए स्टोरेज में मौजूद, स्पेसियल इकाइयों को खोजने की अनुमति मिलेगी.
सही इस्तेमाल (इंप्लिसिट)
- XrSpatialContextPersistenceConfigEXT का इस्तेमाल करने से पहले,
XR_EXT_spatial_persistenceएक्सटेंशन चालू करना ज़रूरी है -
typeकी वैल्यूXR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXTहोनी चाहिए -
nextNULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए -
persistenceContexts,persistenceContextCountमान्य XrSpatialPersistenceContextEXT हैंडल के कलेक्शन का पॉइंटर होना चाहिए -
persistenceContextCountपैरामीटर की वैल्यू,0से ज़्यादा होनी चाहिए
डिस्कवरी स्नैपशॉट बनाना
खास यूयूआईडी वाली इकाइयां खोजना
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 का कलेक्शन है.
ऐप्लिकेशन, XrSpatialDiscoverySnapshotCreateInfoEXT की अगली चेन में XrSpatialDiscoveryPersistenceUuidFilterEXT का इस्तेमाल कर सकता है. इससे, डिस्कवरी ऑपरेशन को सिर्फ़ उन इकाइयों तक सीमित किया जा सकता है जिनके सेव किए गए यूयूआईडी, persistedUuids में दिए गए यूयूआईडी के सेट में मौजूद हैं.
अगर ऐप्लिकेशन, XrSpatialDiscoverySnapshotCreateInfoEXT की अगली चेन में XrSpatialDiscoveryPersistenceUuidFilterEXT जोड़ता है, लेकिन xrCreateSpatialDiscoverySnapshotAsyncEXT :: spatialContext को XrSpatialContextPersistenceConfigEXT का इस्तेमाल करके, किसी भी XrSpatialPersistenceContextEXT के साथ कॉन्फ़िगर नहीं किया गया था, तो रनटाइम को xrCreateSpatialDiscoverySnapshotAsyncEXT से XR_ERROR_VALIDATION_FAILURE को ज़रूर दिखाना चाहिए.
रनटाइम को XrSpatialDiscoveryPersistenceUuidFilterEXT फ़िल्टर को 'AND' शर्त के तौर पर मानना चाहिए. यह शर्त, XrSpatialDiscoverySnapshotCreateInfoEXT या इसकी अगली चेन में दिए गए किसी भी अन्य फ़िल्टर के साथ लागू होनी चाहिए. रनटाइम को persistedUuids कलेक्शन को 'OR' शर्त के तौर पर मानना चाहिए. इसका मतलब है कि उन इकाइयों के लिए फ़िल्टर करें जिनके पास उस कलेक्शन में दिए गए यूयूआईडी में से कोई भी यूयूआईडी है.
रनटाइम के दौरान, बनाए गए स्नैपशॉट में persistedUuids में मौजूद हर यूयूआईडी के लिए एक एंट्री ज़रूर शामिल होनी चाहिए. इसके लिए, इस समय XrSpatialPersistenceStateEXT की स्थिति तय की जा सकती है.
अगर रनटाइम को अपने स्टोरेज में यूयूआईडी मिल जाता है, तो -
- रनटाइम को इस इकाई के XrSpatialPersistenceDataEXT में, XrSpatialPersistenceStateEXT को
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXTपर सेट करना चाहिए . - रनटाइम में, बनाए गए स्नैपशॉट में इस इकाई के लिए मान्य
XrSpatialEntityIdEXTशामिल होना चाहिए. - अगर रनटाइम, इकाई को ऐक्टिव तरीके से ट्रैक कर रहा है और उसके कॉम्पोनेंट के लिए मान्य डेटा मौजूद है, तो उसे उस इकाई के XrSpatialEntityTrackingStateEXT को
XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXTपर सेट करना होगा. अगर ऐसा नहीं है, तो रनटाइम को XrSpatialEntityTrackingStateEXT कोXR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXTपर सेट करना होगा .
- रनटाइम को इस इकाई के XrSpatialPersistenceDataEXT में, XrSpatialPersistenceStateEXT को
अगर रनटाइम को पता चलता है कि यूयूआईडी उसके स्टोरेज में मौजूद नहीं है, तो -
- रनटाइम को इस इकाई के XrSpatialPersistenceDataEXT में XrSpatialPersistenceStateEXT को
XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXTपर सेट करना होगा. इससे ऐप्लिकेशन को यह पता चलेगा कि यह UUID अब स्टोरेज में मौजूद नहीं है. - रनटाइम को इस इकाई के लिए, बनाए गए स्नैपशॉट में
XrSpatialEntityIdEXTको XR_NULL_SPATIAL_ENTITY_ID_EXT पर सेट करना चाहिए. - रनटाइम को उस इकाई के XrSpatialEntityTrackingStateEXT को
XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXTपर सेट करना चाहिए, ताकि ऐप्लिकेशन को यह पता चल सके कि इस इकाई को कभी ट्रैक नहीं किया जाएगा.
- रनटाइम को इस इकाई के XrSpatialPersistenceDataEXT में XrSpatialPersistenceStateEXT को
अगर रनटाइम यह पता नहीं लगा पाता है कि यूयूआईडी उसके स्टोरेज में मौजूद है या नहीं, तो उसे स्नैपशॉट में शामिल नहीं करना चाहिए.
ऐप्लिकेशन, XrSpatialComponentDataQueryConditionEXT की अगली चेन में XrSpatialDiscoveryPersistenceUuidFilterEXT का इस्तेमाल भी कर सकता है. इससे मौजूदा स्नैपशॉट में, खास यूयूआईडी की इकाइयों के बारे में क्वेरी की जा सकती है. XrSpatialComponentDataQueryConditionEXT के साथ इस्तेमाल किए जाने पर, अगर XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids में कोई ऐसा XrUuid शामिल है जो XrSpatialSnapshotEXT में नहीं है, तो रनटाइम के दौरान क्वेरी के नतीजे में उस XrUuid की एंट्री शामिल नहीं होनी चाहिए. साथ ही, क्वेरी के नतीजे में मौजूद इकाइयों का क्रम, XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids में दिए गए यूयूआईडी के क्रम से मेल नहीं खा सकता. ऐप्लिकेशन में XrSpatialComponentDataQueryConditionEXT :: componentTypes में XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT और XrSpatialComponentDataQueryResultEXT की अगली चेन में XrSpatialComponentPersistenceListEXT को शामिल किया जाना चाहिए. इसके बाद, हर क्वेरी रिज़ल्ट इंडेक्स के XrSpatialPersistenceDataEXT :: persistUuid की जांच करें, ताकि यह समझा जा सके कि मौजूदा रिज़ल्ट इंडेक्स किस यूयूआईडी से जुड़ा है.
सही इस्तेमाल (इंप्लिसिट)
- XrSpatialDiscoveryPersistenceUuidFilterEXT का इस्तेमाल करने से पहले,
XR_EXT_spatial_persistenceएक्सटेंशन चालू करना ज़रूरी है -
typeकी वैल्यूXR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXTहोनी चाहिए -
nextNULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए -
persistedUuidsकोpersistedUuidCountXrUuid स्ट्रक्चर के कलेक्शन का पॉइंटर होना चाहिए -
persistedUuidCountपैरामीटर की वैल्यू,0से ज़्यादा होनी चाहिए
सेव की गई सभी इकाइयों को देखना
अगर ऐप्लिकेशन, XrSpatialDiscoveryPersistenceUuidFilterEXT के बिना और XrSpatialContextEXT के साथ xrCreateSpatialDiscoverySnapshotAsyncEXT का इस्तेमाल करता है, जिसे XrSpatialPersistenceContextEXT के साथ कॉन्फ़िगर किया गया है, तो रनटाइम को बनाए गए स्नैपशॉट में उन इकाइयों को शामिल करना ज़रूरी है जो XrSpatialPersistenceContextEXT से दिखाए गए स्टोरेज में मौजूद हैं और XrSpatialDiscoverySnapshotCreateInfoEXT में दिए गए फ़िल्टर के मुताबिक हैं. इन इकाइयों के लिए -
- रनटाइम को इस इकाई के XrSpatialPersistenceDataEXT में, XrSpatialPersistenceStateEXT को
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
XrSpatialComponentDataQueryResultEXT को एक्सटेंड करना :
XrSpatialContextCreateInfoEXT को एक्सटेंड करना :
XrSpatialDiscoverySnapshotCreateInfoEXT , XrSpatialComponentDataQueryConditionEXT को एक्सटेंड करना :
नए Enum
नए Enum कॉन्सटेंट
XR_EXT_SPATIAL_PERSISTENCE_EXTENSION_NAMEXR_EXT_spatial_persistence_SPEC_VERSIONXrObjectType को एक्सटेंड करना :
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
// ...
}
खास यूयूआईडी वाली इकाइयां खोजना
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)
- एक्सटेंशन का शुरुआती ब्यौरा