XR_EXT_spatial_persistence

নামের স্ট্রিং

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-এ পারসিস্টেন্স কনটেক্সটের স্কোপ কনফিগার করতে পারে।

XrSpatialPersistenceContextCreateInfoEXT :: scope যদি xrEnumerateSpatialPersistenceScopesEXT দ্বারা গণনা করা না হয়, তাহলে রানটাইমকে 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

ব্যর্থতা

  • 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

সিস্টেমের মাধ্যমে ম্যানেজ করা ও বজায় রাখা স্পেশিয়াল এন্টিটির জন্য অ্যাপ্লিকেশনকে শুধুমাত্র পড়ার অ্যাক্সেস (অর্থাৎ, এই স্কোপের সাথে যুক্ত স্টোর অ্যাপ্লিকেশনটি পরিবর্তন করতে পারবে না) প্রদান করে। অ্যাপ্লিকেশনটি স্পেশিয়াল প্রসঙ্গ এবং ডিভাইস রিবুট জুড়ে এন্টিটিগুলির মধ্যে সম্পর্ক স্থাপন করতে এই স্কোপের জন্য পারসিস্টেন্স কম্পোনেন্টে UUID ব্যবহার করতে পারে।

XR_SPATIAL_PERSISTENCE_SCOPE_LOCAL_ANCHORS_EXT

পারসিস্টেন্স অপারেশন এবং ডেটা অ্যাক্সেস একই ডিভাইসে, একই ব্যবহারকারী এবং একই অ্যাপের জন্য স্পেশিয়াল অ্যাঙ্করে সীমাবদ্ধ (XR_EXT_spatial_persistence_operations এক্সটেনশন দ্বারা যোগ করা হয়েছে)

XR_SPATIAL_PERSISTENCE_SCOPE_ANCHORS_FOR_CLOUD_SHARING_ANDROIDX1

পারসিস্টেন্স অপারেশন এবং ডেটা অ্যাক্সেস স্পেশিয়াল অ্যাঙ্করে সীমাবদ্ধ, যা একই ক্লাউড প্রোজেক্টের মালিকানাধীন এবং পরিচালিত। (XR_ANDROIDX1_spatial_anchor_cloud_sharing এক্সটেনশন দ্বারা যোগ করা হয়েছে)

xrEnumerateSpatialPersistenceScopesEXT ফাংশনটি এভাবে সংজ্ঞায়িত করা হয়েছে:

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

প্যারামিটারের বিবরণ

  • instance হল XrInstance-এর হ্যান্ডেল।
  • systemId হল XrSystemId যার স্পেশিয়াল পারসিস্টেন্স স্কোপ গণনা করা হবে।
  • persistenceScopeCapacityInput হল persistenceScopes অ্যারের ক্যাপাসিটি, অথবা প্রয়োজনীয় ক্যাপাসিটি ফিরিয়ে আনার অনুরোধ জানাতে 0।
  • persistenceScopeCountOutput হল পারসিস্টেন্স স্কোপের সংখ্যা অথবা persistenceScopeCapacityInput পর্যাপ্ত না হলে প্রয়োজনীয় ক্যাপাসিটি।
  • persistenceScopes হল XrSpatialPersistenceScopeEXT-এর একটি অ্যারে। persistenceScopeCapacityInput ০ হলে এটি NULL হতে পারে।
  • প্রয়োজনীয় persistenceScopes সাইজ ফিরিয়ে আনার বিস্তারিত বিবরণের জন্য বাফার সাইজ প্যারামিটার অধ্যায় দেখুন।

xrEnumerateSpatialPersistenceScopesEXT ব্যবহার করে প্রদত্ত XrSystemId দ্বারা সমর্থিত স্পেশিয়াল পারসিস্টেন্স স্কোপের তালিকা অ্যাপ্লিকেশনটি গণনা করতে পারে।

সঠিক ব্যবহার (অন্তর্নিহিত)

  • XR_EXT_spatial_persistence এক্সটেনশন xrEnumerateSpatialPersistenceScopesEXT কল করার আগে অবশ্যই চালু করতে হবে
  • instance অবশ্যই একটি সঠিক XrInstance হ্যান্ডেল হতে হবে
  • persistenceScopeCountOutput অবশ্যই uint32_t ভ্যালুর পয়েন্টার হতে হবে
  • persistenceScopeCapacityInput যদি 0 না হয়, তাহলে persistenceScopes অবশ্যই persistenceScopeCapacityInput XrSpatialPersistenceScopeEXT মানের অ্যারের পয়েন্টার হতে হবে

রিটার্ন কোড

হয়ে গেছে

  • XR_SUCCESS

ব্যর্থতা

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

xrCreateSpatialPersistenceContextCompleteEXT ফাংশনটি এইভাবে সংজ্ঞায়িত করা হয়েছে:

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

প্যারামিটারের বিবরণ

xrCreateSpatialPersistenceContextCompleteEXT, xrCreateSpatialPersistenceContextAsyncEXT-এর মাধ্যমে শুরু করা অ্যাসিঙ্ক্রোনাস অপারেশন সম্পূর্ণ করে। future রেডি অবস্থায় না থাকলে রানটাইমকে XR_ERROR_FUTURE_PENDING_EXT রিটার্ন করতেই হবে। future আগে থেকেই সম্পূর্ণ বা বাতিল করা হয়ে থাকলে, রানটাইমকে XR_ERROR_FUTURE_INVALID_EXT রিটার্ন করতেই হবে।

সঠিক ব্যবহার (অন্তর্নিহিত)

রিটার্ন কোড

হয়ে গেছে

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ব্যর্থতা

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

XrCreateSpatialPersistenceContextCompletionEXT স্ট্রাকচারটি এইভাবে সংজ্ঞায়িত করা হয়েছে:

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

মেম্বারদের বিবরণ

  • type হল এই স্ট্রাকচারের XrStructureType।
  • next হল NULL অথবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের পয়েন্টার।
  • futureResult হল স্পেশিয়াল পারসিস্টেন্স কনটেক্সট তৈরি করার অপারেশনের XrResult।
  • createResult হল স্পেশাল পারসিসটেন্স কনটেক্সট তৈরি করার অপারেশনের XrSpatialPersistenceContextResultEXT।
  • persistenceContext হল একটি XrSpatialPersistenceContextEXT যা xrCreateSpatialPersistenceContextAsyncEXT :: createInfo -এ ডেটা এবং কনফিগারেশন ব্যবহার করে তৈরি করা হয়েছে।

ভবিষ্যতের রিটার্ন কোড

futureResult ভ্যালু:

হয়ে গেছে

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ব্যর্থতা

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

futureResult এবং createResult দুটিই যদি সফল কোড হয়, তাহলে persistenceContext অবশ্যই সঠিক হতে হবে। persistenceContext সঠিক হলে, xrCreateSpatialPersistenceContextAsyncEXT :: session-এর লাইফসাইকেলের মধ্যে অথবা অ্যাপ্লিকেশন 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

প্রদান করা পারসিস্ট UUID স্টোরেজে খুঁজে পাওয়া যায়নি। (XR_EXT_spatial_persistence_operations এক্সটেনশন দ্বারা যোগ করা হয়েছে)

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_LOCALIZATION_FAILURE_ANDROIDX1

লোকালাইজেশন করা যায়নি বলে পারসিস্টেন্স অপারেশন করা যায়নি। (XR_ANDROIDX1_spatial_anchor_cloud_sharing এক্সটেনশন দ্বারা যোগ করা হয়েছে)

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_MAP_FEATURE_INSUFFICIENT_ANDROIDX1

লোকালাইজেশন ম্যাপ ফিচার পর্যাপ্ত না হওয়ার কারণে পারসিস্টেন্স অপারেশন করা যায়নি। (XR_ANDROIDX1_spatial_anchor_cloud_sharing এক্সটেনশন দ্বারা যোগ করা হয়েছে)

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_FAILURE_ANDROIDX1

নেটওয়ার্ক কানেকশন কাজ না করার কারণে পারসিসটেন্স অপারেশন কাজ করেনি। (XR_ANDROIDX1_spatial_anchor_cloud_sharing এক্সটেনশন দ্বারা যোগ করা হয়েছে)

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_TIMEOUT_ANDROIDX1

নেটওয়ার্ক টাইমআউট হওয়ার কারণে পারসিসটেন্স অপারেশন করা যায়নি। (XR_ANDROIDX1_spatial_anchor_cloud_sharing এক্সটেনশন দ্বারা যোগ করা হয়েছে)

স্পেশিয়াল পারসিসটেন্স কন্টেক্সট ধ্বংস করুন

xrDestroySpatialPersistenceContextEXT ফাংশনটি এইভাবে সংজ্ঞায়িত করা হয়েছে:

XrResult xrDestroySpatialPersistenceContextEXT(
    XrSpatialPersistenceContextEXT              persistenceContext);

প্যারামিটারের বিবরণ

স্পেশিয়াল পারসিস্টেন্স টাস্ক শেষ হয়ে গেলে, persistenceContext হ্যান্ডেল রিলিজ করার জন্য অ্যাপ্লিকেশন xrDestroySpatialPersistenceContextEXT ব্যবহার করতে পারে।

xrDestroySpatialPersistenceContextEXT কল করা হলে, রানটাইম অবশ্যই persistenceContext-এর জন্য অন্তর্নিহিত রিসোর্স ধ্বংস করবে না, যদি কোনও সঠিক XrSpatialContextEXT হ্যান্ডেল থাকে যার সাথে persistenceContext XrSpatialContextPersistenceConfigEXT-এর মাধ্যমে লিঙ্ক করা থাকে। কারণ, পারসিস্টেন্স কনটেক্সটের রিসোর্স এখনও স্পেশিয়াল কনটেক্সট ব্যবহার করে পারসিস্টেড এন্টিটি খুঁজে পাওয়ার জন্য। এই ধরনের পরিস্থিতিতে পারসিসটেন্স কনটেক্সট হ্যান্ডেল নষ্ট করে দিলে, এইসব রিসোর্সে অ্যাপ্লিকেশনের অ্যাক্সেস শুধু সরিয়ে দেওয়া হয়।

নষ্ট হয়ে যাওয়া XrSpatialPersistenceContextEXT-এর রিসোর্স অবশ্যই খালি করতে হবে, যখন পারসিস্টেন্স কন্টেক্সট লিঙ্ক করা সব XrSpatialContextEXT হ্যান্ডেল নষ্ট হয়ে যায়।

সঠিক ব্যবহার (অন্তর্নিহিত)

থ্রেড নিরাপত্তা

  • persistenceContext এবং যেকোনও চাইল্ড হ্যান্ডেল অ্যাক্সেস করার সুবিধা, অবশ্যই এক্সটার্নালভাবে সিঙ্ক করতে হবে

রিটার্ন কোড

হয়ে গেছে

  • XR_SUCCESS

ব্যর্থতা

  • 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

স্টোরেজ থেকে পারসিস্টেড UUID লোড করা হয়েছে।

XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT

স্টোরেজে পারসিস্টেড UUID খুঁজে পাওয়া যায়নি এবং এটি হয় স্টোরেজ থেকে সরিয়ে দেওয়া হয়েছে অথবা কখনও ছিলই না।

ডেটা কোয়েরি করার জন্য কম্পোনেন্ট তালিকার স্ট্রাকচার

XrSpatialComponentPersistenceListEXT স্ট্রাকচার এইভাবে সংজ্ঞায়িত করা হয়:

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

মেম্বারদের বিবরণ

  • type হল এই স্ট্রাকচারের XrStructureType।
  • next হল NULL অথবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের পয়েন্টার। কোর OpenXR বা এই এক্সটেনশনে এই ধরনের কোনও স্ট্রাকচার সংজ্ঞায়িত করা নেই।
  • persistDataCount হল একটি uint32_t যা persistData অ্যারেতে এলিমেন্টের সংখ্যা বর্ণনা করে।
  • persistData হল XrSpatialPersistenceDataEXT-এর একটি অ্যারে।

XrSpatialComponentPersistenceListEXT যদি XrSpatialComponentDataQueryResultEXT :: next-এর পরবর্তী চেনে থাকে, তাহলে রানটাইমকে xrQuerySpatialComponentDataEXT থেকে XR_ERROR_VALIDATION_FAILURE রিটার্ন করতেই হবে :: কিন্তু XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT, XrSpatialComponentDataQueryConditionEXT :: componentTypes-এ অন্তর্ভুক্ত নেই।

persistDataCount যদি XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput-এর থেকে কম হয়, তাহলে রানটাইমকে xrQuerySpatialComponentDataEXT থেকে XR_ERROR_SIZE_INSUFFICIENT রিটার্ন করতেই হবে।

অন্যান্য কম্পোনেন্টের মতো নয়, রানটাইম XrSpatialEntityTrackingStateEXT নির্বিশেষে XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT-এর জন্য ডেটা সেট করতেই হবে।

সঠিক ব্যবহার (অন্তর্নিহিত)

কনফিগারেশন

কিছু ক্ষমতার জন্য XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT যদি XrSpatialCapabilityComponentTypesEXT :: componentTypes-এ গণনা করা হয়, তাহলে অ্যাপ্লিকেশনটি 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 যোগ করতে পারবে। এটি persistenceContexts-এর সাথে তৈরি করা XrSpatialContextEXT কনফিগার করবে এবং persistenceContexts-এ XrSpatialPersistenceContextEXT হ্যান্ডেল দ্বারা উপস্থাপিত স্টোরেজে থাকা স্পেশিয়াল এন্টিটি খুঁজে পেতে অ্যাপ্লিকেশনকে অনুমতি দেবে।

সঠিক ব্যবহার (অন্তর্নিহিত)

ডিসকভারি স্ন্যাপশট তৈরি করুন

নির্দিষ্ট UUID সহ এন্টিটি খুঁজুন

XrSpatialDiscoveryPersistenceUuidFilterEXT স্ট্রাকচারটি এইভাবে সংজ্ঞায়িত করা হয়েছে:

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

মেম্বারদের বিবরণ

  • type হল এই স্ট্রাকচারের XrStructureType।
  • next হল NULL অথবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের পয়েন্টার। কোর OpenXR বা এই এক্সটেনশনে এই ধরনের কোনও স্ট্রাকচার সংজ্ঞায়িত করা নেই।
  • persistedUuidCount হল একটি uint32_t যা persistedUuids অ্যারেতে এলিমেন্টের সংখ্যা বর্ণনা করে
  • persistedUuids হল XrUuid-এর একটি অ্যারে।

অ্যাপ্লিকেশনটি XrSpatialDiscoverySnapshotCreateInfoEXT-এর পরবর্তী চেনে XrSpatialDiscoveryPersistenceUuidFilterEXT ব্যবহার করতে পারে যাতে ডিসকভারি অপারেশনটি শুধুমাত্র সেইসব এন্টিটির মধ্যে সীমাবদ্ধ থাকে যাদের পারসিস্টেড UUID, persistedUuids-এ প্রদত্ত UUID-এর সেটে রয়েছে।

অ্যাপ্লিকেশনটি যদি XrSpatialDiscoverySnapshotCreateInfoEXT-এর পরবর্তী চেনে XrSpatialDiscoveryPersistenceUuidFilterEXT যোগ করে, কিন্তু xrCreateSpatialDiscoverySnapshotAsyncEXT :: spatialContext-কে XrSpatialContextPersistenceConfigEXT ব্যবহার করে কোনও XrSpatialPersistenceContextEXT-এর সাথে কনফিগার করা না হয়, তাহলে রানটাইমকে xrCreateSpatialDiscoverySnapshotAsyncEXT থেকে XR_ERROR_VALIDATION_FAILURE ফিরিয়ে দিতেই হবে।

রানটাইমকে অবশ্যই XrSpatialDiscoveryPersistenceUuidFilterEXT ফিল্টারকে XrSpatialDiscoverySnapshotCreateInfoEXT বা এর পরবর্তী চেনে দেওয়া অন্য যেকোনও ফিল্টারের সাথে 'AND' কন্ডিশন হিসেবে বিবেচনা করতে হবে। রানটাইমকে persistedUuids অ্যারেটিকে একটি 'OR' শর্ত হিসেবে বিবেচনা করতেই হবে, অর্থাৎ সেই অ্যারেতে প্রদত্ত যেকোনও UUID আছে এমন এন্টিটির জন্য ফিল্টার করতে হবে।

রানটাইমে persistedUuids-এর প্রতিটি UUID-এর জন্য তৈরি করা স্ন্যাপশটে অবশ্যই একটি এন্ট্রি অন্তর্ভুক্ত করতে হবে যার জন্য এটি এই সময়ে XrSpatialPersistenceStateEXT স্টেট নির্ধারণ করতে সক্ষম হয়েছে।

  • রানটাইম যদি তার স্টোরেজে UUID খুঁজে পায়, তাহলে -

    • রানটাইমকে অবশ্যই এই এন্টিটির 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-এ সেট করতে হবে।
  • রানটাইম যদি নির্ধারণ করে যে UUID তার স্টোরেজে নেই (UUID স্টোরেজে কখনও ছিল না বা একবার ছিল কিন্তু পরে মুছে ফেলা হয়েছে কিনা তা নির্বিশেষে), তাহলে -

    • রানটাইমকে অবশ্যই এই এন্টিটির 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-এ সেট করতে হবে যাতে অ্যাপ্লিকেশনকে বোঝানো যায় যে এই এন্টিটি কখনই ট্র্যাক করা হবে না।
  • রানটাইম যদি নির্ধারণ করতে না পারে যে UUID তার স্টোরেজে আছে কিনা, তাহলে এটি স্ন্যাপশটে অন্তর্ভুক্ত করা যাবে না।

এছাড়াও, অ্যাপ্লিকেশনটি XrSpatialComponentDataQueryConditionEXT-এর পরবর্তী চেনে XrSpatialDiscoveryPersistenceUuidFilterEXT ব্যবহার করতে পারে যাতে আগে থেকে থাকা স্ন্যাপশটে নির্দিষ্ট UUID-এর এন্টিটি কোয়েরি করা যায়। XrSpatialComponentDataQueryConditionEXT-এর সাথে ব্যবহার করা হলে, XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids-এ এমন কোনও XrUuid থাকলে যা XrSpatialSnapshotEXT-এ নেই, তাহলে রানটাইমে কোয়েরি ফলাফলে সেই XrUuid-এর জন্য কোনও এন্ট্রি অন্তর্ভুক্ত করা চলবে না। এছাড়াও, কোয়েরি ফলাফলে এন্টিটির ক্রম (সিকোয়েন্স) XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids -এ দেওয়া UUID-এর ক্রমের সাথে ম্যাচ নাও করতে পারে। অ্যাপ্লিকেশনে অবশ্যই XrSpatialComponentDataQueryConditionEXT :: componentTypes-এ XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT এবং XrSpatialComponentDataQueryResultEXT-এর পরবর্তী চেনে XrSpatialComponentPersistenceListEXT অন্তর্ভুক্ত করতে হবে এবং তারপরে প্রতিটি কোয়েরি ফলাফল ইন্ডেক্সের XrSpatialPersistenceDataEXT :: persistUuid চেক করে বুঝতে হবে যে বর্তমান ফলাফল ইন্ডেক্স কোন UUID-এর সাথে সম্পর্কিত।

সঠিক ব্যবহার (অন্তর্নিহিত)

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

নির্দিষ্ট UUID সহ এন্টিটি খুঁজুন

XrFutureEXT future = XR_NULL_FUTURE_EXT;

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

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

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

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

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

  waitUntilReady(future);

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

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

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

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

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

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

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

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

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

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

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

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

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

ইস্যু

ভার্সনের ইতিহাস

  • সংশোধন ১, ২৯-০৮-২০২৪ (নিহভ জৈন, Google)

    • প্রাথমিক এক্সটেনশনের বিবরণ