XR_EXT_spatial_container

Name String

XR_EXT_spatial_container

एक्सटेंशन का टाइप

इंस्टेंस एक्सटेंशन

रजिस्टर किया गया एक्सटेंशन नंबर

811

बदलाव

1

पुष्टि की स्थिति

मंज़ूरी नहीं मिली

एक्सटेंशन और वर्शन डिपेंडेंसी

OpenXR 1.0

पिछली बार बदलाव किए जाने की तारीख

2026-08-06

आईपी स्टेटस

बौद्धिक संपत्ति से जुड़े किसी दावे की जानकारी नहीं है.

योगदान देने वाले

जैरेड फ़ाइंडर, Google
ऐंड्रियास लोव सेल्विक, Meta Platforms
लैकलन फ़ोर्ड, Google
कैस एवरेट, Meta Platforms
ऐडम गाउसेटिस, Meta Platforms
अंकुर अग्रवाल, Unity Technologies
ब्योर्न स्वेनसन, LÖVR
डेनी रॉनग्रेन, Varjo Technologies
फ़्रेडिया हुया-कुआडियो, Godot Engine
गुओडोंग रोंग, Meta Platforms
जेकब बोर्नक्रांट्ज़, NVIDIA
जियान झांग, ByteDance
जॉन कर्नी, Meta Platforms
जॉनाथन राइट, Meta Platforms
जुनफ़ेंग शी, ByteDance
केनी वर्केमर, Google
कर्टिस एवली, Qualcomm
मॉरीशियो नारवेज़, Meta Platforms
नेथन न्यूबर, Valve Corporation
निहाव जैन, Google
निकिता लुत्सेन्को, Meta Platforms
प्रवीण बाबू जे डी, ByteDance
रायली पावलिक, Collabora
सालार खान, Google
शुआई लियू, ByteDance
वॉल्टर लू, Meta Platforms
यिन ली, Microsoft
ज़ीपेंग लियू, ByteDance

खास जानकारी

यह एक्सटेंशन, डिसप्ले की जा सकने वाली इकाइयों की एक नई क्लास तय करता है. इसे "स्पेशल कंटेनर" कहा जाता है. ये डेस्कटॉप 2D विंडोइंग सिस्टम में "विंडो" के कॉन्सेप्ट से मिलते-जुलते हैं.

OpenXR 1.x में, ऐप्लिकेशन के पास इस बात का पूरा कंट्रोल होता है कि उपयोगकर्ता को क्या दिखेगा और उसे उपयोगकर्ता के असल या वर्चुअल एनवायरमेंट के ऊपर कैसे ब्लेंड किया जाएगा. रनटाइम, उपयोगकर्ता की सुरक्षा को पक्का करने के लिए, डिसप्ले में सिर्फ़ मामूली बदलाव करते हैं. यह ऐप्लिकेशन मॉडल, उपयोगकर्ता को एक ही अनुभव में पूरी तरह से शामिल करने के लिए अच्छा है. हालांकि, इसमें एक साथ कई अनुभव नहीं दिए जा सकते. खास तौर पर, एआर और मिक्स्ड रिएलिटी वाले एनवायरमेंट में, लोग अक्सर एक ही समय पर कई अलग-अलग ऐप्लिकेशन इस्तेमाल करना चाहते हैं.

स्पेशल कंटेनर, 3D में एक्सटेंड की गई विंडो की तरह होते हैं. उपयोगकर्ता एक साथ कई स्पेशल कंटेनर देख सकता है और उनमें से कुछ को इनपुट दे सकता है. दिखने वाले स्पेशल कंटेनर, अलग-अलग ऐप्लिकेशन से जुड़े हो सकते हैं. साथ ही, रनटाइम उपयोगकर्ता की ओर से उनके साइज़ और प्लेसमेंट को मैनेज करते हैं.

यह एक्सटेंशन, मौजूदा इमर्सिव OpenXR अनुभवों के अलावा, स्पेसियल बाउंड्री वाले इन नए अनुभवों के साथ काम करता है. बाउंडेड OpenXR अनुभवों में, थोड़ा 3D कॉन्टेंट (कम डेप्थ ऑफ़सेट वाले फ़्लैट पैनल) या पूरी तरह से 3D कॉन्टेंट होस्ट करने वाले वॉल्यूम शामिल हो सकते हैं. इमर्सिव OpenXR अनुभव, फ़ुल-स्क्रीन वाले मौजूदा इमर्सिव ऐप्लिकेशन होते हैं. ये OpenXR 1.0 के बाद से काम करते हैं. अगर ऐप्लिकेशन चाहे, तो वह दोनों तरह के कॉन्टेंट के बीच स्विच कर सकता है.

यह एक्सटेंशन, किसी ऐप्लिकेशन के लिए कॉन्टेंट रेंडर करने का कोई तरीका तय नहीं करता. कॉन्टेंट को ड्रॉ करने का तरीका, अन्य एक्सटेंशन में बताया गया है: XR_EXT_spatial_container_self_rendering .

स्पेशल कंटेनर का इस्तेमाल करना

XrSpatialContainerEXT एक हैंडल है, जो स्पेशल कंटेनर को दिखाता है.

XR_DEFINE_HANDLE(XrSpatialContainerEXT)

स्पेशल कंटेनर की मदद से, ऐप्लिकेशन को रेंडर करने के लिए यह तरीका अपनाएं:

  1. xrCreateSpatialContainerEXT का इस्तेमाल करके, एक स्पेशल कंटेनर बनाएं.
  2. शुरुआती प्रज़ेंटेशन के लिए, कंटेनर की किसी भी स्थिति में बदलाव करें. जैसे, उसका बाउंड मोड.
  3. रनटाइम से अनुरोध करें कि वह xrRequestSpatialContainerVisibleEXT का इस्तेमाल करके कंटेनर दिखाए.
  4. कंटेनर दिखाने के लिए, रनटाइम के तैयार होने का इंतज़ार करें. रनटाइम तैयार होने पर, यह XrEventDataSpatialContainerVisibleChangedEXT इवेंट को सूची में जोड़ता है. इसमें visible को XR_TRUE पर सेट किया जाता है.
  5. स्पेशल कंटेनर के लिए रेंडरिंग शुरू करें.

स्पेशल कंटेनर को हटाने का तरीका यहां बताया गया है:

  1. xrRequestSpatialContainerVisibleEXT का इस्तेमाल करके, रनटाइम से कंटेनर को छिपाने का अनुरोध करें.
  2. रनटाइम के दौरान, कंटेनर के छिपने तक इंतज़ार करें. जब रनटाइम, कंटेनर को पूरी तरह से छिपा देता है, तो वह XrEventDataSpatialContainerVisibleChangedEXT इवेंट को सूची में जोड़ देता है. इसमें visible को XR_FALSE पर सेट किया जाता है.
  3. स्पेशल कंटेनर के लिए रेंडरिंग खत्म करें.
  4. xrDestroySpatialContainerEXT की मदद से कंटेनर को खत्म करें.

ध्यान दें

इस एक्सटेंशन को इस तरह से डिज़ाइन किया गया है कि यह विज़िबिलिटी और फ़ोकस मैनेजमेंट को अलग-अलग स्पेशल कंटेनर को सौंपता है. सेशन अब किसी एक ऑब्जेक्ट को नहीं दिखाता है. इसलिए, सेशन स्टैंडर्ड OpenXR स्टेट मशीन (READY, SYNCHRONIZED, VISIBLE, FOCUSED) के ज़रिए ट्रांज़िशन नहीं करता है. इसके बजाय, सेशन अपनी पूरी लाइफ़टाइम के लिए XR_SESSION_STATE_IDLE में रहता है. साथ ही, सेशन की स्थिति में बदलाव के नियम यह तय करते हैं कि मुख्य OpenXR ऑपरेशन इस मोड पर कैसे मैप होते हैं.

स्पेशल कंटेनर बनाना

xrCreateSpatialContainerEXT फ़ंक्शन, एक नया स्पेशल कंटेनर बनाता है.

XrResult xrCreateSpatialContainerEXT(
    XrSession                                   session,
    const XrSpatialContainerCreateInfoEXT*      createInfo,
    XrSpatialContainerEXT*                      spatialContainer);

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

  • session वह XrSession है जो स्पेशल कंटेनर बनाता है.
  • createInfo, XrSpatialContainerCreateInfoEXT का पॉइंटर है. इसमें स्पेशल कंटेनर बनाने के लिए पैरामीटर शामिल होते हैं.
  • spatialContainer, हैंडल का एक पॉइंटर है. इसमें बनाया गया XrSpatialContainerEXT दिखाया जाता है.

नया बनाया गया XrSpatialContainerEXT, ज़रूरी है कि न तो दिखे और न ही इंटरैक्ट किया जा सके. साथ ही, यह बाउंड मोड XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT में होना चाहिए. अगर किसी ऐप्लिकेशन को इमर्सिव मोड में स्पेशल कंटेनर शुरू करना है, तो वह स्पेशल कंटेनर दिखाने का अनुरोध करने से पहले, XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT के बाउंड मोड का अनुरोध कर सकता है.

अगर XrSpatialContainerCreateInfoEXT :: suggestedBounds का कोई डाइमेंशन नेगेटिव, इनफ़ाइनाइट या संख्या नहीं है, तो रनटाइम को XR_ERROR_VALIDATION_FAILURE दिखाना चाहिए. अगर कोई ऐप्लिकेशन, XrSystemSpatialContainerPropertiesEXT :: maxSpatialContainerCount में बताए गए कंटेनर से ज़्यादा स्पेशल कंटेनर बनाने की कोशिश करता है, तो रनटाइम को XR_ERROR_LIMIT_REACHED दिखाना चाहिए. अगर इस सेशन के लिए स्पेशल कंटेनर चालू नहीं किए गए हैं, तो रनटाइम को XR_ERROR_SPATIAL_CONTAINERS_NOT_ENABLED_EXT दिखाना ज़रूरी है.

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

  • xrCreateSpatialContainerEXT को कॉल करने से पहले, XR_EXT_spatial_container एक्सटेंशन को चालू करना ज़रूरी है
  • session एक मान्य XrSession हैंडल होना चाहिए
  • createInfo को किसी मान्य XrSpatialContainerCreateInfoEXT स्ट्रक्चर का पॉइंटर होना चाहिए
  • spatialContainer को XrSpatialContainerEXT हैंडल का पॉइंटर होना चाहिए

रिटर्न कोड

सफलता

  • 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_CONTAINERS_NOT_ENABLED_EXT
  • XR_ERROR_VALIDATION_FAILURE

स्पेशल कंटेनर बनाने के लिए, XrSpatialContainerCreateInfoEXT को xrCreateSpatialContainerEXT में पास किया जाता है.

typedef struct XrSpatialContainerCreateInfoEXT {
    XrStructureType                              type;
    const void*                                  next;
    XrSpatialContainerGraphicsPresentationEXT    graphicsPresentation;
    XrExtent3Df                                  suggestedBounds;
} XrSpatialContainerCreateInfoEXT;

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

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है. OpenXR के मुख्य वर्शन या इस एक्सटेंशन में, इस तरह के स्ट्रक्चर के बारे में नहीं बताया गया है.
  • graphicsPresentation एक XrSpatialContainerGraphicsPresentationEXT है. इससे पता चलता है कि यह स्पेशल कंटेनर, ग्राफ़िक को कैसे दिखाता है.
  • suggestedBounds एक XrExtent3Df है. इससे, स्पेसियल कंटेनर के अनुरोध किए गए डाइमेंशन की जानकारी मीटर में मिलती है.

जिस ऐप्लिकेशन के लिए साइज़ की कोई प्राथमिकता नहीं है वह suggestedBounds को {0, 0, 0} पर सेट कर सकता है. रनटाइम, अनुरोध किए गए suggestedBounds को अनदेखा कर सकता है .

ऐसा रनटाइम जो ओरिएंटेड बॉक्स के अलावा अन्य आकारों से स्पेसियल कंटेनर को सीमित करने की अनुमति देता है, उसे अन्य आकारों के आस-पास बाउंडिंग बॉक्स के तौर पर, suggestedBounds का इस्तेमाल करना चाहिए. ओरिएंटेड बॉक्स, सबसे सामान्य बाउंडिंग शेप होते हैं.

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

जब कोई स्पेशल कंटेनर इस्तेमाल करने लायक न रह जाए, तो रनटाइम को XrEventDataSpatialContainerClosedEXT इवेंट को सूची में ज़रूर जोड़ना चाहिए.

typedef struct XrEventDataSpatialContainerClosedEXT {
    XrStructureType          type;
    const void*              next;
    XrSpatialContainerEXT    spatialContainer;
} XrEventDataSpatialContainerClosedEXT;

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

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है. OpenXR के मुख्य वर्शन या इस एक्सटेंशन में, इस तरह के स्ट्रक्चर के बारे में नहीं बताया गया है.
  • spatialContainer वह XrSpatialContainerEXT है जिसके लिए यह इवेंट है.

XrEventDataSpatialContainerClosedEXT इवेंट मिलने का मतलब है कि रनटाइम अब स्पेशल कंटेनर नहीं दिखा सकता. उदाहरण के लिए, उपयोगकर्ता के "बंद करें" बटन पर क्लिक करने या सेशन के XR_SESSION_STATE_LOSS_PENDING स्टेटस में होने की वजह से ऐसा हो सकता है.

XrEventDataSpatialContainerClosedEXT इवेंट मिलने के बाद, ऐप्लिकेशन को उस स्पेशल कंटेनर का इस्तेमाल बंद कर देना चाहिए. साथ ही, उससे जुड़ी किसी भी स्थिति को खत्म कर देना चाहिए, जैसे कि रेंडर लूप. इसके अलावा, कंटेनर को भी खत्म कर देना चाहिए. रनटाइम को xrDestroySpatialContainerEXT के अलावा, उस कंटेनर पर काम करने वाले सभी फ़ंक्शन से XR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT दिखाना चाहिए .

अगर रनटाइम के दौरान, क्लोज़ इवेंट को सूची में शामिल करते समय कोई स्पेशल कंटेनर दिखता है, तो रनटाइम को सबसे पहले कंटेनर को 'नहीं दिख रहा है' पर सेट करना चाहिए. साथ ही, XrEventDataSpatialContainerVisibleChangedEXT इवेंट को सूची में शामिल करना चाहिए.

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

xrDestroySpatialContainerEXT फ़ंक्शन, किसी मौजूदा स्पेशल कंटेनर को मिटा देता है.

XrResult xrDestroySpatialContainerEXT(
    XrSpatialContainerEXT                       spatialContainer);

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

स्पेशल कंटेनर को खत्म करने के बाद, रनटाइम को कंटेनर का कॉन्टेंट नहीं दिखाना चाहिए. साथ ही, कंटेनर के बारे में कोई और इवेंट सूची में नहीं जोड़ना चाहिए.

किसी ऐप्लिकेशन को ऐसे स्पेशल कंटेनर को बंद नहीं करना चाहिए जो दिख रहा हो. ऐसा करने से, ग्राफ़िकल आर्टफ़ैक्ट दिख सकते हैं. इसके बजाय, ऐप्लिकेशन को xrRequestSpatialContainerVisibleEXT का इस्तेमाल करके, स्पेशल कंटेनर को छिपाने का अनुरोध करना चाहिए. इसके बाद, XrEventDataSpatialContainerVisibleChangedEXT इवेंट का इंतज़ार करना चाहिए और फिर कंटेनर को बंद करना चाहिए.

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

  • xrDestroySpatialContainerEXT को कॉल करने से पहले, XR_EXT_spatial_container एक्सटेंशन चालू होना ज़रूरी है
  • spatialContainer एक मान्य XrSpatialContainerEXT हैंडल होना चाहिए

Thread की सुरक्षा

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

रिटर्न कोड

सफलता

  • XR_SUCCESS

Failure

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_RUNTIME_FAILURE

स्पेशल कंटेनर स्पेस

xrCreateSpatialContainerSpaceEXT फ़ंक्शन, किसी खास स्पेशल कंटेनर के स्पेशल कंटेनर स्पेस के लिए, XrSpace हैंडल बनाता है.

XrResult xrCreateSpatialContainerSpaceEXT(
    XrSession                                   session,
    const XrSpatialContainerSpaceCreateInfoEXT* createInfo,
    XrSpace*                                    space);

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

  • session वह XrSession है जो स्पेस बनाता है.
  • createInfo, XrSpatialContainerSpaceCreateInfoEXT का पॉइंटर है. इसमें स्पेस बनाने के लिए पैरामीटर शामिल हैं.
  • space, एक हैंडल का पॉइंटर है. इसमें बनाया गया XrSpace दिखाया जाता है.

किसी भी दिए गए स्पेशल कंटेनर के लिए "स्पेशल कंटेनर स्पेस" एक कोऑर्डिनेट सिस्टम है, जिसका मूल बिंदु उस स्पेशल कंटेनर की सीमाओं के केंद्र में होता है. आम तौर पर, इस स्पेस का इस्तेमाल xrLocateSpace जैसे फ़ंक्शन के लिए बेस स्पेस के तौर पर किया जाता है.

+X, कंटेनर के दाईं ओर मौजूद फ़ेस को दिखाता है. +Y, कंटेनर के सबसे ऊपर मौजूद फ़ेस को दिखाता है. +Z, कंटेनर के सामने मौजूद फ़ेस को दिखाता है. उदाहरण के लिए, अगर कोई कंटेनर दर्शक के सामने, ग्रैविटी के हिसाब से अलाइन किया गया है और दर्शक LOCAL स्पेस के हिसाब से आइडेंटिटी पोज़ में है, तो रनटाइम को LOCAL स्पेस के हिसाब से आइडेंटिटी ओरिएंटेशन के साथ कंटेनर स्पेस को ओरिएंट करना होगा . जब कंटेनर दिखने लगता है, तब रनटाइम , LOCAL स्पेस के हिसाब से कंटेनर स्पेस के पोज़ को किसी भी पोज़ पर सेट कर सकते हैं.

ext spatial container space convention

इमेज 18. स्पेशल कंटेनर स्पेस के ऐक्सिस कन्वेंशन

स्पेशल कंटेनर स्पेस, नॉन-वर्ल्ड लॉक्ड ऑरिजिन है. इमर्सिव मोड में, जिन ऐप्लिकेशन को वर्ल्ड लॉक ओरिजिन की ज़रूरत होती है वे XR_REFERENCE_SPACE_TYPE_LOCAL जैसे वर्ल्ड लॉक स्पेस का इस्तेमाल कर सकते हैं.

रनटाइम, किसी भी समय स्पेशल कंटेनर स्पेस के पोज़ को बदल सकते हैं. आम तौर पर, ऐसा तब किया जाता है, जब उपयोगकर्ता को स्पेशल कंटेनर को किसी दूसरी पोज़िशन या रोटेशन पर ले जाना हो. XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT और XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT बाउंड मोड के बीच ट्रांज़िशन करते समय, रनटाइम भी पोज़ को बदल सकते हैं.

स्पेशल कंटेनर स्पेस को एक मान्य हैंडल बने रहना चाहिए. भले ही, उसके लिए मौजूद स्पेशल कंटेनर को xrDestroySpatialContainerEXT की मदद से खत्म कर दिया गया हो. जब कोई स्पेशल कंटेनर न दिखे या उसे मिटा दिया जाए, तो स्पेशल कंटेनर स्पेस को अन्य स्पेस के हिसाब से अनलोकेटेबल होना चाहिए. XrSpaceLocation :: locationFlags और XrViewState ::viewStateFlags की वैल्यू 0 होगी.

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

  • xrCreateSpatialContainerSpaceEXT को कॉल करने से पहले, XR_EXT_spatial_container एक्सटेंशन चालू करना ज़रूरी है
  • session एक मान्य XrSession हैंडल होना चाहिए
  • createInfo को मान्य XrSpatialContainerSpaceCreateInfoEXT स्ट्रक्चर का पॉइंटर होना ज़रूरी है
  • space को XrSpace हैंडल का पॉइंटर होना चाहिए

रिटर्न कोड

सफलता

  • 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_CONTAINER_CLOSED_EXT
  • XR_ERROR_VALIDATION_FAILURE

XrSpatialContainerSpaceCreateInfoEXT का इस्तेमाल, xrCreateSpatialContainerSpaceEXT के साथ किया जाता है, ताकि XrSpace हैंडल बनाया जा सके.

typedef struct XrSpatialContainerSpaceCreateInfoEXT {
    XrStructureType          type;
    const void*              next;
    XrSpatialContainerEXT    spatialContainer;
} XrSpatialContainerSpaceCreateInfoEXT;

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

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है. OpenXR के मुख्य वर्शन या इस एक्सटेंशन में, इस तरह के स्ट्रक्चर के बारे में नहीं बताया गया है.
  • spatialContainer एक XrSpatialContainerEXT है, जिसके लिए स्पेस बनाना है.

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

स्पेशल कंटेनर प्रज़ेंट करना

स्पेशल कंटेनर के कॉन्टेंट को OpenXR में सबमिट करने की प्रोसेस को अन्य एक्सटेंशन मैनेज करते हैं: XR_EXT_spatial_container_self_rendering .

यह एक्सटेंशन, XrSpatialContainerGraphicsPresentationEXT enum को तय करता है, ताकि अन्य एक्सटेंशन, स्पेशल कंटेनर के लिए ग्राफ़िक्स प्रज़ेंटेशन का तरीका तय कर सकें.

typedef enum XrSpatialContainerGraphicsPresentationEXT {
    XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT = 1000813000,
    XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_CONFORMANCE_AUTOMATION_EXT = 1000814000,
    XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SYSTEM_RENDERING_EXTX1 = 1000815000,
    XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialContainerGraphicsPresentationEXT;

Enum की जानकारी

XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT

स्पेशल कंटेनर, OpenXR कंपोज़िशन लेयर का इस्तेमाल करता है. इसे XR_EXT_spatial_container_self_rendering एक्सटेंशन ने जोड़ा है

XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_CONFORMANCE_AUTOMATION_EXT

स्पेशल कंटेनर को नियमों के पालन की जांच करने के लिए बनाया गया है. इसमें रेंडरिंग पाथ नहीं होता. इसे XR_EXT_spatial_container_conformance_automation एक्सटेंशन ने जोड़ा है

XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SYSTEM_RENDERING_EXTX1

स्पेशल कंटेनर, OpenXR सिस्टम रेंडरिंग का इस्तेमाल करता है. इसे XR_EXTX1_system_renderer एक्सटेंशन ने जोड़ा है

स्पेशल कंटेनर की स्थिति

स्पेशल कंटेनर की स्थिति को रनटाइम मैनेज करते हैं. यह ऐप्लिकेशन के अनुरोधों और उपयोगकर्ता की ज़रूरतों, दोनों के आधार पर तय होता है. इस वजह से, स्पेशल कंटेनर की स्थिति के हर पहलू में ये चीज़ें शामिल होती हैं:

  • जब रनटाइम को स्पेशल कंटेनर की स्थिति बदलने की अनुमति दी जाती है. स्पेशल कंटेनर की ज़्यादातर स्थितियों के लिए, रनटाइम किसी भी समय स्थिति को बदल सकते हैं.
  • कोई ऐप्लिकेशन, स्थिति में बदलाव करने का अनुरोध कैसे करता है. रनटाइम किसी भी अनुरोध को तब तक रोक सकते हैं, जब तक उन्हें यह न लगे कि अनुरोध सही है. अनुरोध को बाद में प्रोसेस करने के लिए शेड्यूल किए जाने पर, रनटाइम इवेंट को सूची में नहीं रखते हैं. इसलिए, ऐप्लिकेशन को ऐसे इवेंट के लिए, किसी अन्य लॉजिक का इंतज़ार नहीं करना चाहिए.
  • स्पेशल कंटेनर की स्थिति बदलने पर, इवेंट रनटाइम क्या सूची में जोड़ते हैं. रनटाइम, सभी बदलावों के लिए इवेंट को सूची में जोड़ता है. इनमें ऐप्लिकेशन के अनुरोध पर किए गए बदलाव और रनटाइम के दौरान किए गए बदलाव शामिल हैं. रनटाइम को ऐसे इवेंट की स्थिति में बदलाव करने के लिए सूची नहीं बनानी चाहिए जिनसे बदलाव का पता न चलता हो. जैसे, अगर कोई ऐप्लिकेशन किसी कंटेनर को छिपाने के लिए, एक के बाद एक दो अनुरोध करता है.
  • ऐप्लिकेशन में बदलाव करने का अनुरोध अस्वीकार करने पर, इवेंट रनटाइम क्या सूची में जोड़ते हैं. रनटाइम किसी भी वजह से अनुरोध को अस्वीकार कर सकते हैं. आम तौर पर, ऐसा उपयोगकर्ता अनुभव को अच्छी क्वालिटी का बनाए रखने से जुड़ी सिस्टम की नीति की वजह से होता है.

xrGetSpatialContainerStateEXT फ़ंक्शन, स्पेशल कंटेनर की मौजूदा स्थिति के बारे में क्वेरी करता है.

XrResult xrGetSpatialContainerStateEXT(
    XrSpatialContainerEXT                       spatialContainer,
    const XrSpatialContainerStateGetInfoEXT*    getInfo,
    XrSpatialContainerStateEXT*                 state);

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

  • spatialContainer, क्वेरी करने के लिए XrSpatialContainerEXT है.
  • getInfo, XrSpatialContainerStateGetInfoEXT है. इसमें वह जानकारी शामिल होती है जिसका इस्तेमाल, स्पेशल कंटेनर की स्थिति जानने के लिए किया जाता है.
  • state, XrSpatialContainerStateEXT का पॉइंटर है. इसमें, स्पेशल कंटेनर की स्थिति की जानकारी मिलती है.

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

  • xrGetSpatialContainerStateEXT को कॉल करने से पहले, XR_EXT_spatial_container एक्सटेंशन को चालू करना ज़रूरी है
  • spatialContainer एक मान्य XrSpatialContainerEXT हैंडल होना चाहिए
  • अगर getInfo, NULL नहीं है, तो getInfo को किसी मान्य XrSpatialContainerStateGetInfoEXT स्ट्रक्चर का पॉइंटर होना चाहिए
  • state को XrSpatialContainerStateEXT स्ट्रक्चर का पॉइंटर होना चाहिए

रिटर्न कोड

सफलता

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Failure

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT
  • XR_ERROR_VALIDATION_FAILURE

XrSpatialContainerStateGetInfoEXT का इस्तेमाल xrGetSpatialContainerStateEXT के साथ किया जाता है, ताकि XrSpatialContainerStateEXT के बारे में क्वेरी की जा सके.

typedef struct XrSpatialContainerStateGetInfoEXT {
    XrStructureType    type;
    const void*        next;
} XrSpatialContainerStateGetInfoEXT;

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

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है. OpenXR के मुख्य वर्शन या इस एक्सटेंशन में, इस तरह के स्ट्रक्चर के बारे में नहीं बताया गया है.

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

typedef struct XrSpatialContainerStateEXT {
    XrStructureType                    type;
    void*                              next;
    XrBool32                           visible;
    XrBool32                           interactable;
    XrSpatialContainerBoundsModeEXT    boundsMode;
} XrSpatialContainerStateEXT;

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

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है. OpenXR के मुख्य वर्शन या इस एक्सटेंशन में, इस तरह के स्ट्रक्चर के बारे में नहीं बताया गया है.
  • visible से पता चलता है कि स्पेशल कंटेनर दिख रहा है या नहीं.
  • interactable से पता चलता है कि क्या कोई स्पेशल कंटेनर फ़िलहाल किसी भी तरह का इनपुट पा सकता है. यह डेस्कटॉप 2D विंडोइंग सिस्टम के लिए "फ़ोकस" जैसा ही है. हालांकि, इसमें एक साथ कई स्पेशल कंटेनर के साथ इंटरैक्ट किया जा सकता है.
  • boundsMode, स्पेशल कंटेनर का मौजूदा XrSpatialContainerBoundsModeEXT है.

स्पेशल कंटेनर की स्थिति में होने वाले बदलावों की जानकारी, इवेंट के ज़रिए दी जाती है.

फ़ील्ड में बदलाव होने पर ट्रिगर होने वाला इवेंट

visible

XrEventDataSpatialContainerVisibleChangedEXT

interactable

XrEventDataSpatialContainerInteractableChangedEXT

boundsMode

XrEventDataSpatialContainerBoundsChangedEXT

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

किसको दिखे

ऐप्लिकेशन, xrRequestSpatialContainerVisibleEXT का इस्तेमाल करके, स्पेशल कंटेनर को दिखाने या छिपाने का अनुरोध करते हैं.

XrResult xrRequestSpatialContainerVisibleEXT(
    XrSpatialContainerEXT                       spatialContainer,
    const XrSpatialContainerVisibleRequestInfoEXT* info);

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

  • spatialContainer, XrSpatialContainerEXT है, जिसके लिए बदलाव का अनुरोध किया जाना है.
  • info, XrSpatialContainerVisibleRequestInfoEXT का पॉइंटर है. इसमें अनुरोध की गई विज़िबल स्टेट शामिल होती है.

स्पेशल कंटेनर को दिखाना या छिपाना, एक एसिंक्रोनस कार्रवाई है.

ऐप्लिकेशन को किसी स्पेशल कंटेनर को खत्म करने से पहले, उसे छिपाने का अनुरोध करना चाहिए. इससे रनटाइम को स्मूद ट्रांज़िशन दिखाने में मदद मिलती है. रनटाइम को स्पेशल कंटेनर छिपाने के अनुरोधों को स्वीकार करना चाहिए.

रनटाइम, स्पेशल कंटेनर दिखाने के अनुरोधों को अस्वीकार कर सकता है. ऐसे में, रनटाइम को XrEventDataSpatialContainerVisibleRequestDeniedEXT इवेंट को सूची में शामिल करना होगा. उदाहरण के लिए, कुछ रनटाइम, स्पेशल कंटेनर दिखाने के अनुरोध को अस्वीकार कर देंगे. ऐसा तब होगा, जब उपयोगकर्ता ने सिस्टम से मिले "छोटा करें" बटन का इस्तेमाल करके, स्पेशल कंटेनर को छिपाया हो.

रनटाइम को तब तक स्पेशल कंटेनर नहीं दिखाना चाहिए, जब तक ऐप्लिकेशन कम से कम एक बार उस स्पेशल कंटेनर को दिखाने का अनुरोध न करे. स्पेशल कंटेनर दिखाने के लिए ऐप्लिकेशन के पहले अनुरोध के बाद, रनटाइम स्पेशल कंटेनर की विज़िबिलिटी को बदल सकते हैं. यह ऐप्लिकेशन के अनुरोधों से अलग होता है. इससे ऐप्लिकेशन को, स्पेशल कंटेनर की शुरुआती स्थिति और कॉन्टेंट को कंट्रोल करने की सुविधा मिलती है. साथ ही, रनटाइम को टास्कबार जैसा सिस्टम यूज़र इंटरफ़ेस (यूआई) उपलब्ध कराने की सुविधा मिलती है. इससे उपयोगकर्ता यह चुन सकता है कि कौनसे स्पेशल कंटेनर दिखें.

रनटाइम को XrSystemSpatialContainerPropertiesEXT :: supportsBounded और XrSystemSpatialContainerPropertiesEXT :: supportsImmersive के आधार पर, स्पेसियल कंटेनर को बाउंड मोड में दिखाने के अनुरोधों को अस्वीकार करना चाहिए. ऐसा तब हो सकता है, जब डिफ़ॉल्ट बाउंड मोड XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT किसी सिस्टम के साथ काम न करता हो.

ध्यान दें

कुछ सिस्टम पर, स्पेशल कंटेनर को दिखाने या छिपाने के लिए, सिस्टम की सेवाओं के साथ कम्यूनिकेट करना ज़रूरी होता है. साथ ही, ऐसा हो सकता है कि उपयोगकर्ता के सिस्टम डायलॉग के साथ इंटरैक्ट करने के बाद ही, स्पेशल कंटेनर को दिखाया या छिपाया जाए. विज़िबिलिटी स्टेटस में बदलाव करने का अनुरोध करने के लिए, एसिंक्रोनस डिज़ाइन का इस्तेमाल किया जाता है. इससे रनटाइम को इन दोनों कार्रवाइयों को पूरा करने का समय मिलता है.

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

  • xrRequestSpatialContainerVisibleEXT को कॉल करने से पहले, XR_EXT_spatial_container एक्सटेंशन को चालू करना ज़रूरी है
  • spatialContainer एक मान्य XrSpatialContainerEXT हैंडल होना चाहिए
  • info को किसी मान्य XrSpatialContainerVisibleRequestInfoEXT स्ट्रक्चर का पॉइंटर होना ज़रूरी है

रिटर्न कोड

सफलता

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Failure

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT
  • XR_ERROR_VALIDATION_FAILURE

XrSpatialContainerVisibleRequestInfoEXT का इस्तेमाल, xrRequestSpatialContainerVisibleEXT के साथ किया जाता है, ताकि स्पेशल कंटेनर के दिखने की सेटिंग में बदलाव किया जा सके.

typedef struct XrSpatialContainerVisibleRequestInfoEXT {
    XrStructureType    type;
    const void*        next;
    XrBool32           visible;
} XrSpatialContainerVisibleRequestInfoEXT;

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

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है. OpenXR के मुख्य वर्शन या इस एक्सटेंशन में, इस तरह के स्ट्रक्चर के बारे में नहीं बताया गया है.
  • visible से पता चलता है कि स्पेशल कंटेनर को दिखाने या छिपाने का अनुरोध किया गया है या नहीं.

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

जब भी रनटाइम, किसी स्पेशल कंटेनर के दिखने की सेटिंग में बदलाव करता है, तो रनटाइम को नई स्थिति के साथ XrEventDataSpatialContainerVisibleChangedEXT इवेंट को सूची में ज़रूर जोड़ना चाहिए.

typedef struct XrEventDataSpatialContainerVisibleChangedEXT {
    XrStructureType          type;
    const void*              next;
    XrSpatialContainerEXT    spatialContainer;
    XrBool32                 visible;
} XrEventDataSpatialContainerVisibleChangedEXT;

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

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है. OpenXR के मुख्य वर्शन या इस एक्सटेंशन में, इस तरह के स्ट्रक्चर के बारे में नहीं बताया गया है.
  • spatialContainer वह XrSpatialContainerEXT है जिसके लिए यह इवेंट है.
  • visible, स्पेशल कंटेनर के लिए दिखने वाली नई स्थिति है.

यह इवेंट XR_SESSION_STATE_VISIBLE की जगह लेता है. इससे हर कंटेनर के लिए वैल्यू अलग-अलग हो सकती है. सभी बदलावों के लिए, इवेंट को सूची में शामिल करना ज़रूरी है. इनमें ऐप्लिकेशन के अनुरोध पर किए गए बदलाव और रनटाइम के दौरान किए गए बदलाव शामिल हैं.

visible को XR_TRUE पर सेट करके, इस इवेंट को सूची में शामिल करने के बाद, रनटाइम कुछ फ़्रेम के लिए कंटेनर को रेंडर करने में देरी कर सकता है. ऐसा इसलिए किया जाता है, ताकि खाली कंटेनर न दिखे और ऐप्लिकेशन को शुरुआती कॉन्टेंट सबमिट करने का समय मिल सके. इस दौरान, XrSpatialContainerStateEXT ::visible की वैल्यू XR_TRUE होगी. रनटाइम को कंटेनर रेंडर करने में 0.5 सेकंड से ज़्यादा की देरी नहीं करनी चाहिए.

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

जब भी रनटाइम, कंटेनर दिखाने के अनुरोध को अस्वीकार करता है, तो रनटाइम को XrEventDataSpatialContainerVisibleRequestDeniedEXT इवेंट को सूची में ज़रूर जोड़ना चाहिए.

typedef struct XrEventDataSpatialContainerVisibleRequestDeniedEXT {
    XrStructureType          type;
    const void*              next;
    XrSpatialContainerEXT    spatialContainer;
} XrEventDataSpatialContainerVisibleRequestDeniedEXT;

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

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है. OpenXR के मुख्य वर्शन या इस एक्सटेंशन में, इस तरह के स्ट्रक्चर के बारे में नहीं बताया गया है.
  • spatialContainer वह XrSpatialContainerEXT है जिसके लिए यह इवेंट है.

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

इंटरैक्ट किया जा सकता है

कोई ऐप्लिकेशन, स्पेशल कंटेनर को इंटरैक्टिव बनाने का अनुरोध नहीं कर सकता. कौनसे स्पेशल कंटेनर इंटरैक्टिव हैं, यह पूरी तरह से रनटाइम से कंट्रोल होता है. इंटरैक्ट किया जा सकने वाला स्पेशल कंटेनर, ज़रूरी है कि दिखे.

जब भी रनटाइम, किसी स्पेशल कंटेनर की इंटरैक्टेबल स्थिति को बदलता है, तो रनटाइम को नई स्थिति के साथ XrEventDataSpatialContainerInteractableChangedEXT इवेंट को सूची में ज़रूर जोड़ना चाहिए.

typedef struct XrEventDataSpatialContainerInteractableChangedEXT {
    XrStructureType          type;
    const void*              next;
    XrSpatialContainerEXT    spatialContainer;
    XrBool32                 interactable;
} XrEventDataSpatialContainerInteractableChangedEXT;

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

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है. OpenXR के मुख्य वर्शन या इस एक्सटेंशन में, इस तरह के स्ट्रक्चर के बारे में नहीं बताया गया है.
  • spatialContainer वह XrSpatialContainerEXT है जिसके लिए यह इवेंट है.
  • interactable, स्पेशल कंटेनर के लिए इंटरैक्ट करने की नई स्थिति है.

यह इवेंट XR_SESSION_STATE_FOCUSED की जगह लेता है. इससे हर कंटेनर के लिए वैल्यू अलग-अलग हो सकती है. इवेंट को सभी बदलावों के लिए सूची में रखा जाता है. इनमें रनटाइम के दौरान किए गए बदलाव भी शामिल हैं.

रनटाइम, किसी भी समय स्पेशल कंटेनर के साथ इंटरैक्शन को चालू या बंद कर सकते हैं. अगर रनटाइम, एक समय में ज़्यादा से ज़्यादा एक स्पेशल कंटेनर के साथ इंटरैक्ट करने की सुविधा देता है, तो रनटाइम के इंटरैक्ट करने वाले स्पेशल कंटेनर को बदलने पर, रनटाइम को उस स्पेशल कंटेनर के लिए इवेंट को सूची में ज़रूर रखना चाहिए जो इंटरैक्ट नहीं कर सकता ( interactable को false पर सेट किया गया है). ऐसा उस कंटेनर के इवेंट से पहले करना चाहिए जो इंटरैक्ट करना शुरू करता है ( interactable को true पर सेट किया गया है).

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

परिबंध

स्पेशल कंटेनर में बाउंड मोड और बाउंडिंग बॉक्स होता है. स्पेशल कंटेनर का बाउंड मोड यह बताता है कि बाउंड कैसे काम करते हैं. स्पेशल कंटेनर, इसके बाउंडिंग बॉक्स के अंदर ड्रॉ करता है.

XrSpatialContainerBoundsModeEXT एन्यूमरेशन, उन अलग-अलग मोड की पहचान करता है जिनमें स्पेशल कंटेनर की सीमाएं हो सकती हैं.

typedef enum XrSpatialContainerBoundsModeEXT {
    XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT = 1,
    XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT = 2,
    XR_SPATIAL_CONTAINER_BOUNDS_MODE_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialContainerBoundsModeEXT;

Enum की जानकारी

XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT

स्पेशियल कंटेनर बाउंडेड है. बाउंड, एक सीमित बॉक्स होता है. स्पेशल कंटेनर सिर्फ़ इस इलाके में दिखेगा.

XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT

स्पेशल कंटेनर, इमर्सिव होता है और इसकी कोई सीमा नहीं होती. स्पेशल कंटेनर, पूरी स्क्रीन पर दिखता है.

बाउंड मोड XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT में मौजूद स्पेशल कंटेनर के लिए, कुछ और ज़रूरी शर्तें होती हैं:

  • यह ज़रूरी है कि रनटाइम, इन स्पेशल कंटेनर को फ़ुल-स्क्रीन और इमर्सिव ऐप्लिकेशन की तरह ही ट्रीट करें. ये ऐसे ऐप्लिकेशन होते हैं जिन्हें स्पेशल कंटेनर का इस्तेमाल किए बिना बनाया जाता है. हालांकि, सेशन की स्थिति में बदलाव में बताए गए व्यवहार में बदलावों को छोड़कर, रनटाइम को इन स्पेशल कंटेनर को फ़ुल-स्क्रीन और इमर्सिव ऐप्लिकेशन की तरह ही ट्रीट करना चाहिए.
  • रनटाइम में अतिरिक्त एक्सटेंशन हो सकते हैं. इनकी मदद से, इमर्सिव स्पेशल कंटेनर, फ़ुल-स्क्रीन और इमर्सिव ऐप्लिकेशन से अलग तरीके से काम कर सकते हैं. ये ऐप्लिकेशन, इस एक्सटेंशन के बिना बनाए जाते हैं.
  • रनटाइम को इन स्पेशल कंटेनर के लिए, इनफ़ाइनाइट बाउंड की जानकारी ज़रूर देनी चाहिए.
  • इमर्सिव स्पेशल कंटेनर दिखने के दौरान, रनटाइम अन्य स्पेशल कंटेनर को छिपा सकते हैं. हर रनटाइम के हिसाब से यह अलग हो सकता है. इसलिए, ऐप्लिकेशन को इस बात पर निर्भर नहीं रहना चाहिए कि इमर्सिव स्पेशल कंटेनर के दिखने के आधार पर, स्पेशल कंटेनर अपने-आप दिखेंगे या छिप जाएंगे. दिखने वाली अन्य सभी स्थितियों में होने वाले बदलावों की तरह, रनटाइम को XrEventDataSpatialContainerVisibleChangedEXT इवेंट को सूची में शामिल करना चाहिए. ऐसा तब करना चाहिए, जब इमर्सिव कंटेनर दिखने की वजह से, स्पेशल कंटेनर छिपा हो.

ध्यान दें

ऊपर बताई गई ज़रूरी शर्तों का मतलब है कि सभी रनटाइम, इस एक्सटेंशन के बिना OpenXR 1.x पाथ को लागू कर सकते हैं. इसके लिए, उन्हें इंप्लिसिट तरीके से एक स्पेशल कंटेनर बनाना होगा, कंटेनर के बाउंड मोड को इमर्सिव पर सेट करना होगा, और उसे दिखने के लिए अनुरोध करना होगा.

ऐप्लिकेशन, xrRequestSpatialContainerBoundsModeEXT का इस्तेमाल करके, स्पेशल कंटेनर के बाउंड मोड को बदलने का अनुरोध करते हैं.

XrResult xrRequestSpatialContainerBoundsModeEXT(
    XrSpatialContainerEXT                       spatialContainer,
    const XrSpatialContainerBoundsModeRequestInfoEXT* info);

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

  • spatialContainer, XrSpatialContainerEXT है, जिसके लिए बदलाव का अनुरोध किया जाना है.
  • info, XrSpatialContainerBoundsModeRequestInfoEXT का पॉइंटर है. इसमें अनुरोध किया गया बाउंड मोड शामिल होता है.

स्पेशल कंटेनर के बाउंड मोड को बदलना, एक एसिंक्रोनस कार्रवाई है. साथ ही, ऐप्लिकेशन के बदलाव का अनुरोध करने के कई सेकंड बाद, रनटाइम किसी बदलाव या अस्वीकार किए गए इवेंट को सूची में डाल सकते हैं. इससे रनटाइम को यूज़र इंटरफ़ेस (यूआई) पॉप-अप करने की अनुमति मिलती है. यह यूज़र इंटरफ़ेस (यूआई), उपयोगकर्ता को सुरक्षित तरीके से इमर्सिव मोड में जाने की अनुमति देने के लिए ज़रूरी है.

रनटाइम को, न दिखने वाले स्पेशल कंटेनर के लिए बाउंड मोड बदलने के अनुरोध को ज़रूर स्वीकार करना चाहिए. अगर रनटाइम, न दिखने वाले कंटेनर के लिए बाउंड मोड के अनुरोध को अस्वीकार कर देता है, तो वह ऐसे स्पेशल कंटेनर को दिखाने के अनुरोध को अस्वीकार या रोक सकता है. इससे ऐप्लिकेशन, कंटेनर को इमर्सिव कंटेनर के तौर पर शुरू कर सकते हैं. रनटाइम, दिखने वाले स्पेशल कंटेनर के बाउंड मोड को बदलने के अनुरोधों को अस्वीकार कर सकता है. ऐसे में, रनटाइम को XrEventDataSpatialContainerBoundsModeRequestDeniedEXT इवेंट को सूची में शामिल करना होगा. उदाहरण के लिए, कुछ रनटाइम, विज़िबल स्पेशल कंटेनर के बाउंड मोड को बदलने के अनुरोध को अस्वीकार कर देंगे. ऐसा तब होगा, जब उपयोगकर्ता उस कंटेनर के साथ ऐक्टिव तरीके से इंटरैक्ट न कर रहा हो.

अगर कोई ऐप्लिकेशन, XrSystemSpatialContainerPropertiesEXT :: supportsBounded और XrSystemSpatialContainerPropertiesEXT :: supportsImmersive के आधार पर, काम न करने वाले बाउंड मोड का अनुरोध करता है, तो रनटाइम को XR_ERROR_VALIDATION_FAILURE दिखाना चाहिए.

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

रिटर्न कोड

सफलता

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Failure

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT
  • XR_ERROR_VALIDATION_FAILURE

XrSpatialContainerBoundsModeRequestInfoEXT का इस्तेमाल, xrRequestSpatialContainerBoundsModeEXT के साथ किया जाता है. इससे स्पेशल कंटेनर के बाउंड मोड को बदला जाता है.

typedef struct XrSpatialContainerBoundsModeRequestInfoEXT {
    XrStructureType                    type;
    const void*                        next;
    XrSpatialContainerBoundsModeEXT    boundsMode;
} XrSpatialContainerBoundsModeRequestInfoEXT;

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

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है. OpenXR के मुख्य वर्शन या इस एक्सटेंशन में, इस तरह के स्ट्रक्चर के बारे में नहीं बताया गया है.
  • boundsMode, स्पेशल कंटेनर के लिए ज़रूरी XrSpatialContainerBoundsModeEXT है.

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

जब भी रनटाइम, किसी स्पेशल कंटेनर की सीमाओं या बाउंड मोड में बदलाव करता है, तो रनटाइम को नई सीमाओं की जानकारी के साथ XrEventDataSpatialContainerBoundsChangedEXT इवेंट को सूची में शामिल करना होगा.

typedef struct XrEventDataSpatialContainerBoundsChangedEXT {
    XrStructureType                    type;
    const void*                        next;
    XrSpatialContainerEXT              spatialContainer;
    XrExtent3Df                        bounds;
    XrBool32                           infiniteBounds;
    XrSpatialContainerBoundsModeEXT    boundsMode;
} XrEventDataSpatialContainerBoundsChangedEXT;

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

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है. OpenXR के मुख्य वर्शन या इस एक्सटेंशन में, इस तरह के स्ट्रक्चर के बारे में नहीं बताया गया है.
  • spatialContainer वह XrSpatialContainerEXT है जिसके लिए यह इवेंट है.
  • bounds, स्पेशल कंटेनर की सीमाओं की नई चौड़ाई, ऊंचाई, और गहराई है.
  • अगर कंटेनर की कोई सीमा नहीं है, तो infiniteBounds की वैल्यू 'सही' होगी.
  • boundsMode, स्पेशल कंटेनर का नया XrSpatialContainerBoundsModeEXT है.

इवेंट को सभी बदलावों के लिए सूची में रखा जाता है. इनमें ऐप्लिकेशन से अनुरोध किए गए बदलाव और रनटाइम के दौरान शुरू किए गए बदलाव शामिल हैं.

जब कोई उपयोगकर्ता किसी स्पेशल कंटेनर का साइज़ बदल रहा हो, तब रनटाइम को इनमें से किसी एक तरीके से काम करना चाहिए:

  • कई इवेंट को सूची में जोड़ें. ऐसा हो सकता है कि ये इवेंट फ़्रेमरेट पर हों, क्योंकि उपयोगकर्ता स्पेशल कंटेनर का साइज़ बदल रहा है
  • साइज़ बदलने के बाद, एक इवेंट को सूची में जोड़ें

अगर कोई रनटाइम, साइज़ बदलने के आखिर में सिर्फ़ एक इवेंट को सूची में जोड़ता है, तो उस रनटाइम को xrGetSpatialContainerBoundsEXT से पुरानी सीमाओं की जानकारी तब तक देनी चाहिए, जब तक कि रनटाइम, साइज़ बदलने वाले इवेंट को सूची में नहीं जोड़ता. रनटाइम को, पोल न किए गए कई बाउंड के बदले गए इवेंट को ज़रूर मर्ज करना चाहिए. दूसरे शब्दों में, अगर XrEventDataSpatialContainerBoundsChangedEXT इवेंट के सूची में होने के दौरान, बाउंड या बाउंड मोड में बदलाव होता है, तो रनटाइम को सिर्फ़ एक इवेंट की रिपोर्ट करनी चाहिए. इसमें, बाउंड में हुआ आखिरी बदलाव शामिल होना चाहिए. ऐप्लिकेशन, xrGetSpatialContainerBoundsEXT का इस्तेमाल करके, सीधे तौर पर भी स्पेशल कंटेनर के बाउंड को पोल कर सकते हैं. इसलिए, इवेंट से बाउंड में होने वाले बदलावों की संख्या, पोलिंग से होने वाले बदलावों की संख्या से अलग हो सकती है. ऐसा रनटाइम के दौरान जनरेट किए गए बाउंड में होने वाले बदलावों के समय, xrPollEvent पर ऐप्लिकेशन के कॉल, और xrGetSpatialContainerBoundsEXT पर ऐप्लिकेशन के कॉल के आधार पर होता है.

स्पेशल कंटेनर की सीमाएं बदलने पर, स्पेशल कंटेनर का लोकल ऑरिजिन भी बदल सकता है. उदाहरण के लिए, अगर कोई रनटाइम किसी उपयोगकर्ता को स्पेशल कंटेनर के किनारों में से किसी एक को खींचकर, उसके बाउंड का साइज़ बदलने की अनुमति देता है, तो उपयोगकर्ता के किसी एक किनारे को खींचने पर, उस कंटेनर के बाउंड और लोकल ऑरिजिन में बदलाव हो जाएगा. ऐसी स्थितियों में, रनटाइम को बाउंड और लोकल ऑरिजिन को एक साथ बदलना चाहिए.

रनटाइम के लिए, infiniteBounds को XR_TRUE पर सेट करना ज़रूरी है. साथ ही, अनंत सीमाओं को दिखाने के लिए चौड़ाई, ऊंचाई, और गहराई को 0.0 पर सेट करना ज़रूरी है. रनटाइम के लिए, infiniteBounds को XR_FALSE पर सेट करना ज़रूरी है. साथ ही, चौड़ाई, ऊंचाई, और गहराई को सीमित सीमाओं के लिए सीमित पॉज़िटिव नंबर पर सेट करना ज़रूरी है.

रनटाइम को bounds और infiniteBounds को सेट करना ज़रूरी है. इसके लिए, XrSpatialContainerBoundsEXT के लिए तय किए गए नियमों का पालन करना होगा.

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

जब भी रनटाइम, किसी कंटेनर के बाउंड मोड को बदलने के अनुरोध को अस्वीकार करता है, तो रनटाइम को XrEventDataSpatialContainerBoundsModeRequestDeniedEXT इवेंट को सूची में जोड़ना चाहिए.

typedef struct XrEventDataSpatialContainerBoundsModeRequestDeniedEXT {
    XrStructureType          type;
    const void*              next;
    XrSpatialContainerEXT    spatialContainer;
} XrEventDataSpatialContainerBoundsModeRequestDeniedEXT;

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

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है. OpenXR के मुख्य वर्शन या इस एक्सटेंशन में, इस तरह के स्ट्रक्चर के बारे में नहीं बताया गया है.
  • spatialContainer वह XrSpatialContainerEXT है जिसके लिए यह इवेंट है.

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

XrSpatialContainerBoundsEXT स्ट्रक्चर, किसी स्पेशल कंटेनर के बाउंडिंग बॉक्स के बारे में बताता है.

typedef struct XrSpatialContainerBoundsEXT {
    XrStructureType    type;
    void*              next;
    XrExtent3Df        bounds;
    XrBool32           infiniteBounds;
} XrSpatialContainerBoundsEXT;

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

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है. OpenXR के मुख्य वर्शन या इस एक्सटेंशन में, इस तरह के स्ट्रक्चर के बारे में नहीं बताया गया है.
  • bounds, स्पेशल कंटेनर की सीमाओं की चौड़ाई, ऊंचाई, और गहराई है. बाउंड्री मीटर में होती हैं.
  • अगर कंटेनर की कोई सीमा नहीं है, तो infiniteBounds की वैल्यू 'सही' होगी.

रनटाइम के लिए, infiniteBounds को XR_TRUE पर सेट करना ज़रूरी है. साथ ही, अनंत सीमाओं को दिखाने के लिए चौड़ाई, ऊंचाई, और गहराई को 0.0 पर सेट करना ज़रूरी है. रनटाइम के लिए, infiniteBounds को XR_FALSE पर सेट करना ज़रूरी है. साथ ही, चौड़ाई, ऊंचाई, और गहराई को सीमित सीमाओं के लिए सीमित पॉज़िटिव नंबर पर सेट करना ज़रूरी है.

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

xrGetSpatialContainerBoundsEXT फ़ंक्शन, किसी स्पेशल कंटेनर की मौजूदा सीमाओं के बारे में क्वेरी करता है.

XrResult xrGetSpatialContainerBoundsEXT(
    XrSpatialContainerEXT                       spatialContainer,
    const XrSpatialContainerBoundsGetInfoEXT*   getInfo,
    XrSpatialContainerBoundsEXT*                bounds);

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

  • spatialContainer, क्वेरी करने के लिए XrSpatialContainerEXT है.
  • getInfo, XrSpatialContainerBoundsGetInfoEXT है. इसमें मौजूद जानकारी का इस्तेमाल, स्पेशल कंटेनर की स्थिति जानने के लिए किया जाता है.
  • bounds, XrSpatialContainerBoundsEXT का एक पॉइंटर है, जिसमें बाउंड दिखाए जाते हैं.

स्पेशल कंटेनर की सीमाएं तय होती हैं. इसलिए, इसकी सीमाएं अनंत नहीं होनी चाहिए. वहीं, स्पेशल कंटेनर इमर्सिव होता है. इसलिए, इसकी सीमाएं अनंत होनी चाहिए.

रनटाइम, स्पेशल कंटेनर की सीमाओं को किसी भी समय किसी भी पॉज़िटिव फ़ाइनाइट वैल्यू में बदल सकते हैं. ऐसा तब किया जा सकता है, जब स्पेशल कंटेनर की सीमाएं तय हों. स्पेशल कंटेनर की सीमाओं में होने वाले बदलावों की जानकारी, XrEventDataSpatialContainerBoundsChangedEXT के ज़रिए दी जाती है.

इस एक्सटेंशन की मदद से, कोई ऐप्लिकेशन बाउंड में बदलाव करने का अनुरोध नहीं कर सकता. हालांकि, xrRequestSpatialContainerBoundsModeEXT का इस्तेमाल करके, बाउंड और इमर्सिव मोड के बीच स्विच किया जा सकता है. आने वाले समय में, अन्य एक्सटेंशन भी ऐसा तरीका उपलब्ध करा सकते हैं.

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

  • xrGetSpatialContainerBoundsEXT को कॉल करने से पहले, XR_EXT_spatial_container एक्सटेंशन को चालू करना ज़रूरी है
  • spatialContainer एक मान्य XrSpatialContainerEXT हैंडल होना चाहिए
  • अगर getInfo की वैल्यू NULL नहीं है, तो getInfo को मान्य XrSpatialContainerBoundsGetInfoEXT स्ट्रक्चर का पॉइंटर होना चाहिए
  • bounds को XrSpatialContainerBoundsEXT स्ट्रक्चर का पॉइंटर होना चाहिए

रिटर्न कोड

सफलता

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Failure

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT
  • XR_ERROR_VALIDATION_FAILURE

XrSpatialContainerBoundsGetInfoEXT स्ट्रक्चर, एक इनपुट स्ट्रक्चर है. इसे आने वाले समय में एक्सटेंशन के लिए इस्तेमाल किया जा सकता है.

typedef struct XrSpatialContainerBoundsGetInfoEXT {
    XrStructureType    type;
    const void*        next;
} XrSpatialContainerBoundsGetInfoEXT;

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

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है. OpenXR के मुख्य वर्शन या इस एक्सटेंशन में, इस तरह के स्ट्रक्चर के बारे में नहीं बताया गया है.

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

XrSpatialContainerVolumeClippingEXT एन्यूमरेशन, स्पेशल कंटेनर के लिए अलग-अलग वॉल्यूम क्लिपिंग व्यवहार की पहचान करता है.

typedef enum XrSpatialContainerVolumeClippingEXT {
    XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_NONE_EXT = 0,
    XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT = 1,
    XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialContainerVolumeClippingEXT;

Enum की जानकारी

XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_NONE_EXT

स्पेशल कंटेनर के बाउंडिंग वॉल्यूम में कोई कॉन्टेंट क्लिप नहीं किया गया है. कॉन्टेंट को स्पेशल कंटेनर की सीमाओं के बाहर भी ड्रॉ किया जा सकता है.

XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT

कॉन्टेंट को स्पेशल कंटेनर के बाउंडिंग वॉल्यूम के हिसाब से ही क्लिप किया जाता है.

इस एक्सटेंशन में, इस एन्यूमरेशन का कोई इस्तेमाल नहीं है. इसे इसलिए तय किया गया है, ताकि अन्य एक्सटेंशन अपनी पसंद के मुताबिक वॉल्यूम क्लिपिंग की सुविधा तय कर सकें. उदाहरण के लिए, ऐसा हो सकता है कि कोई ऐप्लिकेशन चाहता हो कि वह किसी बाउंडेड स्पेशल कंटेनर के लिए बैकग्राउंड ड्रॉ करे. मोनोक्युलर क्यूबमैप, बैकग्राउंड तय करने का एक आसान तरीका है. हालांकि, मोनोक्युलर क्यूबमैप को सैद्धांतिक तौर पर अनंत दूरी पर रखा जाता है, जो कंटेनर के बाहर होता है.

सिस्टम की क्षमताएं

xrGetSystemProperties को कॉल करते समय, XrSystemProperties में XrSystemSpatialContainerPropertiesEXT स्ट्रक्चर को जोड़कर, कोई ऐप्लिकेशन सिस्टम की क्षमताओं की जांच कर सकता है.

typedef struct XrSystemSpatialContainerPropertiesEXT {
    XrStructureType    type;
    void*              next;
    uint32_t           maxSpatialContainerCount;
    XrBool32           supportsBounded;
    XrBool32           supportsImmersive;
} XrSystemSpatialContainerPropertiesEXT;

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

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है. OpenXR के मुख्य वर्शन या इस एक्सटेंशन में, इस तरह के स्ट्रक्चर के बारे में नहीं बताया गया है.
  • ज़्यादा से ज़्यादा maxSpatialContainerCount स्पेशल कंटेनर बनाए जा सकते हैं.
  • अगर स्पेशल कंटेनर को बाउंड किया जा सकता है, तो supportsBounded की वैल्यू 'सही है' होगी.
  • अगर स्पेशल कंटेनर को इमर्सिव होने की अनुमति है, तो supportsImmersive की वैल्यू 'सही है' पर सेट होती है.

इस एक्सटेंशन के साथ काम करने वाले रनटाइम को, कई स्पेशल कंटेनर बनाने वाले ऐप्लिकेशन के साथ काम करना चाहिए. हालांकि, यह मेमोरी के बंटवारे पर निर्भर करता है. एक साथ दिखाए जाने वाले स्पेशल कंटेनर की संख्या के लिए, रनटाइम की सीमा अलग हो सकती है. इस एक्सटेंशन में, एक साथ दिखाए जाने वाले कंटेनर की संख्या के बारे में क्वेरी करने का कोई तरीका नहीं है. इसकी वजह यह है कि रनटाइम, सभी चालू ऐप्लिकेशन की स्थिति के आधार पर अलग-अलग ऐप्लिकेशन को सीमित कर सकता है. यह माना जाता है कि ज़्यादा पाबंदी वाले डिवाइसों और कम पाबंदी वाले डिवाइसों के लिए, एक साथ दिखाए जाने वाले कंटेनर की संख्या की सीमाएं अलग-अलग होंगी. ज़्यादा पाबंदी वाले डिवाइसों पर, एक समय में सिर्फ़ एक स्पेशल कंटेनर दिखाया जा सकता है. वहीं, कम पाबंदी वाले डिवाइसों पर, एक साथ कई स्पेशल कंटेनर दिखाए जा सकते हैं. हालांकि, यह रेंडरिंग कंप्यूट की सीमाओं पर निर्भर करता है.

इस एक्सटेंशन के साथ काम करने वाले रनटाइम के लिए, यह ज़रूरी है कि वे बाउंडेड स्पेशल कंटेनर या इमर्सिव स्पेशल कंटेनर में से कम से कम एक के साथ काम करें.

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

xrEnumerateSupportedSpatialContainerGraphicsPresentationsEXT फ़ंक्शन, सिस्टम पर काम करने वाले ग्राफ़िक्स प्रज़ेंटेशन के तरीके दिखाता है.

XrResult xrEnumerateSupportedSpatialContainerGraphicsPresentationsEXT(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    uint32_t                                    graphicsPresentationCapacityInput,
    uint32_t*                                   graphicsPresentationCountOutput,
    XrSpatialContainerGraphicsPresentationEXT*  graphicsPresentations);

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

  • instance वह XrInstance है जिससे systemId को वापस लाया गया था.
  • systemId वह XrSystemId है जिसके बारे में क्वेरी की जा रही है.
  • graphicsPresentationCapacityInput, graphicsPresentations कलेक्शन की क्षमता है. इसके अलावा, ज़रूरी क्षमता को वापस पाने के अनुरोध को दिखाने के लिए, 0 का इस्तेमाल किया जाता है.
  • graphicsPresentationCountOutput, लिखे गए ग्राफ़िक्स प्रज़ेंटेशन की संख्या का पॉइंटर है. इसके अलावा, अगर graphicsPresentationCapacityInput की वैल्यू 0 है, तो यह ज़रूरी क्षमता का पॉइंटर है.
  • graphicsPresentations, XrSpatialContainerGraphicsPresentationEXT वैल्यू के कलेक्शन का पॉइंटर है. हालांकि, अगर graphicsPresentationCapacityInput की वैल्यू 0 है, तो यह null हो सकता है.
  • ज़रूरी graphicsPresentations साइज़ को वापस पाने के बारे में ज़्यादा जानकारी के लिए, बफ़र साइज़ पैरामीटर सेक्शन देखें.

दिए गए systemId और इंस्टेंस के लाइफ़टाइम के लिए, रनटाइम को इस सूची से हमेशा एक जैसे बफ़र कॉन्टेंट दिखाने चाहिए.

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

  • xrEnumerateSupportedSpatialContainerGraphicsPresentationsEXT को कॉल करने से पहले, XR_EXT_spatial_container एक्सटेंशन को चालू करना ज़रूरी है
  • instance एक मान्य XrInstance हैंडल होना ज़रूरी है
  • graphicsPresentationCountOutput को uint32_t वैल्यू का पॉइंटर होना चाहिए
  • अगर graphicsPresentationCapacityInput की वैल्यू 0 नहीं है, तो graphicsPresentations को graphicsPresentationCapacityInput XrSpatialContainerGraphicsPresentationEXT वैल्यू के कलेक्शन का पॉइंटर होना चाहिए

रिटर्न कोड

सफलता

  • 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

सेशन की स्थिति में बदलाव

xrCreateSession को कॉल करते समय, XrSessionCreateInfoSpatialContainersEXT को चेन करके, किसी सेशन के लिए स्पेशल कंटेनर की सुविधा चालू की जाती है.

typedef struct XrSessionCreateInfoSpatialContainersEXT {
    XrStructureType    type;
    const void*        next;
} XrSessionCreateInfoSpatialContainersEXT;

स्पेशल कंटेनर की सुविधा चालू होने पर, XrSession अलग तरह से काम करता है. ऐसा इसलिए होता है, क्योंकि स्पेशल कंटेनर का इस्तेमाल करने पर, सेशन अब डिसप्ले पर इमेज कॉन्टेंट नहीं दिखाता है. इसके बजाय, स्पेशल कंटेनर ऐसा करते हैं. इसलिए, जब यह एक्सटेंशन चालू होता है, तो सेशन "हेडलेस" होता है. बिना यूज़र इंटरफ़ेस वाले अन्य एक्सटेंशन के उलट, ऐप्लिकेशन स्पेशल कंटेनर के ज़रिए इमेज डेटा सबमिट कर सकते हैं.

स्पेशल कंटेनर की सुविधा चालू करने से, OpenXR के मुख्य एपीआई में इस तरह बदलाव होता है.

रनटाइम: सिस्टम या डिवाइस का ऐक्सेस खोना

रनटाइम: सिस्टम या डिवाइस का ऐक्सेस खोना

xrDestroySession

xrDestroySession

IDLE
(चल रहा है)

कुछ समय से इस्तेमाल में नहीं है...

xrGetSystem
xrCreateSession

xrGetSystem...

xrCreateInstance

xrCreateIn...

xrDestroySession

xrDestroySession

LOSS_PENDING
(नहीं चल रहा है)

नुकसान की भरपाई की प्रक्रिया जारी है...

xrDestroyInstance

xrDestroyInstance

ऐप्लिकेशन: ज़रूरी नहीं
एक्सआर को फिर से लॉन्च करें

ऐप्लिकेशन: ज़रूरी नहीं...

इमेज 19. नए सेशन की स्टेट मशीन

  • सेशन कभी भी XR_SESSION_STATE_VISIBLE , XR_SESSION_STATE_FOCUSED या XR_SESSION_STATE_EXITING स्टेटस में नहीं जाता. रनटाइम को इन स्थितियों के लिए, इवेंट को कभी भी सूची में नहीं रखना चाहिए. इन स्थितियों को हर स्पेशल कंटेनर इवेंट XrEventDataSpatialContainerVisibleChangedEXT , XrEventDataSpatialContainerInteractableChangedEXT , और XrEventDataSpatialContainerClosedEXT से बदल दिया जाता है.
  • सेशन कभी भी XR_SESSION_STATE_READY , XR_SESSION_STATE_SYNCHRONIZED , XR_SESSION_STATE_STOPPING स्टेटस में नहीं जाता. रनटाइम को इन स्थितियों के लिए, इवेंट को कभी भी सूची में नहीं रखना चाहिए. इन स्थितियों के लिए कोई विकल्प नहीं है.
  • रनटाइम को सेशन को तब चालू मानना चाहिए, जब वह XR_SESSION_STATE_IDLE स्थिति में हो.
  • रनटाइम को सेशन को फ़ोकस में रखना चाहिए, जब वह XR_SESSION_STATE_IDLE स्थिति में हो और कम से कम एक ऐसा स्पेशल कंटेनर मौजूद हो जिससे इंटरैक्ट किया जा सके.
  • अब xrBeginSession और xrEndSession फ़ंक्शन की ज़रूरत नहीं है. इन फ़ंक्शन को कॉल करने पर, रनटाइम को XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXT ज़रूर दिखाना चाहिए. ऐसा हो सकता है कि अन्य एक्सटेंशन इन फ़ंक्शन के विकल्प उपलब्ध कराएं.
  • xrRequestExitSession फ़ंक्शन की भी अब ज़रूरत नहीं है. इस फ़ंक्शन को कॉल करने पर, रनटाइम को XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXT दिखाना ज़रूरी है. इसके बजाय, जो ऐप्लिकेशन चल रहे सेशन से बाहर निकलना चाहते हैं वे अपने कंटेनर छिपाने के लिए, xrRequestSpatialContainerVisibleEXT को कॉल कर सकते हैं. साथ ही, सभी कंटेनर दिखने बंद होने के बाद, सेशन को खत्म कर सकते हैं.
  • सेशन शुरू होने पर, अतिरिक्त इवेंट को सूची में जोड़ने वाले एक्सटेंशन को अब सेशन बनाने के बाद, उन इवेंट को सूची में ज़रूर जोड़ना चाहिए. ऐसे एक्सटेंशन के बारे में यहां बताया गया है.

    एक्सटेंशन इवेंट

XR_EXT_user_presence

XrEventDataUserPresenceChangedEXT

XR_META_boundary_visibility

XrEventDataBoundaryVisibilityChangedMETA

  • सेशन के लिए, xrLocateViews फ़ंक्शन को कॉल नहीं किया जा सकता. रनटाइम को xrLocateViews से XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXT को ज़रूर रिटर्न करना चाहिए. अन्य एक्सटेंशन, किसी खास स्पेशल कंटेनर के व्यू ढूंढने के तरीके उपलब्ध करा सकते हैं.
  • xrWaitFrame फ़ंक्शन को हमेशा XrFrameState :: shouldRender को false पर सेट करना चाहिए. अन्य एक्सटेंशन से यह जानने के तरीके मिल सकते हैं कि किसी खास स्पेशल कंटेनर को अपनी कंपोज़िशन लेयर अपडेट करनी चाहिए या नहीं.
  • xrEndFrame फ़ंक्शन, कंपोज़िशन लेयर सबमिट करने का सही तरीका नहीं है. अगर कोई ऐप्लिकेशन XrFrameEndInfo :: layerCount को शून्य के अलावा किसी अन्य वैल्यू पर सेट करता है, तो रनटाइम को XR_ERROR_VALIDATION_FAILURE दिखाना चाहिए . अन्य एक्सटेंशन, किसी खास स्पेशल कंटेनर के लिए कंपोज़िशन लेयर सबमिट करने के तरीके उपलब्ध करा सकते हैं.
  • XR_SESSION_STATE_LOSS_PENDING स्टेट में जाने पर, सभी स्पेशल कंटेनर भी बंद हो जाते हैं. XR_SESSION_STATE_LOSS_PENDING के लिए सेशन की स्थिति में बदलाव को सूची में शामिल करने से पहले, रनटाइम को हर चालू स्पेशल कंटेनर के लिए, XrEventDataSpatialContainerClosedEXT इवेंट को सूची में शामिल करना ज़रूरी है.
  • xrCreateSession फ़ंक्शन को अब ग्राफ़िक्स एपीआई बाइंडिंग स्ट्रक्चर की ज़रूरत नहीं है. अन्य एक्सटेंशन के लिए, ग्राफ़िक्स बाइंडिंग की ज़रूरत पड़ सकती है. उदाहरण के लिए, ग्राफ़िक्स एपीआई का इस्तेमाल करके रेंडर करने के लिए, स्पेशल कंटेनर की ज़रूरत पड़ सकती है.

ऊपर बताया गया व्यवहार, XR_MND_headless में बताए गए व्यवहार से थोड़ा अलग है. अगर किसी सेशन के लिए स्पेशल कंटेनर की सुविधा चालू है, तो रनटाइम को XR_MND_headless से हेडलेस सेशन की सुविधा चालू नहीं करनी चाहिए.

ध्यान दें

स्पेशल कंटेनर चालू होने पर, सेशन सिर्फ़ दो स्थितियों के बीच ट्रांज़िशन करता है: XR_SESSION_STATE_IDLE (चल रहा है) और XR_SESSION_STATE_LOSS_PENDING (नहीं चल रहा है). इस वजह से, रनटाइम अब XR_ERROR_SESSION_RUNNING या XR_ERROR_SESSION_NOT_RUNNING नहीं दिखाते. इसके बजाय, जब कोई सेशन नहीं चल रहा होता है, तब रनटाइम, OpenXR कोर के नियमों के मुताबिक XR_ERROR_SESSION_LOST या XR_SESSION_LOSS_PENDING दिखाता है. इसके अलावा, xrBeginSession ही एक ऐसा फ़ंक्शन है जो XR_ERROR_SESSION_RUNNING दिखाता है. अब यह हमेशा XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXT दिखाएगा.

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

Android मेनिफ़ेस्ट एंट्री

एओएसपी पर आधारित रनटाइम में, कस्टम व्यवहार हो सकता है. यह व्यवहार, शुरुआती स्पेशल कंटेनर की स्थिति पर आधारित होता है. यह स्थिति, किसी भी ऐप्लिकेशन कोड को चलाने से पहले शुरू होती है. उदाहरण के लिए, रनटाइम की वजह से, गतिविधि के लिए असाइन किए गए संसाधनों, लॉन्च ऐनिमेशन या स्प्लैश स्क्रीन के डिसप्ले में बदलाव हो सकता है. इस मकसद के लिए, ये प्रॉपर्टी दी गई हैं. ये <category android:name="org.khronos.openxr.intent.category.IMMERSIVE_HMD" /> टैग की जगह लेते हैं. स्पेशल कंटेनर पर आधारित ऐप्लिकेशन को इस टैग का इस्तेमाल नहीं करना चाहिए. हालांकि, अगर उन्हें एओएसपी पर आधारित पुराने रनटाइम के साथ काम करना है, तो वे इसका इस्तेमाल कर सकते हैं.

<property android:name="org.khronos.openxr.PROPERTY_ACTIVITY_HINT_XR_SPATIAL_CONTAINER_USED_BOUNDS_MODES"
          android:value="list of modes" />

यह प्रॉपर्टी, रनटाइम को बताती है कि किसी गतिविधि के लिए, बाउंड मोड का इस्तेमाल किया गया है. डिफ़ॉल्ट रूप से, यह एक खाली सूची होती है. इसका मतलब है कि कोई हिंट नहीं दिया गया है.

इस एट्रिब्यूट के लिए, ये स्ट्रिंग मान्य हैं. एक से ज़्यादा वैल्यू को | से अलग किया जाता है, जैसे कि "bounded|immersive" .

वैल्यू

ब्यौरा

"2d_panel"

गतिविधि, Android के 2D व्यू फ़्रेमवर्क का इस्तेमाल करके दिखती है.

"bounded"

इस गतिविधि के लिए XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT का इस्तेमाल किया गया है.

"immersive"

इस गतिविधि के लिए XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT का इस्तेमाल किया गया है.

<property android:name="org.khronos.openxr.PROPERTY_ACTIVITY_HINT_XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE"
          android:value="XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_BOUNDED|
                         XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_IMMERSIVE|
                         XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_UNDEFINED" />

यह प्रॉपर्टी, रनटाइम को गतिविधि के शुरुआती XrSpatialContainerBoundsModeEXT के बारे में बताती है. ऐसा तब होता है, जब इसे पहली बार बनाया जाता है. डिफ़ॉल्ट रूप से, यह XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_UNDEFINED स्ट्रिंग होती है. इसका मतलब है कि कोई हिंट नहीं है.

रनटाइम के लिए यह ज़रूरी नहीं है कि ऐप्लिकेशन में ये प्रॉपर्टी मौजूद हों. ऐसा इसलिए, क्योंकि ऐप्लिकेशन को इस स्पेसिफ़िकेशन के मुताबिक काम करना होता है. रनटाइम को इन प्रॉपर्टी के आधार पर, ऐप्लिकेशन के दिखने वाले व्यवहार में बदलाव नहीं करना चाहिए. इस तरह के सभी मेटाडेटा को <activity> लेवल या <application> लेवल पर तय किया जाना ज़रूरी है. अगर इसे <application> लेवल पर तय किया जाता है, तो यह ऐप्लिकेशन की उन सभी गतिविधियों पर लागू होता है जिनकी वैल्यू तय नहीं की गई हैं.

कोड का उदाहरण

यहां दिए गए कोड से पता चलता है कि इस एक्सटेंशन का इस्तेमाल, सिर्फ़ परसेप्शन के लिए कैसे किया जा सकता है. इसके लिए, रेंडरिंग की ज़रूरत नहीं होती.

XrInstance instance;    // Already initialized


// Create the session with spatial containers enabled
XrSession session;

XrSessionCreateInfoSpatialContainersEXT spatialContainerCreateInfo {
  .type = XR_TYPE_SESSION_CREATE_INFO_SPATIAL_CONTAINERS_EXT,
};
XrSessionCreateInfo sessionCreateInfo {
  .type = XR_TYPE_SESSION_CREATE_INFO,
  .next = &spatialContainerCreateInfo,   // Enable spatial containers
};
(void)sessionCreateInfo.systemId;                             // Other create fields set in usual way

CHK_XR(xrCreateSession(instance, &sessionCreateInfo, &session));


// Because spatial containers are enabled, the session is considered
// running. App is able to query perception data such as head poses and hand
// poses.


// Based on app logic or when a system lost event happens, destroy the
// session
CHK_XR(xrDestroySession(session));

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

नए निर्देश

नए स्ट्रक्चर

नए Enum

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

  • XR_EXT_SPATIAL_CONTAINER_EXTENSION_NAME
  • XR_EXT_spatial_container_SPEC_VERSION
  • XrObjectType को एक्सटेंड करना :

    • XR_OBJECT_TYPE_SPATIAL_CONTAINER_EXT
  • XrResult को एक्सटेंड करना :

    • XR_ERROR_COMPATIBLE_SPATIAL_CONTAINER_MISSING_EXT
    • XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXT
    • XR_ERROR_SPATIAL_CONTAINERS_NOT_ENABLED_EXT
    • XR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT
  • XrStructureType को एक्सटेंड करना :

    • XR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_BOUNDS_CHANGED_EXT
    • XR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_BOUNDS_MODE_REQUEST_DENIED_EXT
    • XR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_CLOSED_EXT
    • XR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_INTERACTABLE_CHANGED_EXT
    • XR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_VISIBLE_CHANGED_EXT
    • XR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_VISIBLE_REQUEST_DENIED_EXT
    • XR_TYPE_SESSION_CREATE_INFO_SPATIAL_CONTAINERS_EXT
    • XR_TYPE_SPATIAL_CONTAINER_BOUNDS_EXT
    • XR_TYPE_SPATIAL_CONTAINER_BOUNDS_GET_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_BOUNDS_MODE_REQUEST_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_CREATE_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_SPACE_CREATE_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_STATE_EXT
    • XR_TYPE_SPATIAL_CONTAINER_STATE_GET_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_VISIBLE_REQUEST_INFO_EXT
    • XR_TYPE_SYSTEM_SPATIAL_CONTAINER_PROPERTIES_EXT

समस्याएं

  • हम एक से ज़्यादा अनुरोधों को कैसे मैनेज करते हैं? क्या ऐप्लिकेशन को एक बार अनुमति मिलनी चाहिए या कई बार? अगर कॉल कई फ़्रेम में हैं, तो जवाब अलग हो सकता है. अगर कई अनुरोधों के नतीजे के तौर पर कोई कार्रवाई नहीं होती है, तो जवाब अलग हो सकता है. जैसे, किसी स्पेशल कंटेनर को दिखाने का अनुरोध करना और फिर उसे न दिखाने का अनुरोध करना.

    • समस्या हल हो गई है. बदलाव वाले इवेंट और अस्वीकार किए गए इवेंट के लिए अलग-अलग विकल्प. Noop अनुरोधों से, बदलाव वाले इवेंट की सूची नहीं बनती. इससे ऐप्लिकेशन डेवलपर के लिए सिर्फ़ ग़ैर-ज़रूरी डेटा जनरेट होता है. साथ ही, रनटाइम के लिए इसे फ़िल्टर करना आसान होता है. अगर दिखने वाले कई अनुरोधों को अस्वीकार कर दिया जाता है, तो रनटाइम को हर अनुरोध के लिए, अस्वीकार किए जाने वाला इवेंट जनरेट करना चाहिए.
  • कॉन्फ़ॉर्मेंस ऑटोमेशन एक्सटेंशन को किस तरह से तय किया जाना चाहिए, ताकि नीति के व्यवहार के लिए सभी वैकल्पिक स्पेसिफ़िकेशन टेक्स्ट की जांच सीटीएस से की जा सके?

    • समस्या हल हो गई है. अलग से टेस्ट एक्सटेंशन. सिर्फ़ सीटीएस के लिए, टेस्ट एक्सटेंशन रनटाइम लागू किया जाएगा. इससे सीटीएस को सिस्टम की सभी नीतियों को कंट्रोल करने की अनुमति मिलेगी.
  • क्या हमें स्पेशल कंटेनर की पोज़िशन बदलने पर, किसी इवेंट की ज़रूरत है?

    • समस्या हल हो गई है. नहीं. स्पेशल कंटेनर स्पेस, नॉन-वर्ल्ड लॉक होता है. साथ ही, XR_REFERENCE_SPACE_TYPE_VIEW जैसे अन्य स्पेस में बदलाव होने पर इवेंट नहीं होते.
  • अगर एक से ज़्यादा स्पेशल कंटेनर हैं, तो xrSyncActions कैसे काम करता है?

    • समस्या हल हो गई है. कोई बदलाव करने की ज़रूरत नहीं है. xrSyncActions, सेशन में मौजूद सभी स्पेशल कंटेनर पर लागू होगा. अगर कोई ऐप्लिकेशन, इनपुट ऐक्शन को किसी खास स्पेशल कंटेनर पर भेजना चाहता है, तो वह इंटरैक्ट किए जा सकने वाले हर कंटेनर की स्थिति को देख सकता है. इससे यह तय किया जा सकता है कि कौनसे कंटेनर मान्य टारगेट हैं. अगर कोई ऐप्लिकेशन सिर्फ़ एक स्पेशल कंटेनर के लिए इनपुट ऐक्शन की स्थिति को सिंक करना चाहता है, तो उसे एक अतिरिक्त एक्सटेंशन की ज़रूरत होगी. हालांकि, हमारा मकसद एक ऐसे एक्सटेंशन पर फ़ोकस करना है जो ऐप्लिकेशन को पूरी तरह से इवेंट पर आधारित होने की अनुमति देता है. साथ ही, फ़्रेम लूप में xrSyncActions कॉल की ज़रूरत को खत्म करता है.
  • कभी-कभी अपडेट किए जाने वाले ऐप्लिकेशन, इनपुट को कैसे मैनेज करते हैं?

    • समस्या हल हो गई है. कोई बदलाव करने की ज़रूरत नहीं है. यह EXT_spatial_container के लिए तो अहम है ही, स्पेशल कंटेनर के बाहर भी इसकी अहमियत है. इसे इवेंट चैनल एक्सटेंशन की मदद से मैनेज किया जा सकता है. यह दोनों मामलों में काम करता है. स्पेशल कंटेनर के लिए, हम किसी एक स्पेशल कंटेनर के इवेंट को फ़िल्टर करने के और तरीके जोड़ेंगे.
  • क्या हमें डिकपल्ड इनपुट और रेंडरिंग लूप वाले ऐप्लिकेशन के लिए, इनपुट लूप के समय को थ्रॉटल / कंट्रोल करने के लिए इंतज़ार करना होगा?

    • समस्या हल हो गई है. कोई बदलाव करने की ज़रूरत नहीं है. उम्मीद है कि इसे इवेंट चैनल और मौजूदा अनुरोध एक्सटेंशन के ज़रिए मैनेज किया जाएगा. Present request extension की मदद से, रेंडरिंग को इवेंट के हिसाब से किया जा सकता है. साथ ही, इसे फ़्रेम लूप से अलग किया जा सकता है.
  • क्या कोई स्पेशल कंटेनर, अन्य स्पेशल कंटेनर के हिसाब से अपनी पोज़िशन तय कर सकता है? यहां कुछ अहम बातें बताई गई हैं: क्या हमारे पास इसके इस्तेमाल का कोई उदाहरण है? अगर हां, तो स्पेशल कंटेनर स्पेस, LOCAL से कैसे कनेक्ट होते हैं?

    • समस्या हल हो गई है. हां. XR_REFERENCE_SPACE_TYPE_VIEW पर जाकर, एक ही सेशन में मौजूद स्पेशल कंटेनर के लिए ऐसा पहले से ही किया जा सकता है. साथ ही, व्यू के हिसाब से कॉन्टेंट दिखाना ज़रूरी है. अलग-अलग सेशन में (जैसे कि किसी दूसरी प्रोसेस में) स्पेशल कंटेनर पोज़ शेयर करने के लिए, XR_EXT_spatial_anchor और इसके मौजूदा परसिस्टेंस और शेयर करने के पैटर्न का इस्तेमाल करना चाहिए.
  • अगर कोई स्पेशल कंटेनर नहीं दिख रहा है, तो क्या उसकी जगह का पता लगाया जा सकता है?

    • समस्या हल हो गई है. नहीं. जब स्पेशल कंटेनर नहीं दिखता है, तो उसके स्पेस का पता नहीं लगाया जा सकता. इसका मतलब है कि इसमें स्पेशलाइज़्ड ऑडियो नहीं है. साथ ही, spatial_container न दिखने पर, ऐप्लिकेशन व्यू के हिसाब से कॉन्टेंट को "वॉर्म अप" नहीं कर सकता. ये दोनों ही सही हैं, क्योंकि जब कोई स्पेशल कंटेनर नहीं दिखता है, तो ऐप्लिकेशन को उस स्पेशल कंटेनर के लिए इस्तेमाल किए जाने वाले सीपीयू / जीपीयू लोड को रोकना चाहिए.
  • स्पेशल कंटेनर स्पेस को स्पेशल कंटेनर में कहां रखा जाना चाहिए? सुझावों को सेंटर या मिनिमल पॉइंट (minX, minY, minZ) पर रखा गया है.

    • समस्या हल हो गई है. बीच में. ऐसी कोई जगह नहीं है जो स्पेशल कंटेनर के साइज़ बदलने वाले उपयोगकर्ता अनुभव (किनारों को मूव करना) के ज़्यादातर तरीकों से मूव न होती हो. Center का इस्तेमाल, आम तौर पर OpenXR के अन्य हिस्सों में किया जाता है. हमने 2D कंप्यूटिंग में विंडो के साथ अलाइन नहीं किया है. इसमें कम से कम कोऑर्डिनेट का इस्तेमाल किया जाता है, क्योंकि 3D मॉडल व्यूअर अक्सर इस नियम का पालन नहीं करते हैं.
  • स्पेशल कंटेनर के अंदर मौजूद रिसॉर्स को बनाने के लिए, रनटाइम की ज़रूरत कब होती है? कभी-कभी इसमें सिस्टम की सेवाओं के साथ आईपीसी शामिल होता है.

    • समस्या हल हो गई है. xrCreateSpatialContainerEXT के हिस्से के तौर पर सिंक्रोनस तरीके से. हालांकि, इसमें आईपीसी शामिल हो सकता है, लेकिन आम तौर पर कंटेनर बनाने में ज़्यादा खर्च नहीं आता. कुछ वेंडर के पास कंटेनर मैनेज करने के लिए ग्लोबल म्यूटेक्स होते हैं. हालांकि, आम तौर पर इनके लिए ज़्यादा इंतज़ार नहीं करना पड़ता. म्यूटेक्स कॉन्टेंशन से जुड़ी समस्याएं, वेंडर के हिसाब से होने वाली गड़बड़ियां हैं. उम्मीद है कि हर वेंडर इन्हें ठीक करेगा.
  • क्या हमें इस बात के सिग्नल की ज़रूरत है कि XrSession, स्पेशल कंटेनर बनाएगा और इसलिए, लेगसी रेंडरिंग पाथ के साथ काम नहीं करेगा?

    • समस्या हल हो गई है. हां. हम सेशन स्टेट मशीन में बुनियादी तौर पर बदलाव करते हैं.

वर्शन हिस्ट्री

  • रिविज़न 1, 06-08-2026 (जेरेड फ़ाइंडर, Google)

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