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 হ্যান্ডেল তৈরি করার জন্য প্রয়োজনীয় তথ্য বর্ণনা করে।

বৈধ ব্যবহার (অন্তর্নিহিত)

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

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

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 একটি সফলতার কোড হয়।

বৈধ ব্যবহার (অন্তর্নিহিত)

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

অ্যাপ্লিকেশনটি বিদ্যমান স্ন্যাপশটগুলিতে নির্দিষ্ট UUID-এর এনটিটিগুলির জন্য কোয়েরি করতে XrSpatialComponentDataQueryConditionEXT- এর পরবর্তী চেইনে XrSpatialDiscoveryPersistenceUuidFilterEXT- ও ব্যবহার করতে পারেXrSpatialComponentDataQueryConditionEXT-এর সাথে ব্যবহৃত হলে, যদি XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids এমন কোনো XrUuid থাকে যা XrSpatialSnapshotEXT- এ নেই, তাহলে রানটাইম কোয়েরির ফলাফলে সেই XrUuid-এর জন্য কোনো এন্ট্রি অন্তর্ভুক্ত করবে না। এছাড়াও, কোয়েরির ফলাফলে এনটিটিগুলির ক্রম (সিকোয়েন্স) XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids এ প্রদত্ত UUID-গুলির ক্রমের সাথে মিলতে পারবে না। অ্যাপ্লিকেশনটিতে XrSpatialComponentDataQueryConditionEXT :: componentTypesXR_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 অবশ্যই persistedUuidCount XrUuid স্ট্রাকচারের একটি অ্যারের পয়েন্টার হতে হবে।
  • 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 এ সেট করতে হবে।

নতুন অবজেক্টের প্রকারভেদ

নতুন কমান্ড

নতুন কাঠামো

নতুন এনাম

নতুন এনাম ধ্রুবক

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

সমস্যা

সংস্করণ ইতিহাস

  • সংস্করণ ১, ২০২৪-০৮-২৯ (নিহাব জৈন, গুগল)

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