XR_EXT_spatial_persistence
নাম স্ট্রিং
XR_EXT_spatial_persistence
এক্সটেনশন টাইপ
ইনস্ট্যান্স এক্সটেনশন
নিবন্ধিত এক্সটেনশন নম্বর
৭৬৪
সংশোধন
১
অনুমোদনের অবস্থা
অনুমোদিত
এক্সটেনশন এবং সংস্করণ নির্ভরতা
XR_EXT_spatial_entity
এবং
XR_EXT_future
অবদানকারীরা
নিহাব জৈন, গুগল
জ্যারেড ফাইন্ডার, গুগল
নাটালি ফ্লেউরি, মেটা
ইউইচি তাগুচি, মেটা
রন বেসেমস, মেটা
ইয়িন লি, মাইক্রোসফট
জিমি আলামপারাম্বিল, বাইটড্যান্স
ঝিপেং লিউ, বাইটড্যান্স
জুন ইয়ান, বাইটড্যান্স
সংক্ষিপ্ত বিবরণ
এই এক্সটেনশনটি অ্যাপ্লিকেশনগুলিকে অ্যাপ্লিকেশন সেশন, OpenXR সেশন এবং একটি সেশনের মধ্যে একাধিক OpenXR স্পেশিয়াল কনটেক্সট জুড়ে স্পেশিয়াল এনটিটিগুলি আবিষ্কার এবং সম্পর্কযুক্ত করতে সাহায্য করে। XR_EXT_spatial_entity এক্সটেনশনটি প্রতিষ্ঠা করেছিল যে একটি XrSpatialContextEXT-এর মধ্যে থাকা একটি এনটিটি একটি XrSpatialEntityIdEXT দ্বারা প্রতিনিধিত্ব করা হয়। এই এক্সটেনশনটি সেই ধারণাটিকে আরও প্রসারিত করে এটি প্রতিষ্ঠা করে যে, একটি এনটিটি যদি পারসিস্ট করা হয়, তবে তা অ্যাপ্লিকেশন এবং OpenXR সেশন জুড়ে একটি XrUuid দ্বারা প্রতিনিধিত্ব করা হয়, অর্থাৎ একটি অ্যাপ্লিকেশন বিভিন্ন সেশন জুড়ে একটি এনটিটি শনাক্ত করতে এই এক্সটেনশন দ্বারা প্রদত্ত XrUuid ব্যবহার করতে পারে । এই এক্সটেনশনটি ব্যবহারকারীর পরিবেশে পারসিস্ট করা এনটিটিগুলি আবিষ্কার করতে এবং তাদের কম্পোনেন্ট ডেটা কোয়েরি করার ক্ষমতার জন্য XR_EXT_spatial_entity এক্সটেনশনের সাথে দরকারী ওভারল্যাপও প্রদান করে।
স্থানিক স্থায়িত্ব প্রসঙ্গ
একটি স্থানিক স্থায়িত্ব প্রসঙ্গ তৈরি করুন
XR_DEFINE_HANDLE(XrSpatialPersistenceContextEXT)
XrSpatialPersistenceContextEXT হ্যান্ডেলটি একটি স্থায়ী স্থানিক সত্তা স্টোরেজের সাথে সংযোগকে প্রতিনিধিত্ব করে।
xrCreateSpatialPersistenceContextAsyncEXT ফাংশনটি নিম্নরূপে সংজ্ঞায়িত করা হয়েছে:
XrResult xrCreateSpatialPersistenceContextAsyncEXT(
XrSession session,
const XrSpatialPersistenceContextCreateInfoEXT* createInfo,
XrFutureEXT* future);
প্যারামিটার বিবরণ
-
sessionএকটি XrSession , যেখানে স্থানিক স্থায়িত্ব প্রসঙ্গটি সক্রিয় থাকবে। -
createInfoহলো XrSpatialPersistenceContextCreateInfoEXT, যা স্পেশিয়াল পারসিস্টেন্স কনটেক্সটের প্যারামিটারগুলো নির্দিষ্ট করতে ব্যবহৃত হয়। -
futureহলোXrFutureEXTএর একটি পয়েন্টার।
একটি অ্যাপ্লিকেশন xrCreateSpatialPersistenceContextAsyncEXT ফাংশনটি ব্যবহার করে একটি XrSpatialPersistenceContextEXT হ্যান্ডেল তৈরি করতে পারে এবং createInfo তে পার্সিস্টেন্স কনটেক্সটের স্কোপ কনফিগার করতে পারে।
যদি xrEnumerateSpatialPersistenceScopesEXT দ্বারা XrSpatialPersistenceContextCreateInfoEXT :: scope গণনা করা না হয়, তাহলে রানটাইমকে অবশ্যই XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT রিটার্ন করতে হবে।
যদি কোনো রানটাইম XrSpatialPersistenceContextEXT দ্বারা উপস্থাপিত পার্সিস্টেন্স স্টোরেজে অ্যাপ্লিকেশনের অ্যাক্সেস নিয়ন্ত্রণ করার জন্য একটি পারমিশন সিস্টেম প্রয়োগ করে, তাহলে এই অ্যাপ্লিকেশনটিকে সেই পারমিশনগুলো প্রদান করা না হয়ে থাকলে রানটাইমটিকে অবশ্যই XR_ERROR_PERMISSION_INSUFFICIENT রিটার্ন করতে হবে ।
বৈধ ব্যবহার (অন্তর্নিহিত)
- xrCreateSpatialPersistenceContextAsyncEXT কল করার আগে
XR_EXT_spatial_persistenceএক্সটেনশনটি অবশ্যই সক্রিয় করতে হবে। -
sessionঅবশ্যই একটি বৈধ XrSession হ্যান্ডেল হতে হবে। -
createInfoঅবশ্যই একটি বৈধ XrSpatialPersistenceContextCreateInfoEXT স্ট্রাকচারের একটি পয়েন্টার হতে হবে। -
futureঅবশ্যই একটিXrFutureEXTমানের দিকে নির্দেশকারী একটি পয়েন্টার হতে হবে।
রিটার্ন কোড
-
XR_SUCCESS -
XR_SESSION_LOSS_PENDING
-
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 হ্যান্ডেল তৈরি করার জন্য প্রয়োজনীয় তথ্য বর্ণনা করে।
বৈধ ব্যবহার (অন্তর্নিহিত)
- 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_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPersistenceScopeEXT;
XrSpatialPersistenceScopeEXT এনুমারেশনটি বিভিন্ন ধরণের পার্সিস্টেন্স কনটেক্সট স্কোপ শনাক্ত করে।
এনামগুলোর নিম্নলিখিত অর্থ রয়েছে:
এনামের বিবরণ
XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT
সিস্টেম দ্বারা সংরক্ষিত ও পরিচালিত স্পেশিয়াল এনটিটিগুলোতে অ্যাপ্লিকেশনটিকে শুধুমাত্র-পঠ্য (read-only) অ্যাক্সেস প্রদান করে (অর্থাৎ, অ্যাপ্লিকেশনটি এই স্কোপের সাথে যুক্ত স্টোরটি পরিবর্তন করতে পারে না)। অ্যাপ্লিকেশনটি স্পেশিয়াল কনটেক্সট এবং ডিভাইস রিবুটের পরেও এনটিটিগুলোর মধ্যে সম্পর্ক স্থাপন করতে এই স্কোপের পার্সিস্টেন্স কম্পোনেন্টে থাকা UUID ব্যবহার করতে পারে ।
XR_SPATIAL_PERSISTENCE_SCOPE_LOCAL_ANCHORS_EXT
পার্সিস্টেন্স অপারেশন এবং ডেটা অ্যাক্সেস শুধুমাত্র স্পেশিয়াল অ্যাঙ্কর, একই ডিভাইস, একই ব্যবহারকারী এবং একই অ্যাপের মধ্যে সীমাবদ্ধ ( XR_EXT_spatial_persistence_operations এক্সটেনশন দ্বারা যুক্ত)।
xrEnumerateSpatialPersistenceScopesEXT ফাংশনটি নিম্নরূপে সংজ্ঞায়িত করা হয়েছে:
XrResult xrEnumerateSpatialPersistenceScopesEXT(
XrInstance instance,
XrSystemId systemId,
uint32_t persistenceScopeCapacityInput,
uint32_t* persistenceScopeCountOutput,
XrSpatialPersistenceScopeEXT* persistenceScopes);
প্যারামিটার বিবরণ
-
instanceহলো একটি XrInstance- এর হ্যান্ডেল। -
systemIdহলো সেইXrSystemIdযার স্থানিক স্থায়িত্বের পরিধিগুলো গণনা করা হবে। -
persistenceScopeCapacityInputহলোpersistenceScopesঅ্যারের ধারণক্ষমতা, অথবা প্রয়োজনীয় ধারণক্ষমতা পুনরুদ্ধারের অনুরোধ বোঝাতে এর মান ০। -
persistenceScopeCountOutputহলো পার্সিস্টেন্স স্কোপের সংখ্যা, অথবাpersistenceScopeCapacityInputঅপর্যাপ্ত হলে প্রয়োজনীয় ধারণক্ষমতা। -
persistenceScopesহলো XrSpatialPersistenceScopeEXT- এর একটি অ্যারে।persistenceScopeCapacityInputমান 0 হলে এটিNULLহতে পারে । - প্রয়োজনীয়
persistenceScopesসাইজ নির্ধারণের বিস্তারিত বিবরণের জন্য Buffer Size Parameters অধ্যায়টি দেখুন।
অ্যাপ্লিকেশনটি xrEnumerateSpatialPersistenceScopesEXT ব্যবহার করে একটি প্রদত্ত XrSystemId দ্বারা সমর্থিত স্পেশিয়াল পারসিস্টেন্স স্কোপগুলির তালিকা গণনা করতে পারে ।
বৈধ ব্যবহার (অন্তর্নিহিত)
- xrEnumerateSpatialPersistenceScopesEXT কল করার আগে
XR_EXT_spatial_persistenceএক্সটেনশনটি অবশ্যই সক্রিয় করতে হবে। -
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);
প্যারামিটার বিবরণ
-
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_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 একটি সফলতার কোড হয়।
বৈধ ব্যবহার (অন্তর্নিহিত)
- 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_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPersistenceContextResultEXT;
XrSpatialPersistenceContextResultEXT এনুমারেশনটি একটি পার্সিস্টেন্স অপারেশনের জন্য বিভিন্ন ধরণের ফলাফল কোড শনাক্ত করে। পার্সিস্টেন্স অপারেশনের সময়কার ব্যর্থতা সবসময় অ্যাপ্লিকেশনের নিয়ন্ত্রণে থাকে না এবং এই ধরনের পরিস্থিতি জানানোর জন্য এই এনুমারেশনটি ব্যবহৃত হয়। XrResult-এর মতোই, XrSpatialPersistenceContextResultEXT এনুমারেশনে সফলতার কোডগুলো অ-ঋণাত্মক মান এবং ব্যর্থতার কোডগুলো ঋণাত্মক মান হয়।
এনামগুলোর নিম্নলিখিত অর্থ রয়েছে:
এনামের বিবরণ
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 এক্সটেনশন দ্বারা যোগ করা হয়েছে)
স্থানিক স্থায়িত্ব প্রসঙ্গ ধ্বংস করুন
xrDestroySpatialPersistenceContextEXT ফাংশনটি নিম্নরূপে সংজ্ঞায়িত করা হয়েছে:
XrResult xrDestroySpatialPersistenceContextEXT(
XrSpatialPersistenceContextEXT persistenceContext);
প্যারামিটার বিবরণ
-
persistenceContextহলো একটি XrSpatialPersistenceContextEXT যা পূর্বে xrCreateSpatialPersistenceContextAsyncEXT দ্বারা তৈরি করা হয়েছিল।
অ্যাপ্লিকেশনটি স্পেশিয়াল পার্সিস্টেন্সের কাজ শেষ হয়ে গেলে persistenceContext হ্যান্ডেলটি রিলিজ করার জন্য xrDestroySpatialPersistenceContextEXT ব্যবহার করতে পারে ।
যখন xrDestroySpatialPersistenceContextEXT কল করা হয়, তখন রানটাইমকে অবশ্যই persistenceContext এর অন্তর্নিহিত রিসোর্সগুলো ধ্বংস করা থেকে বিরত থাকতে হবে, যদি এমন কোনো বৈধ XrSpatialContextEXT হ্যান্ডেল থাকে যার সাথে persistenceContext XrSpatialContextPersistenceConfigEXT- এর মাধ্যমে লিঙ্ক করা ছিল। এর কারণ হলো, পার্সিস্টেড এনটিটিগুলো খুঁজে বের করার জন্য স্পেশিয়াল কনটেক্সট তখনও পার্সিসেন্স কনটেক্সটের রিসোর্সগুলো ব্যবহার করে। এই ধরনের পরিস্থিতিতে পার্সিসেন্স কনটেক্সট হ্যান্ডেল ধ্বংস করলে তা শুধুমাত্র এই রিসোর্সগুলোতে অ্যাপ্লিকেশনের অ্যাক্সেস কেড়ে নেয়।
যখন পার্সিস্টেন্স কনটেক্সটটির সাথে সংযুক্ত সমস্ত XrSpatialContextEXT হ্যান্ডেল ধ্বংস হয়ে যায়, তখন একটি ধ্বংসপ্রাপ্ত XrSpatialPersistenceContextEXT- এর রিসোর্সসমূহ অবশ্যই মুক্ত করতে হবে।
বৈধ ব্যবহার (অন্তর্নিহিত)
- xrDestroySpatialPersistenceContextEXT কল করার আগে
XR_EXT_spatial_persistenceএক্সটেনশনটি অবশ্যই সক্রিয় করতে হবে। -
persistenceContextঅবশ্যই একটি বৈধ XrSpatialPersistenceContextEXT হ্যান্ডেল হতে হবে।
থ্রেড নিরাপত্তা
-
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-এর বিভিন্ন অবস্থা শনাক্ত করে।
এনামগুলোর নিম্নলিখিত অর্থ রয়েছে:
এনামের বিবরণ
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- এর একটি অ্যারে।
যদি XrSpatialComponentDataQueryResultEXT :: next এর পরবর্তী চেইনে XrSpatialComponentPersistenceListEXT থাকে, কিন্তু XrSpatialComponentDataQueryConditionEXT :: componentTypes এ XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT অন্তর্ভুক্ত না থাকে, তাহলে রানটাইমকে অবশ্যই xrQuerySpatialComponentDataEXT থেকে XR_ERROR_VALIDATION_FAILURE রিটার্ন করতে হবে ।
যদি 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অবশ্যইpersistDataCountসংখ্যক XrSpatialPersistenceDataEXT স্ট্রাকচারের একটি অ্যারের পয়েন্টার হতে হবে। -
persistDataCountপ্যারামিটারটি অবশ্যই0থেকে বড় হতে হবে।
কনফিগারেশন
যদি কোনো ক্যাপাবিলিটির জন্য XrSpatialCapabilityComponentTypesEXT :: componentTypes এ XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT তালিকাভুক্ত থাকে, তাহলে অ্যাপ্লিকেশনটি XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents তালিকায় enum-টি অন্তর্ভুক্ত করার মাধ্যমে এটিকে সক্রিয় করতে পারে । এই কম্পোনেন্টটিকে XrSpatialCapabilityConfigurationBaseHeaderEXT- এর পরবর্তী চেইনে অন্তর্ভুক্ত করার জন্য কোনো বিশেষ কনফিগারেশনের প্রয়োজন হয় না। যদি অ্যাপ্লিকেশনটি সক্রিয় কম্পোনেন্ট তালিকায় XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT অন্তর্ভুক্ত করে, তবে এটিকে অবশ্যই XrSpatialContextCreateInfoEXT- এর পরবর্তী চেইনে XrSpatialContextPersistenceConfigEXT- ও অন্তর্ভুক্ত করতে হবে, অন্যথায় রানটাইমকে অবশ্যই xrCreateSpatialContextAsyncEXT থেকে XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT রিটার্ন করতে হবে।
স্থায়িত্বের প্রেক্ষাপট দিয়ে স্থানিক প্রেক্ষাপট কনফিগার করুন
XrSpatialContextPersistenceConfigEXT কাঠামোটি নিম্নরূপে সংজ্ঞায়িত করা হয়:
typedef struct XrSpatialContextPersistenceConfigEXT {
XrStructureType type;
const void* next;
uint32_t persistenceContextCount;
const XrSpatialPersistenceContextEXT* persistenceContexts;
} XrSpatialContextPersistenceConfigEXT;
সদস্যদের বিবরণ
-
typeহলো এই স্ট্রাকচারটির XrStructureType । -
nextহলোNULLঅথবা একটি স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের একটি পয়েন্টার। কোর OpenXR বা এই এক্সটেনশনে এই ধরনের কোনো স্ট্রাকচার সংজ্ঞায়িত করা নেই। -
persistenceContextCountহলো একটিuint32_tযাpersistenceContextsঅ্যারের উপাদান সংখ্যা বর্ণনা করে। -
persistenceContextsহলো XrSpatialPersistenceContextEXT- এর একটি অ্যারে।
একটি অ্যাপ্লিকেশন XrSpatialContextCreateInfoEXT- এর পরবর্তী চেইনে XrSpatialContextPersistenceConfigEXT যোগ করতে পারে । এটি তৈরি করা XrSpatialContextEXT-কে persistenceContexts দিয়ে কনফিগার করবে এবং অ্যাপ্লিকেশনটিকে persistenceContexts এ থাকা XrSpatialPersistenceContextEXT হ্যান্ডেল দ্বারা প্রতিনিধিত্ব করা স্টোরেজে সংরক্ষিত স্পেশিয়াল এনটিটিগুলো খুঁজে বের করার সুযোগ দেবে।
বৈধ ব্যবহার (অন্তর্নিহিত)
- XrSpatialContextPersistenceConfigEXT ব্যবহার করার আগে
XR_EXT_spatial_persistenceএক্সটেনশনটি অবশ্যই সক্রিয় করতে হবে। -
typeঅবশ্যইXR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXTহতে হবে -
nextঅবশ্যইNULLঅথবা স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের একটি বৈধ পয়েন্টার হতে হবে। -
persistenceContextsঅবশ্যইpersistenceContextCountসংখ্যক বৈধ XrSpatialPersistenceContextEXT হ্যান্ডেলের একটি অ্যারের পয়েন্টার হতে হবে। -
persistenceContextCountপ্যারামিটারটি অবশ্যই0থেকে বড় হতে হবে।
ডিসকভারি স্ন্যাপশট তৈরি করুন
নির্দিষ্ট 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-টি স্টোরেজে কখনোই ছিল না অথবা একসময় উপস্থিত থাকলেও পরে তা সংরক্ষিত হয়নি, তা নির্বিশেষে), তাহলে -
- অ্যাপ্লিকেশনকে এটা বোঝানোর জন্য যে এই UUID-টি আর স্টোরেজে উপস্থিত নেই, রানটাইমকে অবশ্যই এই এনটিটির XrSpatialPersistenceDataEXT- এর মধ্যে থাকা XrSpatialPersistenceStateEXT- কে
XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXTএ সেট করতে হবে। - রানটাইমকে অবশ্যই তৈরি করা স্ন্যাপশটে এই এনটিটির জন্য
XrSpatialEntityIdEXTকে XR_NULL_SPATIAL_ENTITY_ID_EXT- এ সেট করতে হবে। - অ্যাপ্লিকেশনকে এটা বোঝানোর জন্য যে এই এনটিটিটিটি কখনোই ট্র্যাক করা হবে না, রানটাইমকে অবশ্যই সেই এনটিটির XrSpatialEntityTrackingStateEXT- কে
XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXTএ সেট করতে হবে।
- অ্যাপ্লিকেশনকে এটা বোঝানোর জন্য যে এই UUID-টি আর স্টোরেজে উপস্থিত নেই, রানটাইমকে অবশ্যই এই এনটিটির XrSpatialPersistenceDataEXT- এর মধ্যে থাকা XrSpatialPersistenceStateEXT- কে
যদি রানটাইম তার স্টোরেজে UUID-টি আছে কি না তা নির্ধারণ করতে না পারে, তবে সেটিকে স্ন্যাপশটে অন্তর্ভুক্ত করা যাবে না।
অ্যাপ্লিকেশনটি বিদ্যমান স্ন্যাপশটগুলিতে নির্দিষ্ট UUID-এর এনটিটিগুলির জন্য কোয়েরি করতে XrSpatialComponentDataQueryConditionEXT- এর পরবর্তী চেইনে XrSpatialDiscoveryPersistenceUuidFilterEXT- ও ব্যবহার করতে পারে । XrSpatialComponentDataQueryConditionEXT-এর সাথে ব্যবহৃত হলে, যদি XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids এমন কোনো XrUuid থাকে যা XrSpatialSnapshotEXT- এ নেই, তাহলে রানটাইম কোয়েরির ফলাফলে সেই XrUuid-এর জন্য কোনো এন্ট্রি অন্তর্ভুক্ত করবে না। এছাড়াও, কোয়েরির ফলাফলে এনটিটিগুলির ক্রম (সিকোয়েন্স) XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids এ প্রদত্ত UUID-গুলির ক্রমের সাথে মিলতে পারবে না। অ্যাপ্লিকেশনটিতে XrSpatialComponentDataQueryConditionEXT :: componentTypes এ XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT এবং XrSpatialComponentDataQueryResultEXT- এর পরবর্তী চেইনে XrSpatialComponentPersistenceListEXT অন্তর্ভুক্ত করতে হবে এবং তারপরে বর্তমান রেজাল্ট ইনডেক্সটি কোন UUID-এর সাথে সম্পর্কিত তা বোঝার জন্য প্রতিটি কোয়েরি রেজাল্ট ইনডেক্সের XrSpatialPersistenceDataEXT :: persistUuid পরীক্ষা করতে হবে।
বৈধ ব্যবহার (অন্তর্নিহিত)
- XrSpatialDiscoveryPersistenceUuidFilterEXT ব্যবহার করার আগে
XR_EXT_spatial_persistenceএক্সটেনশনটি অবশ্যই সক্রিয় করতে হবে। -
typeঅবশ্যইXR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXTহতে হবে -
nextঅবশ্যইNULLঅথবা স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের একটি বৈধ পয়েন্টার হতে হবে। -
persistedUuidsঅবশ্যইpersistedUuidCountXrUuid স্ট্রাকচারের একটি অ্যারের পয়েন্টার হতে হবে। -
persistedUuidCountপ্যারামিটারটি অবশ্যই0থেকে বড় হতে হবে।
সমস্ত স্থায়ী সত্তা আবিষ্কার করুন
যদি অ্যাপ্লিকেশনটি XrSpatialDiscoveryPersistenceUuidFilterEXT ছাড়া xrCreateSpatialDiscoverySnapshotAsyncEXT ব্যবহার করে এবং এমন একটি XrSpatialContextEXT ব্যবহার করে যা 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 এর সম্প্রসারণ :
নতুন এনাম
নতুন এনাম ধ্রুবক
-
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
// ...
}
সমস্যা
সংস্করণ ইতিহাস
সংস্করণ ১, ২০২৪-০৮-২৯ (নিহাব জৈন, গুগল)
- প্রাথমিক এক্সটেনশনের বিবরণ