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_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXTXR_ERROR_VALIDATION_FAILURE
XrSpatialPersistenceContextCreateInfoEXT স্ট্রাকচারটি এইভাবে সংজ্ঞায়িত করা হয়েছে:
typedef struct XrSpatialPersistenceContextCreateInfoEXT {
XrStructureType type;
const void* next;
XrSpatialPersistenceScopeEXT scope;
} XrSpatialPersistenceContextCreateInfoEXT;
মেম্বারদের বিবরণ
typeহল এই স্ট্রাকচারের XrStructureType।nextহলNULLঅথবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের পয়েন্টার। কোর OpenXR বা এই এক্সটেনশনে এই ধরনের কোনও স্ট্রাকচার সংজ্ঞায়িত করা নেই।scopeহল একটি XrSpatialPersistenceScopeEXT যা পারসিস্টেন্স কনটেক্সটের স্টোরেজ স্কোপ নির্ধারণ করে।
XrSpatialPersistenceContextCreateInfoEXT স্ট্রাকচারটি XrSpatialPersistenceContextEXT হ্যান্ডেল তৈরি করার তথ্য বর্ণনা করে।
সঠিক ব্যবহার (অন্তর্নিহিত)
- XrSpatialPersistenceContextCreateInfoEXT ব্যবহার করার আগে
XR_EXT_spatial_persistenceএক্সটেনশন চালু করতেই হবে -
typeঅবশ্যইXR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXTহতে হবে -
nextঅবশ্যইNULLবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের সঠিক পয়েন্টার হতে হবে -
scopeঅবশ্যই একটি সঠিক XrSpatialPersistenceScopeEXT ভ্যালু হতে হবে
typedef enum XrSpatialPersistenceScopeEXT {
XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT = 1,
XR_SPATIAL_PERSISTENCE_SCOPE_LOCAL_ANCHORS_EXT = 1000781000,
XR_SPATIAL_PERSISTENCE_SCOPE_ANCHORS_FOR_CLOUD_SHARING_ANDROIDX1 = 1000808000,
XR_SPATIAL_PERSISTENCE_SCOPE_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPersistenceScopeEXT;
XrSpatialPersistenceScopeEXT এনিউমারেশন বিভিন্ন ধরনের পারসিস্টেন্স কনটেক্সট স্কোপ শনাক্ত করে।
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অবশ্যইpersistenceScopeCapacityInputXrSpatialPersistenceScopeEXT মানের অ্যারের পয়েন্টার হতে হবে
রিটার্ন কোড
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_ERROR_VALIDATION_FAILURE
xrCreateSpatialPersistenceContextCompleteEXT ফাংশনটি এইভাবে সংজ্ঞায়িত করা হয়েছে:
XrResult xrCreateSpatialPersistenceContextCompleteEXT(
XrSession session,
XrFutureEXT future,
XrCreateSpatialPersistenceContextCompletionEXT* completion);
প্যারামিটারের বিবরণ
sessionহল XrSession যা আগে xrCreateSpatialPersistenceContextAsyncEXT ::session-এ পাস করা হয়েছে।futureহল xrCreateSpatialPersistenceContextAsyncEXT থেকে পাওয়াXrFutureEXT।completionহল XrCreateSpatialPersistenceContextCompletionEXT-এর একটি পয়েন্টার।
xrCreateSpatialPersistenceContextCompleteEXT, xrCreateSpatialPersistenceContextAsyncEXT-এর মাধ্যমে শুরু করা অ্যাসিঙ্ক্রোনাস অপারেশন সম্পূর্ণ করে। future রেডি অবস্থায় না থাকলে রানটাইমকে XR_ERROR_FUTURE_PENDING_EXT রিটার্ন করতেই হবে। future আগে থেকেই সম্পূর্ণ বা বাতিল করা হয়ে থাকলে, রানটাইমকে XR_ERROR_FUTURE_INVALID_EXT রিটার্ন করতেই হবে।
সঠিক ব্যবহার (অন্তর্নিহিত)
- xrCreateSpatialPersistenceContextCompleteEXT কল করার আগে
XR_EXT_spatial_persistenceএক্সটেনশন অবশ্যই চালু করতে হবে -
sessionঅবশ্যই একটি সঠিক XrSession হ্যান্ডেল হতে হবে -
completionঅবশ্যই XrCreateSpatialPersistenceContextCompletionEXT স্ট্রাকচারের পয়েন্টার হতে হবে
রিটার্ন কোড
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_FUTURE_INVALID_EXTXR_ERROR_FUTURE_PENDING_EXTXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
XrCreateSpatialPersistenceContextCompletionEXT স্ট্রাকচারটি এইভাবে সংজ্ঞায়িত করা হয়েছে:
typedef struct XrCreateSpatialPersistenceContextCompletionEXT {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialPersistenceContextResultEXT createResult;
XrSpatialPersistenceContextEXT persistenceContext;
} XrCreateSpatialPersistenceContextCompletionEXT;
মেম্বারদের বিবরণ
typeহল এই স্ট্রাকচারের XrStructureType।nextহলNULLঅথবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের পয়েন্টার।futureResultহল স্পেশিয়াল পারসিস্টেন্স কনটেক্সট তৈরি করার অপারেশনের XrResult।createResultহল স্পেশাল পারসিসটেন্স কনটেক্সট তৈরি করার অপারেশনের XrSpatialPersistenceContextResultEXT।persistenceContextহল একটি XrSpatialPersistenceContextEXT যা xrCreateSpatialPersistenceContextAsyncEXT ::createInfo-এ ডেটা এবং কনফিগারেশন ব্যবহার করে তৈরি করা হয়েছে।
ভবিষ্যতের রিটার্ন কোড
futureResult ভ্যালু:
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_PERMISSION_INSUFFICIENT
futureResult এবং createResult দুটিই যদি সফল কোড হয়, তাহলে persistenceContext অবশ্যই সঠিক হতে হবে। persistenceContext সঠিক হলে, xrCreateSpatialPersistenceContextAsyncEXT :: session-এর লাইফসাইকেলের মধ্যে অথবা অ্যাপ্লিকেশন persistenceContext-এর সাথে xrDestroySpatialPersistenceContextEXT ব্যবহার না করা পর্যন্ত, যেটি আগে হবে, সেটি অবশ্যই সঠিক থাকতে হবে।
রানটাইম অবশ্যই createResult সেট করবে, শুধুমাত্র যদি futureResult একটি সাকসেস কোড হয়।
সঠিক ব্যবহার (অন্তর্নিহিত)
- XrCreateSpatialPersistenceContextCompletionEXT ব্যবহার করার আগে
XR_EXT_spatial_persistenceএক্সটেনশন চালু করতেই হবে -
typeঅবশ্যইXR_TYPE_CREATE_SPATIAL_PERSISTENCE_CONTEXT_COMPLETION_EXTহতে হবে -
nextঅবশ্যইNULLবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের সঠিক পয়েন্টার হতে হবে -
futureResultঅবশ্যই একটি সঠিক XrResult মান হতে হবে -
createResultঅবশ্যই একটি সঠিক XrSpatialPersistenceContextResultEXT মান হতে হবে -
persistenceContextঅবশ্যই একটি সঠিক XrSpatialPersistenceContextEXT হ্যান্ডেল হতে হবে
typedef enum XrSpatialPersistenceContextResultEXT {
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_SUCCESS_EXT = 0,
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_ENTITY_NOT_TRACKING_EXT = -1000781001,
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_PERSIST_UUID_NOT_FOUND_EXT = -1000781002,
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_LOCALIZATION_FAILURE_ANDROIDX1 = -1000808000,
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_MAP_FEATURE_INSUFFICIENT_ANDROIDX1 = -1000808001,
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_FAILURE_ANDROIDX1 = -1000808002,
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_TIMEOUT_ANDROIDX1 = -1000808003,
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPersistenceContextResultEXT;
XrSpatialPersistenceContextResultEXT এনিউমারেশন পারসিস্টেন্স অপারেশনের জন্য বিভিন্ন ধরনের ফলাফল কোড শনাক্ত করে। পারসিস্টেন্স অপারেশন চলাকালীন ব্যর্থতা সবসময় অ্যাপ্লিকেশনের নিয়ন্ত্রণে থাকে না এবং এই গণনা এই ধরনের কেস বোঝানোর জন্য ব্যবহার করা হয়। XrResult-এর মতো, XrSpatialPersistenceContextResultEXT এনিউমারেশনে সাফল্যের কোডগুলি নন-নেগেটিভ ভ্যালু এবং ব্যর্থতার কোডগুলি নেগেটিভ ভ্যালু।
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হল একটি XrSpatialPersistenceContextEXT যা আগে xrCreateSpatialPersistenceContextAsyncEXT দ্বারা তৈরি করা হয়েছে।
স্পেশিয়াল পারসিস্টেন্স টাস্ক শেষ হয়ে গেলে, persistenceContext হ্যান্ডেল রিলিজ করার জন্য অ্যাপ্লিকেশন xrDestroySpatialPersistenceContextEXT ব্যবহার করতে পারে।
xrDestroySpatialPersistenceContextEXT কল করা হলে, রানটাইম অবশ্যই persistenceContext-এর জন্য অন্তর্নিহিত রিসোর্স ধ্বংস করবে না, যদি কোনও সঠিক XrSpatialContextEXT হ্যান্ডেল থাকে যার সাথে persistenceContext XrSpatialContextPersistenceConfigEXT-এর মাধ্যমে লিঙ্ক করা থাকে। কারণ, পারসিস্টেন্স কনটেক্সটের রিসোর্স এখনও স্পেশিয়াল কনটেক্সট ব্যবহার করে পারসিস্টেড এন্টিটি খুঁজে পাওয়ার জন্য। এই ধরনের পরিস্থিতিতে পারসিসটেন্স কনটেক্সট হ্যান্ডেল নষ্ট করে দিলে, এইসব রিসোর্সে অ্যাপ্লিকেশনের অ্যাক্সেস শুধু সরিয়ে দেওয়া হয়।
নষ্ট হয়ে যাওয়া XrSpatialPersistenceContextEXT-এর রিসোর্স অবশ্যই খালি করতে হবে, যখন পারসিস্টেন্স কন্টেক্সট লিঙ্ক করা সব XrSpatialContextEXT হ্যান্ডেল নষ্ট হয়ে যায়।
সঠিক ব্যবহার (অন্তর্নিহিত)
- xrDestroySpatialPersistenceContextEXT কল করার আগে
XR_EXT_spatial_persistenceএক্সটেনশন অবশ্যই চালু করতে হবে -
persistenceContextঅবশ্যই একটি সঠিক XrSpatialPersistenceContextEXT হ্যান্ডেল হতে হবে
থ্রেড নিরাপত্তা
persistenceContextএবং যেকোনও চাইল্ড হ্যান্ডেল অ্যাক্সেস করার সুবিধা, অবশ্যই এক্সটার্নালভাবে সিঙ্ক করতে হবে
রিটার্ন কোড
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
পারসিস্টেড এন্টিটি খুঁজে দেখুন
পারসিসটেন্স কম্পোনেন্ট
পারসিস্টেড স্পেশিয়াল এন্টিটিতে পারসিস্টেন্স কম্পোনেন্ট থাকে যা রানটাইমকে অবশ্যই ডিসকভারি ও আপডেট স্ন্যাপশটে অন্তর্ভুক্ত করতে হবে, যদি XrSpatialContextEXT তৈরি করার সময় XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT চালু করা থাকে এবং XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes অথবা XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes-এ অন্তর্ভুক্ত করা থাকে।
কম্পোনেন্ট ডেটা
XrSpatialPersistenceDataEXT স্ট্রাকচার এইভাবে সংজ্ঞায়িত করা হয়:
typedef struct XrSpatialPersistenceDataEXT {
XrUuid persistUuid;
XrSpatialPersistenceStateEXT persistState;
} XrSpatialPersistenceDataEXT;
মেম্বারদের বিবরণ
persistUuidহল একটি XrUuid .persistStateহল একটি XrSpatialPersistenceStateEXT যাpersistUuid-এর পারসিস্টেন্স স্টেটকে উপস্থাপন করে
সঠিক ব্যবহার (অন্তর্নিহিত)
- XrSpatialPersistenceDataEXT ব্যবহার করার আগে
XR_EXT_spatial_persistenceএক্সটেনশন অবশ্যই চালু করতে হবে -
persistStateঅবশ্যই একটি সঠিক XrSpatialPersistenceStateEXT ভ্যালু হতে হবে
typedef enum XrSpatialPersistenceStateEXT {
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT = 1,
XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT = 2,
XR_SPATIAL_PERSISTENCE_STATE_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPersistenceStateEXT;
XrSpatialPersistenceStateEXT এনিউমারেশন, পারসিস্টেড uuid-এর বিভিন্ন স্ট্যাটাস শনাক্ত করে।
enum-এর অর্থ হল:
Enum-এর বিবরণ
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT
স্টোরেজ থেকে পারসিস্টেড 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-এর জন্য ডেটা সেট করতেই হবে।
সঠিক ব্যবহার (অন্তর্নিহিত)
- XrSpatialComponentPersistenceListEXT ব্যবহার করার আগে
XR_EXT_spatial_persistenceএক্সটেনশন অবশ্যই চালু করতে হবে -
typeঅবশ্যইXR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXTহতে হবে -
nextঅবশ্যইNULLবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের সঠিক পয়েন্টার হতে হবে -
persistDataঅবশ্যইpersistDataCountXrSpatialPersistenceDataEXT স্ট্রাকচারের অ্যারের পয়েন্টার হতে হবে -
persistDataCountপ্যারামিটার অবশ্যই0-এর থেকে বেশি হতে হবে
কনফিগারেশন
কিছু ক্ষমতার জন্য 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 হ্যান্ডেল দ্বারা উপস্থাপিত স্টোরেজে থাকা স্পেশিয়াল এন্টিটি খুঁজে পেতে অ্যাপ্লিকেশনকে অনুমতি দেবে।
সঠিক ব্যবহার (অন্তর্নিহিত)
- XrSpatialContextPersistenceConfigEXT ব্যবহার করার আগে
XR_EXT_spatial_persistenceএক্সটেনশন চালু করা থাকতেই হবে -
typeঅবশ্যইXR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXTহতে হবে -
nextঅবশ্যইNULLবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের সঠিক পয়েন্টার হতে হবে -
persistenceContextsঅবশ্যইpersistenceContextCountটি সঠিক XrSpatialPersistenceContextEXT হ্যান্ডেলের অ্যারের একটি পয়েন্টার হতে হবে -
persistenceContextCountপ্যারামিটার অবশ্যই0-এর থেকে বেশি হতে হবে
ডিসকভারি স্ন্যাপশট তৈরি করুন
নির্দিষ্ট UUID সহ এন্টিটি খুঁজুন
XrSpatialDiscoveryPersistenceUuidFilterEXT স্ট্রাকচারটি এইভাবে সংজ্ঞায়িত করা হয়েছে:
typedef struct XrSpatialDiscoveryPersistenceUuidFilterEXT {
XrStructureType type;
const void* next;
uint32_t persistedUuidCount;
const XrUuid* persistedUuids;
} XrSpatialDiscoveryPersistenceUuidFilterEXT;
মেম্বারদের বিবরণ
typeহল এই স্ট্রাকচারের XrStructureType।nextহলNULLঅথবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের পয়েন্টার। কোর OpenXR বা এই এক্সটেনশনে এই ধরনের কোনও স্ট্রাকচার সংজ্ঞায়িত করা নেই।persistedUuidCountহল একটিuint32_tযাpersistedUuidsঅ্যারেতে এলিমেন্টের সংখ্যা বর্ণনা করেpersistedUuidsহল XrUuid-এর একটি অ্যারে।
অ্যাপ্লিকেশনটি 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-এ সেট করতে হবে।
- রানটাইমকে অবশ্যই এই এন্টিটির XrSpatialPersistenceDataEXT-এ XrSpatialPersistenceStateEXT-কে
রানটাইম যদি নির্ধারণ করে যে 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-এ সেট করতে হবে যাতে অ্যাপ্লিকেশনকে বোঝানো যায় যে এই এন্টিটি কখনই ট্র্যাক করা হবে না।
- রানটাইমকে অবশ্যই এই এন্টিটির XrSpatialPersistenceDataEXT-এ XrSpatialPersistenceStateEXT-কে
রানটাইম যদি নির্ধারণ করতে না পারে যে 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অবশ্যইpersistedUuidCountXrUuid স্ট্রাকচারের অ্যারের পয়েন্টার হতে হবে -
persistedUuidCountপ্যারামিটার অবশ্যই0-এর থেকে বেশি হতে হবে
সব পারসিস্টেড এন্টিটি খুঁজে দেখুন
অ্যাপ্লিকেশনটি যদি XrSpatialDiscoveryPersistenceUuidFilterEXT ছাড়া এবং XrSpatialContextEXT সহ xrCreateSpatialDiscoverySnapshotAsyncEXT ব্যবহার করে, যা XrSpatialPersistenceContextEXT-এর সাথে কনফিগার করা হয়েছে, তাহলে রানটাইমকে অবশ্যই তৈরি করা স্ন্যাপশটে সেই এন্টিটিগুলি অন্তর্ভুক্ত করতে হবে যা XrSpatialPersistenceContextEXT দ্বারা উপস্থাপিত স্টোরেজে স্থায়ী হয় এবং XrSpatialDiscoverySnapshotCreateInfoEXT-এ প্রদত্ত ফিল্টারগুলি পূরণ করে। এইসব এন্টিটির জন্য -
- রানটাইমকে অবশ্যই এই এন্টিটির XrSpatialPersistenceDataEXT-এ XrSpatialPersistenceStateEXT-কে
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT-এ সেট করতে হবে। - রানটাইমে তৈরি করা স্ন্যাপশটে এই এন্টিটির জন্য সঠিক
XrSpatialEntityIdEXTথাকতেই হবে। - রানটাইম অবশ্যই সেই এন্টিটির XrSpatialEntityTrackingStateEXT
XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT-এ সেট করবে, যদি এটি সক্রিয়ভাবে এন্টিটি ট্র্যাক করে এবং এর কম্পোনেন্টের জন্য সঠিক ডেটা থাকে। অন্যথায়, রানটাইমকে অবশ্যই XrSpatialEntityTrackingStateEXT-কেXR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT-এ সেট করতে হবে।
নতুন অবজেক্টের ধরন
নতুন কমান্ড
- xrCreateSpatialPersistenceContextAsyncEXT
- xrCreateSpatialPersistenceContextCompleteEXT
- xrDestroySpatialPersistenceContextEXT
- xrEnumerateSpatialPersistenceScopesEXT
নতুন স্ট্রাকচার
- XrCreateSpatialPersistenceContextCompletionEXT
- XrSpatialPersistenceContextCreateInfoEXT
- XrSpatialPersistenceDataEXT
XrSpatialComponentDataQueryResultEXT এক্সটেন্ড করা হচ্ছে :
XrSpatialContextCreateInfoEXT এক্সটেন্ড করা হচ্ছে :
XrSpatialDiscoverySnapshotCreateInfoEXT , XrSpatialComponentDataQueryConditionEXT এক্সটেন্ড করা হচ্ছে :
নতুন Enum
নতুন Enum কনস্ট্যান্ট
XR_EXT_SPATIAL_PERSISTENCE_EXTENSION_NAMEXR_EXT_spatial_persistence_SPEC_VERSIONXrObjectType এক্সটেন্ড করা হচ্ছে :
XR_OBJECT_TYPE_SPATIAL_PERSISTENCE_CONTEXT_EXT
XrResult এক্সটেন্ড করা হচ্ছে :
XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT
XrSpatialComponentTypeEXT এক্সটেন্ড করা হচ্ছে :
XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT
XrStructureType এক্সটেন্ড করা হচ্ছে :
XR_TYPE_CREATE_SPATIAL_PERSISTENCE_CONTEXT_COMPLETION_EXTXR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXTXR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXTXR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXTXR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXT
কোডের উদাহরণ
পারসিসটেন্স কনটেক্সট তৈরি করুন
// Check if the required persistence scope supported
uint32_t scopeCount;
CHK_XR(xrEnumerateSpatialPersistenceScopesEXT(instance, systemId, 0, &scopeCount, nullptr));
std::vector<XrSpatialPersistenceScopeEXT> persistenceScopes(scopeCount);
CHK_XR(xrEnumerateSpatialPersistenceScopesEXT(instance, systemId, scopeCount, &scopeCount, persistenceScopes.data()));
if (std::find(persistenceScopes.begin(), persistenceScopes.end(), XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT) == persistenceScopes.end()) {
return;
}
XrSpatialPersistenceContextEXT persistenceContext{};
XrSpatialPersistenceContextCreateInfoEXT persistenceContextCreateInfo{XR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXT};
persistenceContextCreateInfo.scope = XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT;
XrFutureEXT createContextFuture;
CHK_XR(xrCreateSpatialPersistenceContextAsyncEXT(session, &persistenceContextCreateInfo, &createContextFuture));
waitUntilReady(createContextFuture);
XrCreateSpatialPersistenceContextCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_PERSISTENCE_CONTEXT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialPersistenceContextCompleteEXT(session, createContextFuture, &completion));
if (completion.futureResult != XR_SUCCESS || completion.createResult != XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_SUCCESS_EXT) {
return;
}
persistenceContext = completion.persistenceContext;
// ...
// Connect persistence context to a spatial context and discover persisted entities.
// ...
CHK_XR(xrDestroySpatialPersistenceContextEXT(persistenceContext));
পারসিস্টেন্স কন্টেক্সটকে স্পেশিয়াল কন্টেক্সটের সাথে কানেক্ট করা
// Note: Anchor capability is just used as an example here. Persistence can be
// supported by other capabilities too. xrEnumerateSpatialCapabilityComponentTypesEXT() can
// be used to check if a certain capability supports persistence.
if (!isSpatialCapabilitySupported(instance, systemId, XR_SPATIAL_CAPABILITY_ANCHOR_EXT)) {
return;
}
const bool supportsPersistenceComponent = isSpatialComponentSupported(instance, systemId, XR_SPATIAL_CAPABILITY_ANCHOR_EXT, XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT);
// Create a spatial spatial context
XrSpatialContextEXT spatialContext{};
{
std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT,
};
if (supportsPersistenceComponent) {
enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT);
}
XrSpatialCapabilityConfigurationAnchorEXT anchorConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXT};
anchorConfig.capability = XR_SPATIAL_CAPABILITY_ANCHOR_EXT;
anchorConfig.enabledComponentCount = enabledComponents.size();
anchorConfig.enabledComponents = enabledComponents.data();
std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&anchorConfig),
};
XrSpatialContextCreateInfoEXT spatialContextCreateInfo{XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();
XrSpatialContextPersistenceConfigEXT persistenceConfig{XR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXT};
persistenceConfig.persistenceContextCount = 1;
persistenceConfig.persistenceContexts = &persistenceContext;
if (supportsPersistenceComponent) {
spatialContextCreateInfo.next = &persistenceConfig;
}
XrFutureEXT createContextFuture;
CHK_XR(xrCreateSpatialContextAsyncEXT(session, &spatialContextCreateInfo, &createContextFuture));
waitUntilReady(createContextFuture);
XrCreateSpatialContextCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialContextCompleteEXT(session, createContextFuture, &completion));
if (completion.futureResult != XR_SUCCESS) {
return;
}
spatialContext = completion.spatialContext;
}
// ...
// Discover persisted anchors.
// ...
CHK_XR(xrDestroySpatialContextEXT(spatialContext));
সব পারসিস্টেড এন্টিটি খুঁজে দেখুন
XrFutureEXT future = XR_NULL_FUTURE_EXT;
// We want to look for entities that have the following components.
std::vector<XrSpatialComponentTypeEXT> snapshotComponents = {
XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT,
};
auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
snapshotCreateInfo.componentTypes = snapshotComponents.data();
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));
waitUntilReady(future);
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
completionInfo.baseSpace = localSpace;
completionInfo.time = time;
completionInfo.future = future;
XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
if (completion.futureResult == XR_SUCCESS) {
// Query for the semantic label component data
XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
queryCond.componentTypeCount = snapshotComponents.size();
queryCond.componentTypes = snapshotComponents.data();
XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));
std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityIdCountOutput);
queryResult.entityIdCapacityInput = entityIds.size();
queryResult.entityIds = entityIds.data();
queryResult.entityStateCapacityInput = entityStates.size();
queryResult.entityStates = entityStates.data();
std::vector<XrSpatialPersistenceDataEXT> persistenceData(queryResult.entityIdCountOutput);
XrSpatialComponentPersistenceListEXT persistenceDataList{XR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXT};
persistenceDataList.persistDataCount = persistenceData.size();
persistenceDataList.persistData = persistenceData.data();
queryResult.next = &persistenceDataList;
CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));
for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
// persistenceData[i].persistUuid is the UUID of the persisted entity whose entity ID is entityIds[i].
// The persistenceData array is essentially the uuids persisted in the scope that the current
// XrSpatialPersistenceContextEXT is configured with.
}
CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
}
};
while (1) {
// ...
// For every frame in frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
// Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
XrResult result = xrPollEvent(instance, &event);
if (result == XR_SUCCESS) {
switch (event.type) {
case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
const XrEventDataSpatialDiscoveryRecommendedEXT& eventdata =
*reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT*>(&event);
// Discover spatial entities for the context that we received the "discovery
// recommended" event for.
discoverSpatialEntities(eventdata.spatialContext, time);
break;
}
}
}
// ...
// Finish frame loop
// ...
}
নির্দিষ্ট 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)
- প্রাথমিক এক্সটেনশনের বিবরণ