XR_ANDROID_spatial_component_subsumed_by

নাম স্ট্রিং

XR_ANDROID_spatial_component_subsumed_by

এক্সটেনশন টাইপ

ইনস্ট্যান্স এক্সটেনশন

নিবন্ধিত এক্সটেনশন নম্বর

৭৯২

সংশোধন

অনুমোদনের অবস্থা

অনুমোদিত নয়

এক্সটেনশন এবং সংস্করণ নির্ভরতা

XR_EXT_spatial_entity
এবং
XR_EXT_spatial_plane_tracking

সর্বশেষ সংশোধনের তারিখ

২০২৫-০৮-১৯

আইপি স্ট্যাটাস

কোনো জ্ঞাত আইপি দাবি নেই।

অবদানকারীরা

ব্রায়ান চেন, গুগল
কাইল চেন, গুগল
লেভানা চেন, গুগল
নিহাব জৈন, গুগল
স্পেন্সার কুইন, গুগল

সংক্ষিপ্ত বিবরণ

এই এক্সটেনশনটি XR_EXT_spatial_entity উপর ভিত্তি করে তৈরি এবং এটি XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT এর জন্য একটি নতুন কম্পোনেন্ট প্রদান করে, যা subsumed_by প্রপার্টিটিকে প্রকাশ করে।

যখন রানটাইম দুটি ট্র্যাক করা প্লেন যে আসলে একই, তা শনাক্ত করার জন্য পর্যাপ্ত পরিবেশগত তথ্য সংগ্রহ করে, তখন প্লেন দুটির একটির আইডিযুক্ত subsumed_by কম্পোনেন্টটি অন্যটির সাথে সংযুক্ত করা হবে।

এই এক্সটেনশনটি একটি নতুন ফিল্টারও যুক্ত করে, যা অ্যাপ্লিকেশনটি XrSpatialDiscoverySnapshotCreateInfoEXT- এর সাথে চেইন করে সেইসব এনটিটি ফিল্টার করে বাদ দিতে পারে , যেগুলোর সাথে subsumed_by কম্পোনেন্ট সংযুক্ত আছে।

অনুমতি

অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলির ম্যানিফেস্টে অবশ্যই android.permission.SCENE_UNDERSTANDING_COARSE পারমিশনটি তালিকাভুক্ত থাকতে হবে, কারণ এই এক্সটেনশনটি এনভায়রনমেন্টের প্লেনগুলি ট্র্যাক করে। android.permission.SCENE_UNDERSTANDING_COARSE পারমিশনটিকে একটি বিপজ্জনক পারমিশন হিসেবে বিবেচনা করা হয়।

(সুরক্ষার স্তর: বিপজ্জনক)

রানটাইম সাপোর্ট

যদি রানটাইম subumed_by সমর্থন করে, তবে এটিকে অবশ্যই প্লেন ট্র্যাকিং ক্ষমতা সমর্থন করতে হবে এবং xrEnumerateSpatialCapabilitiesEXT-XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT গণনা করার মাধ্যমে তা নির্দেশ করতে হবে।

যদি রানটাইম subsumed_by প্রদান করে, তবে তাকে অবশ্যই xrEnumerateSpatialCapabilityComponentTypesEXT-XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT ক্যাপাবিলিটির জন্য XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID একটি সমর্থিত কম্পোনেন্ট হিসেবে তালিকাভুক্ত করার মাধ্যমে এটি নির্দেশ করতে হবে

XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID সংযুক্ত এনটিটির সমস্ত কম্পোনেন্ট ডেটা অবশ্যই এটিকে অন্তর্ভুক্তকারী এনটিটির ডেটার সাথে অভিন্ন হতে হবে।

উপাদানের অন্তর্ভুক্ত

উপাদান ডেটা

XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID তার ডেটার জন্য XrSpatialEntityIdEXT স্ট্রাকচারটি ব্যবহার করে, যা অন্তর্ভুক্তকারী এনটিটির আইডিকে নির্দেশ করে।

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

XrSpatialComponentSubsumedByListANDROID স্ট্রাকচারটি নিম্নরূপে সংজ্ঞায়িত করা হয়েছে:

typedef struct XrSpatialComponentSubsumedByListANDROID {
    XrStructureType          type;
    void*                    next;
    uint32_t                 subsumedUniqueIdCount;
    XrSpatialEntityIdEXT*    subsumedUniqueIds;
} XrSpatialComponentSubsumedByListANDROID;

সদস্যদের বিবরণ

  • type হলো এই স্ট্রাকচারটির XrStructureType
  • next হলো NULL অথবা একটি স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের দিকে নির্দেশকারী একটি পয়েন্টার।
  • subsumedUniqueIdCount হলো একটি uint32_t যা subsumedUniqueIds অ্যারের উপাদান সংখ্যা বর্ণনা করে।
  • subsumedUniqueIds হলো XrSpatialEntityIdEXT এর একটি অ্যারে।

অ্যাপ্লিকেশনটি XrSpatialComponentDataQueryResultEXT- এর পরবর্তী চেইনে XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROID যোগ করে একটি XrSpatialSnapshotEXT- এর মধ্যে থাকা স্পেশিয়াল এনটিটিগুলোর subsumed_by কম্পোনেন্ট কোয়েরি করতে পারে

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

যদি subsumedUniqueIdCount XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput থেকে কম হয়, তাহলে রানটাইমকে অবশ্যই xrQuerySpatialComponentDataEXT থেকে XR_ERROR_SIZE_INSUFFICIENT রিটার্ন করতে হবে

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

  • XrSpatialComponentSubsumedByListANDROID ব্যবহার করার আগে XR_ANDROID_spatial_component_subsumed_by এক্সটেনশনটি অবশ্যই সক্রিয় করতে হবে।
  • type অবশ্যই XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROID হতে হবে
  • next অবশ্যই NULL অথবা স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের একটি বৈধ পয়েন্টার হতে হবে।
  • subsumedUniqueIds অবশ্যই subsumedUniqueIdCount সংখ্যক XrSpatialEntityIdEXT ভ্যালুর একটি অ্যারের পয়েন্টার হতে হবে।
  • subsumedUniqueIdCount প্যারামিটারটি অবশ্যই 0 থেকে বড় হতে হবে।

কনফিগারেশন

যদি XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID ক্যাপাবিলিটির জন্য XrSpatialCapabilityComponentTypesEXT :: componentTypesXR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT এনুমারেট করা থাকে, তাহলে অ্যাপ্লিকেশনটি এই কম্পোনেন্টকে সমর্থনকারী ক্যাপাবিলিটির XrSpatialCapabilityConfigurationBaseHeaderEXT ডিরাইভড স্ট্রাকচারের XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents লিস্টে এনুমটি অন্তর্ভুক্ত করার মাধ্যমে এটিকে সক্রিয় করতে পারে

ফিল্টার অন্তর্ভুক্ত সত্তা

XrSpatialDiscoveryUniqueEntitiesFilterANDROID কাঠামোটি নিম্নরূপে সংজ্ঞায়িত করা হয়েছে:

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

সদস্যদের বিবরণ

  • type হলো এই স্ট্রাকচারটির XrStructureType
  • next হলো NULL অথবা একটি স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের দিকে নির্দেশকারী একটি পয়েন্টার।

অন্য কোনো এনটিটির অন্তর্ভুক্ত নয় এমন এনটিটিসহ একটি স্ন্যাপশট পেতে, অ্যাপ্লিকেশনটি XrSpatialDiscoverySnapshotCreateInfoEXT- এর পরবর্তী চেইনে XrSpatialDiscoveryUniqueEntitiesFilterANDROID অন্তর্ভুক্ত করতে পারে

যদি অ্যাপ্লিকেশনগুলি XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes -এ XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID কম্পোনেন্টটি অন্তর্ভুক্ত করার সময় XrSpatialDiscoveryUniqueEntitiesFilterANDROID- কে XrSpatialDiscoverySnapshotCreateInfoEXT- এর সাথে চেইন করে, তাহলে রানটাইমকে অবশ্যই XR_ERROR_VALIDATION_FAILURE রিটার্ন করতে হবে।

যদি অ্যাপ্লিকেশনটি XrSpatialDiscoveryUniqueEntitiesFilterANDROID- কে XrSpatialDiscoverySnapshotCreateInfoEXT- এর সাথে চেইন করে, কিন্তু XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes এ কোনো কম্পোনেন্ট তালিকাভুক্ত না করে, তাহলে রানটাইমকে অবশ্যই স্ন্যাপশটে সেই সমস্ত স্পেশিয়াল এনটিটি অন্তর্ভুক্ত করতে হবে যাদের কম্পোনেন্টের সেটটি XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents এ স্পেশিয়ালকনটেক্সট (spatialContext)-এর জন্য কনফিগার করা ক্যাপাবিলিটিগুলোর জন্য তালিকাভুক্ত করা হয়েছে; তবে সেইসব এনটিটি এর ব্যতিক্রম হবে যাদের XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID কম্পোনেন্টটি রয়েছে।

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

উদাহরণ কোড

প্লেন ট্র্যাকিং ক্ষমতা কনফিগার করুন

নিম্নলিখিত উদাহরণ কোডটি দেখায় কিভাবে XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT ক্যাপাবিলিটি সহ একটি স্পেশিয়াল কনটেক্সট তৈরি করতে হয় যা subsumed_by সমর্থন করে।

// Check runtime supported capabilities
uint32_t capabilityCount;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0, &capabilityCount, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCount);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilityCount, &capabilityCount, capabilities.data()));

if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT) == capabilities.end()) {
  return;
}

std::vector<XrSpatialComponentTypeEXT> planeTrackingComponents {
  XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
  XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT,
  XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID,
};

// Create capability config for plane tracking
XrSpatialCapabilityConfigurationPlaneTrackingEXT planeTrackingConfig {
  .type = XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXT,
  .next = nullptr,
  .capability = XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT,
  .enabledComponentCount = (uint32_t)planeTrackingComponents.size(),
  .enabledComponents = planeTrackingComponents.data(),
};

// Create spatial context
std::vector<const XrSpatialCapabilityConfigurationBaseHeaderEXT*> capabilityConfigs;
capabilityConfigs.push_back(reinterpret_cast<const XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&planeTrackingConfig));

XrSpatialContextCreateInfoEXT contextCreateInfo{
  .type = XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT,
  .next = nullptr,
  .capabilityConfigCount = (uint32_t)capabilityConfigs.size(),
  .capabilityConfigs = capabilityConfigs.data(),
};

CHK_XR(xrCreateSpatialContextAsyncEXT(session, &contextCreateInfo, &future))

// Completes creating spatial context
XrCreateSpatialContextCompletionEXT contextCompletion{
XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};

CHK_XR(xrCreateSpatialContextCompleteEXT(session, future, &contextCompletion))

কোয়েরি কম্পোনেন্ট ডেটা

নিম্নলিখিত উদাহরণ কোডটি দেখায় কিভাবে XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT দিয়ে কনফিগার করা কনটেক্সট থেকে subsumed_by কম্পোনেন্টের ডেটা কোয়েরি করতে হয়।

// Create Discovery Snapshot
XrSpatialDiscoverySnapshotCreateInfoEXT discoverySnapshotCreateInfo {
  .type = XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT,
};

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

// Poll the state till snapshot it's ready.
waitUntilReady(future);

// Complete async operation.
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT
  createSnapshotCompletionInfo {
    .type   = XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT,
    .baseSpace = space,
    .time      = updateTime,
    .future    = future,
  };

XrCreateSpatialDiscoverySnapshotCompletionEXT completion {
  XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};

CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(
           spatialContext, &createSnapshotCompletionInfo,
           &completion));

if(completion.futureResult != XR_SUCCESS) return;

// Query subsumed_by components
std::array<XrSpatialComponentTypeEXT, 1> enabledComponents = {
  XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID
};

XrSpatialComponentDataQueryConditionEXT queryCond {
  .type = XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT,
  .componentTypeCount = 1,
  .componentTypes     = enabledComponents.data(),
};

XrSpatialComponentDataQueryResultEXT queryResult {
  .type = XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT,
};

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

// Query again with allocated memory
std::vector<XrSpatialEntityIdEXT> subsumedUniqueIds;
subsumedUniqueIds.resize(queryResult.entityIdCountOutput);
XrSpatialComponentSubsumedByListANDROID subsumedByList {
  .type = XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROID,
  .subsumedUniqueIdCount = static_cast<uint32_t>(subsumedUniqueIds.size()),
  .subsumedUniqueIds = subsumedUniqueIds.data(),
};

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

std::vector<XrSpatialEntityEXT> subsumedEntities;
for(uint32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
    // access planes[i] for merged plane id
    XrSpatialEntityIdEXT entityId = queryResult.entityIds[i];
    XrSpatialEntityIdEXT subsumedUniqueId = subsumedUniqueIds[i];

    // create handle via entityId
  XrSpatialEntityFromIdCreateInfoEXT entityCreateInfo {
    .type = XR_TYPE_SPATIAL_ENTITY_FROM_ID_CREATE_INFO_EXT,
    .entityId = entityId,
  };

  XrSpatialEntityEXT entity = XR_NULL_HANDLE;
  xrCreateSpatialEntityFromIdEXT(spatialContext, &entityCreateInfo, &entity);

  subsumedEntities.push_back(entity);
}

// Cleanup
xrDestroySpatialSnapshotEXT(completion.snapshot);

অন্তর্ভুক্ত সত্তাগুলি ফিল্টার করুন

নিম্নলিখিত উদাহরণ কোডটি দেখায় কিভাবে ফিল্টার ব্যবহার করে ডিসকভারি স্ন্যাপশট থেকে 'subsumed_by' কম্পোনেন্ট সংযুক্ত এনটিটিগুলোকে ফিল্টার করে বাদ দিতে হয়, এবং সেইসাথে অন্তর্ভুক্তকারী এনটিটিগুলোর এনটিটি আইডি কোয়েরি করতে হয়।

// Init filter
XrSpatialDiscoveryUniqueEntitiesFilterANDROID filter {
  .type = XR_TYPE_SPATIAL_DISCOVERY_UNIQUE_ENTITIES_FILTER_ANDROID,
};

// Chain filter to the snapshot create info
// WARNING: Chain the filter while include subsumed_by component in the
// componentTypes is invalid
XrSpatialDiscoverySnapshotCreateInfoEXT discoverySnapshotCreateInfo {
  .type = XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT,
  .next = &filter
};

waitUntilReady(future);

// Complete async operation.
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT
  createSnapshotCompletionInfo {
    .type   = XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT,
    .baseSpace = space,
    .time      = updateTime,
    .future    = future,
  };

XrCreateSpatialDiscoverySnapshotCompletionEXT completion {
  XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};

CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(
           spatialContext, &createSnapshotCompletionInfo,
           &completion));

if(completion.futureResult != XR_SUCCESS) return;

// Subsumed entities has already been filtered out in this snapshot,now query
// Bounded2D to render subsuming planes
std::vector<XrSpatialComponentTypeEXT> queryComponents {
  XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
};

XrSpatialComponentDataQueryConditionEXT queryCond {
  .type = XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT,
  .componentTypeCount = 1,
  .componentTypes     = queryComponents.data(),
};

XrSpatialComponentDataQueryResultEXT queryResult {
  .type = XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT,
};

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

// Chain Bounded2D list
std::vector<XrSpatialBounded2DDataEXT> bounded2dData;
bounded2dData.resize(queryResult.entityIdCountOutput);

XrSpatialComponentBounded2DListEXT bounded2dList {
  .type = XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT,
  .boundCount = static_cast<uint32_t>(bounded2dData.size()),
  .bounds = bounded2dData.data(),
};

// Query again
queryResult.next = &bounded2dList;
CHK_XR(xrQuerySpatialComponentDataEXT(
           completion.snapshot, &queryCond, &queryResult));

std::vector<XrSpatialEntityEXT> subsumingPlanes;
for(uint32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
  // access planes[i] for merged plane id
  XrSpatialEntityIdEXT entityId = queryResult.entityIds[i];

  // create handle via entityId.
  XrSpatialEntityFromIdCreateInfoEXT entityCreateInfo {
    .type = XR_TYPE_SPATIAL_ENTITY_FROM_ID_CREATE_INFO_EXT,
    .entityId = entityId,
  };

  XrSpatialEntityEXT entity = XR_NULL_HANDLE;
  xrCreateSpatialEntityFromIdEXT(spatialContext, &entityCreateInfo, &entity);

  subsumingPlanes.push_back(entity);
}

// Cleanup
xrDestroySpatialSnapshotEXT(completion.snapshot);

নতুন কাঠামো

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

  • XR_ANDROID_SPATIAL_COMPONENT_SUBSUMED_BY_EXTENSION_NAME
  • XR_ANDROID_spatial_component_subsumed_by_SPEC_VERSION
  • XrSpatialComponentTypeEXT এর সম্প্রসারণ:

    • XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID
  • XrStructureType সম্প্রসারণ :

    • XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROID
    • XR_TYPE_SPATIAL_DISCOVERY_UNIQUE_ENTITIES_FILTER_ANDROID

সমস্যা

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

  • সংশোধন ১, ২০২৫-১১-১৯ (ব্রায়ান চেন)

    • প্রাথমিক সম্প্রসারণের বিবরণ।