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_SUCCESS
  • XR_SESSION_LOSS_PENDING

Failure

  • 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 एन्यूमरेशन, पर्सिस्टेंस कॉन्टेक्स्ट के अलग-अलग तरह के स्कोप की पहचान करता है.

इन 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 को persistenceScopeCapacityInput XrSpatialPersistenceScopeEXT वैल्यू के कलेक्शन का पॉइंटर होना चाहिए

रिटर्न कोड

सफलता

  • XR_SUCCESS

Failure

  • 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 से शुरू किए गए एसिंक्रोनस ऑपरेशन को पूरा करता है. अगर future तैयार नहीं है, तो रनटाइम को XR_ERROR_FUTURE_PENDING_EXT दिखाना चाहिए. अगर future पहले ही पूरा हो चुका है या रद्द कर दिया गया है, तो रनटाइम को XR_ERROR_FUTURE_INVALID_EXT दिखाना चाहिए.

सही इस्तेमाल (इंप्लिसिट)

रिटर्न कोड

सफलता

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Failure

  • 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;

सदस्यों की जानकारी

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है.
  • futureResult, स्पेशल पर्सिस्टेंस कॉन्टेक्स्ट बनाने की प्रोसेस का XrResult है.
  • createResult, स्पेसियल पर्सिस्टेंस कॉन्टेक्स्ट बनाने की प्रोसेस का XrSpatialPersistenceContextResultEXT है.
  • persistenceContext एक XrSpatialPersistenceContextEXT है. इसे xrCreateSpatialPersistenceContextAsyncEXT :: createInfo में मौजूद डेटा और कॉन्फ़िगरेशन का इस्तेमाल करके बनाया गया है.

आने वाले समय में मिलने वाले रिटर्न कोड

futureResult वैल्यू:

सफलता

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Failure

  • 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 की लाइफ़साइकल के दौरान या ऐप्लिकेशन के persistenceContext के साथ xrDestroySpatialPersistenceContextEXT का इस्तेमाल करने तक, इनमें से जो भी पहले हो, मान्य रहना चाहिए.

रनटाइम को 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 एन्यूमरेशन में सफलता के कोड, शून्य से कम नहीं होते. साथ ही, गड़बड़ी के कोड, शून्य से कम होते हैं.

इन 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);

पैरामीटर की जानकारी

स्पेशल पर्सिस्टेंस से जुड़े टास्क पूरे होने के बाद, ऐप्लिकेशन xrDestroySpatialPersistenceContextEXT का इस्तेमाल करके, persistenceContext हैंडल को रिलीज़ कर सकता है.

अगर xrDestroySpatialPersistenceContextEXT को कॉल किया जाता है, तो रनटाइम को persistenceContext के लिए मौजूद संसाधनों को नष्ट नहीं करना चाहिए. ऐसा तब होना चाहिए, जब XrSpatialContextEXT के कोई मान्य हैंडल मौजूद हों, जिनसे persistenceContext को XrSpatialContextPersistenceConfigEXT के ज़रिए लिंक किया गया हो. ऐसा इसलिए होता है, क्योंकि स्पेसियल कॉन्टेक्स्ट, सेव की गई इकाइयों को खोजने के लिए, पर्सिस्टेंस कॉन्टेक्स्ट के संसाधनों का इस्तेमाल करता है. ऐसी स्थिति में, पर्सिस्टेंस कॉन्टेक्स्ट हैंडल को खत्म करने से, ऐप्लिकेशन का इन संसाधनों का ऐक्सेस हट जाता है.

नष्ट किए गए XrSpatialPersistenceContextEXT के संसाधनों को तब खाली किया जाना चाहिए, जब वे सभी XrSpatialContextEXT हैंडल नष्ट हो जाएं जिनसे पर्सिस्टेंस कॉन्टेक्स्ट लिंक किया गया था.

सही इस्तेमाल (इंप्लिसिट)

Thread की सुरक्षा

  • persistenceContext और किसी भी चाइल्ड हैंडल का ऐक्सेस, बाहरी तौर पर सिंक किया जाना ज़रूरी है

रिटर्न कोड

सफलता

  • XR_SUCCESS

Failure

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_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 होनी चाहिए
  • next NULL या स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए
  • persistData को persistDataCount XrSpatialPersistenceDataEXT स्ट्रक्चर के कलेक्शन का पॉइंटर होना चाहिए
  • 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 होनी चाहिए
  • next NULL या स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए
  • 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 को XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT पर सेट करना होगा. इससे ऐप्लिकेशन को यह पता चलेगा कि यह UUID अब स्टोरेज में मौजूद नहीं है.
    • रनटाइम को इस इकाई के लिए, बनाए गए स्नैपशॉट में XrSpatialEntityIdEXT को XR_NULL_SPATIAL_ENTITY_ID_EXT पर सेट करना चाहिए.
    • रनटाइम को उस इकाई के XrSpatialEntityTrackingStateEXT को XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXT पर सेट करना चाहिए, ताकि ऐप्लिकेशन को यह पता चल सके कि इस इकाई को कभी ट्रैक नहीं किया जाएगा.
  • अगर रनटाइम यह पता नहीं लगा पाता है कि यूयूआईडी उसके स्टोरेज में मौजूद है या नहीं, तो उसे स्नैपशॉट में शामिल नहीं करना चाहिए.

ऐप्लिकेशन, 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 होनी चाहिए
  • next NULL या स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए
  • persistedUuids को persistedUuidCount XrUuid स्ट्रक्चर के कलेक्शन का पॉइंटर होना चाहिए
  • 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 पर सेट करना होगा .

नए ऑब्जेक्ट टाइप

नए निर्देश

नए स्ट्रक्चर

नए Enum

नए Enum कॉन्सटेंट

  • 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
  // ...
}

खास यूयूआईडी वाली इकाइयां खोजना

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)

    • एक्सटेंशन का शुरुआती ब्यौरा