Ekstensi OpenXR XR_ANDROID_device_anchor_persistence

String Nama

XR_ANDROID_device_anchor_persistence

Jenis Ekstensi

Ekstensi instance

Registered Extension Number

458

Revisi

1

Dependensi Ekstensi dan Versi

XR_EXT_uuid dan XR_ANDROID_trackables

Tanggal Terakhir Diubah

2024-10-10

Status IP

Tidak ada klaim IP yang diketahui.

Kontributor

Nihav Jain, Google

Levana Chen, Google

Spencer Quin, Google

Kenny Vercaemer, Google

Ringkasan

Ekstensi ini memungkinkan aplikasi mempertahankan, mengambil, dan membatalkan mempertahankan anchor di perangkat saat ini untuk pengguna saat ini, di seluruh aplikasi dan sesi perangkat.

Memeriksa kemampuan sistem

Struktur XrSystemDeviceAnchorPersistencePropertiesANDROID ditentukan sebagai:

typedef struct XrSystemDeviceAnchorPersistencePropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsAnchorPersistence;
} XrSystemDeviceAnchorPersistencePropertiesANDROID;

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur semacam itu yang ditentukan di OpenXR inti atau ekstensi ini.
  • supportsAnchorPersistence adalah XrBool32 yang menunjukkan apakah sistem saat ini mendukung persistensi anchor untuk anchor spasial.

Aplikasi dapat memeriksa apakah sistem mampu mempertahankan anchor spasial (lihat xrCreateAnchorSpaceANDROID) dengan memperluas XrSystemProperties dengan struktur XrSystemDeviceAnchorPersistencePropertiesANDROID saat memanggil xrGetSystemProperties. Untuk anchor yang dapat dilacak yang didukung, aplikasi dapat menggunakan xrEnumerateSupportedPersistenceAnchorTypesANDROID untuk membuat kueri jenis yang didukung.

Jika XR_FALSE ditampilkan untuk supportsAnchorPersistence, maka XR_ERROR_FEATURE_UNSUPPORTED akan ditampilkan dari fungsi persistensi anchor perangkat yang beroperasi pada anchor spasial.

Penggunaan yang Valid (Implisit)

Fungsi xrEnumerateSupportedPersistenceAnchorTypesANDROID ditentukan sebagai:

XrResult xrEnumerateSupportedPersistenceAnchorTypesANDROID(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    uint32_t                                    trackableTypeCapacityInput,
    uint32_t*                                   trackableTypeCountOutput,
    XrTrackableTypeANDROID*                     trackableTypes);

Deskripsi Parameter

  • session adalah XrSession yang membuat XrDeviceAnchorPersistenceANDROID.
  • trackableTypeCapacityInput adalah kapasitas trackableTypes, atau 0 untuk mengambil kapasitas yang diperlukan.
  • trackableTypeCountOutput adalah pointer ke jumlah array, atau pointer ke kapasitas yang diperlukan jika trackableTypeCapacityInput tidak memadai.
  • trackableTypes adalah pointer ke array XrTrackableTypeANDROID, tetapi dapat berupa NULL jika trackableTypeCapacityInput adalah 0.
  • Lihat bagian Parameter Ukuran Buffer untuk mengetahui penjelasan mendetail tentang pengambilan ukuran trackableTypes yang diperlukan.

Aplikasi dapat menggunakan xrEnumerateSupportedPersistenceAnchorTypesANDROID untuk memeriksa dukungan persistensi anchor pada pelacak XrTrackableTypeANDROID lainnya.

Jika XrTrackableTypeANDROID tertentu tidak ditampilkan dalam array trackableTypes, XR_ERROR_FEATURE_UNSUPPORTED akan ditampilkan dari fungsi persistensi anchor perangkat yang beroperasi pada anchor jenis tersebut.

Penggunaan yang Valid (Implisit)

Kode Status

Berhasil

  • XR_SUCCESS

Kegagalan

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

Membuat handle persistensi anchor perangkat

XrDeviceAnchorPersistenceANDROID adalah handle yang mewakili resource yang diperlukan untuk mempertahankan dan melacak anchor yang dipertahankan.

XR_DEFINE_HANDLE(XrDeviceAnchorPersistenceANDROID)

Fungsi xrCreateDeviceAnchorPersistenceANDROID ditentukan sebagai:

XrResult xrCreateDeviceAnchorPersistenceANDROID(
    XrSession                                   session,
    const XrDeviceAnchorPersistenceCreateInfoANDROID* createInfo,
    XrDeviceAnchorPersistenceANDROID*           outHandle);

Deskripsi Parameter

Aplikasi dapat membuat ID XrDeviceAnchorPersistenceANDROID dengan memanggil xrCreateDeviceAnchorPersistenceANDROID. XrDeviceAnchorPersistenceANDROID dapat digunakan dalam panggilan API berikutnya untuk mempertahankan atau membatalkan anchor. Pegangan XrDeviceAnchorPersistenceANDROID harus pada akhirnya dibebaskan menggunakan fungsi xrDestroyDeviceAnchorPersistenceANDROID.

Penggunaan yang Valid (Implisit)

Kode Status

Berhasil

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Kegagalan

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

Struktur XrDeviceAnchorPersistenceCreateInfoANDROID ditentukan sebagai:

typedef struct XrDeviceAnchorPersistenceCreateInfoANDROID {
    XrStructureType    type;
    void*              next;
} XrDeviceAnchorPersistenceCreateInfoANDROID;

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur seperti itu yang ditentukan di OpenXR inti atau ekstensi ini.

Struktur XrDeviceAnchorPersistenceCreateInfoANDROID memberikan opsi pembuatan untuk XrDeviceAnchorPersistenceANDROID saat diteruskan ke xrCreateDeviceAnchorPersistenceANDROID.

Penggunaan yang Valid (Implisit)

Fungsi xrDestroyDeviceAnchorPersistenceANDROID ditentukan sebagai:

XrResult xrDestroyDeviceAnchorPersistenceANDROID(
    XrDeviceAnchorPersistenceANDROID            handle);

Deskripsi Parameter

Fungsi xrDestroyDeviceAnchorPersistenceANDROID menghancurkan handle persistensi anchor perangkat.

Penggunaan yang Valid (Implisit)

Keamanan Thread

  • Akses ke handle, dan nama sebutan turunan apa pun, harus disinkronkan secara eksternal

Kode Status

Berhasil

  • XR_SUCCESS

Kegagalan

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID

Mempertahankan anchor

Fungsi xrPersistAnchorANDROID ditentukan sebagai:

XrResult xrPersistAnchorANDROID(
    XrDeviceAnchorPersistenceANDROID            handle,
    const XrPersistedAnchorSpaceInfoANDROID*    persistedInfo,
    XrUuidEXT*                                  anchorIdOutput);

Deskripsi Parameter

Aplikasi dapat meminta anchor untuk dipertahankan dengan memanggil xrPersistAnchorANDROID. Aplikasi harus tidak mengasumsikan bahwa nilai yang ditampilkan berhasil berarti anchor segera dipertahankan. Aplikasi harus menggunakan xrGetAnchorPersistStateANDROID untuk memeriksa status persist anchor menggunakan anchor XrUuidEXT yang ditampilkan. Aplikasi dapat menggunakan xrUnpersistAnchorANDROID untuk membatalkan persistensi anchor.

  • XR_ERROR_ANCHOR_NOT_TRACKING_ANDROID akan ditampilkan jika anchor tidak dilacak pada saat panggilan.
  • XR_SUCCESS akan ditampilkan setelah anchor dimasukkan ke antrean untuk persistensi.

Penggunaan yang Valid (Implisit)

Kode Status

Berhasil

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Kegagalan

  • XR_ERROR_ANCHOR_NOT_TRACKING_ANDROID
  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED

Struktur XrPersistedAnchorSpaceInfoANDROID ditentukan sebagai:

typedef struct XrPersistedAnchorSpaceInfoANDROID {
    XrStructureType    type;
    void*              next;
    XrSpace            anchor;
} XrPersistedAnchorSpaceInfoANDROID;

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur semacam itu yang ditentukan di OpenXR inti atau ekstensi ini.
  • anchor adalah anchor XrSpace yang sebelumnya dibuat oleh xrCreateAnchorSpaceANDROID untuk dipertahankan.

Penggunaan yang Valid (Implisit)

Fungsi xrGetAnchorPersistStateANDROID ditentukan sebagai:

XrResult xrGetAnchorPersistStateANDROID(
    XrDeviceAnchorPersistenceANDROID            handle,
    const XrUuidEXT*                            anchorId,
    XrAnchorPersistStateANDROID*                persistState);

Deskripsi Parameter

Penggunaan yang Valid (Implisit)

Kode Status

Berhasil

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Kegagalan

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_ANCHOR_ID_NOT_FOUND_ANDROID

Enum XrAnchorPersistStateANDROID ditentukan sebagai:

typedef enum XrAnchorPersistStateANDROID {
    XR_ANCHOR_PERSIST_STATE_PERSIST_NOT_REQUESTED_ANDROID = 0,
    XR_ANCHOR_PERSIST_STATE_PERSIST_PENDING_ANDROID = 1,
    XR_ANCHOR_PERSIST_STATE_PERSISTED_ANDROID = 2
} XrAnchorPersistStateANDROID;

Enum

Deskripsi

XR_ANCHOR_PERSIST_STATE_PERSIST_NOT_REQUESTED_ANDROID

Anchor belum diminta untuk dipertahankan oleh aplikasi.

XR_ANCHOR_PERSIST_STATE_PERSIST_PENDING_ANDROID

Anchor telah diminta untuk dipertahankan, tetapi belum dipertahankan.

XR_ANCHOR_PERSIST_STATE_PERSISTED_ANDROID

Anchor telah berhasil dipertahankan oleh runtime.

Membuat anchor dari data yang dipertahankan

Fungsi xrCreatePersistedAnchorSpaceANDROID ditentukan sebagai:

XrResult xrCreatePersistedAnchorSpaceANDROID(
    XrDeviceAnchorPersistenceANDROID            handle,
    const XrPersistedAnchorSpaceCreateInfoANDROID* createInfo,
    XrSpace*                                    anchorOutput);

Deskripsi Parameter

Aplikasi dapat membuat anchor XrSpace dari anchor yang dipertahankan sebelumnya dengan memanggil xrCreatePersistedAnchorSpaceANDROID dengan XrUuidEXT yang sama. Ini adalah cara lain untuk membuat anchor seperti yang ditentukan dalam XR_ANDROID_trackables.

  • XR_ERROR_ANCHOR_ID_NOT_FOUND_ANDROID akan ditampilkan jika anchor XrUuidEXT tidak ditemukan.

Penggunaan yang Valid (Implisit)

Kode Status

Berhasil

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Kegagalan

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_ANCHOR_ID_NOT_FOUND_ANDROID
  • XR_ERROR_PERSISTED_DATA_NOT_READY_ANDROID

Struktur XrPersistedAnchorSpaceCreateInfoANDROID ditentukan sebagai:

typedef struct XrPersistedAnchorSpaceCreateInfoANDROID {
    XrStructureType    type;
    void*              next;
    XrUuidEXT          anchorId;
} XrPersistedAnchorSpaceCreateInfoANDROID;

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur semacam itu yang ditentukan di OpenXR inti atau ekstensi ini.
  • anchorId adalah XrUuidEXT dari anchor yang dipertahankan untuk membuat XrSpace anchor.

Struktur XrPersistedAnchorSpaceCreateInfoANDROID menyediakan opsi pembuatan untuk anchor saat diteruskan ke xrCreateDeviceAnchorPersistenceANDROID.

Penggunaan yang Valid (Implisit)

Mengurutkan anchor yang dipertahankan

Fungsi xrEnumeratePersistedAnchorsANDROID ditentukan sebagai:

XrResult xrEnumeratePersistedAnchorsANDROID(
    XrDeviceAnchorPersistenceANDROID            handle,
    uint32_t                                    anchorIdsCapacityInput,
    uint32_t*                                   anchorIdsCountOutput,
    XrUuidEXT*                                  anchorIds);

Deskripsi Parameter

  • handle adalah XrDeviceAnchorPersistenceANDROID.
  • anchorIdsCapacityInput adalah kapasitas array anchorIds, atau 0 untuk menunjukkan permintaan guna mengambil kapasitas yang diperlukan.
  • anchorIdsCountOutput adalah pointer ke jumlah anchorIds yang ditulis, atau pointer ke kapasitas yang diperlukan jika anchorIdsCapacityInput tidak memadai.
  • anchorIds adalah pointer ke array struktur XrUuidEXT. Nilainya dapat berupa NULL jika anchorIdsCapacityInput adalah 0.
  • Lihat bagian Parameter Ukuran Buffer untuk mengetahui penjelasan mendetail tentang pengambilan ukuran anchorIds yang diperlukan.

Aplikasi dapat menghitung semua anchor persisten saat ini dengan memanggil xrEnumeratePersistedAnchorsANDROID. anchorIds akan menyimpan UUID anchor yang dipertahankan hingga kapasitas array. Jika kapasitas tidak memadai, aplikasi tidak memiliki jaminan tentang anchor mana yang ditampilkan.

Penggunaan yang Valid (Implisit)

Kode Status

Berhasil

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Kegagalan

  • XR_ERROR_PERSISTED_DATA_NOT_READY_ANDROID
  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SIZE_INSUFFICIENT

Menghapus anchor persisten

Fungsi xrUnpersistAnchorANDROID ditentukan sebagai:

XrResult xrUnpersistAnchorANDROID(
    XrDeviceAnchorPersistenceANDROID            handle,
    const XrUuidEXT*                            anchorId);

Deskripsi Parameter

Aplikasi dapat menghapus anchor yang dipertahankan dengan memanggil xrUnpersistAnchorANDROID dan meneruskan anchor XrUuidEXT dari anchor yang akan dihapus.

  • XR_ERROR_PERSISTED_DATA_NOT_READY_ANDROID akan ditampilkan jika data yang dipertahankan belum siap.
  • XR_ERROR_ANCHOR_ID_NOT_FOUND_ANDROID akan ditampilkan jika anchor XrUuidEXT tidak ditemukan.

Penggunaan yang Valid (Implisit)

Kode Status

Berhasil

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Kegagalan

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_ANCHOR_ID_NOT_FOUND_ANDROID
  • XR_ERROR_PERSISTED_DATA_NOT_READY_ANDROID

Contoh kode untuk persistensi anchor

Contoh kode berikut menunjukkan cara memeriksa kemampuan sistem, mempertahankan, menghitung, dan menghapus anchor, serta membuat anchor dari anchor yang dipertahankan XrUuidEXT.

XrSession session; // previously initialized
XrSpace anchor; // previously initialized

// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrEnumerateSupportedPersistenceAnchorTypesANDROID xrEnumerateSupportedPersistenceAnchorTypesANDROID; // previously initialized
PFN_xrCreateDeviceAnchorPersistenceANDROID xrCreateDeviceAnchorPersistenceANDROID; // previously initialized
PFN_xrDestroyDeviceAnchorPersistenceANDROID xrDestroyDeviceAnchorPersistenceANDROID; // previously initialized
PFN_xrPersistAnchorANDROID xrPersistAnchorANDROID; // previously initialized
PFN_xrGetAnchorPersistStateANDROID xrGetAnchorPersistStateANDROID; // previously initialized
PFN_xrCreatePersistedAnchorSpaceANDROID xrCreatePersistedAnchorSpaceANDROID; // previously initialized
PFN_xrEnumeratePersistedAnchorsANDROID xrEnumeratePersistedAnchorsANDROID; // previously initialized
PFN_xrUnpersistAnchorANDROID xrUnpersistAnchorANDROID; // previously initialized

// Create a device anchor persistence handle
XrDeviceAnchorPersistenceCreateInfoANDROID persistenceHandleCreateInfo;
persistenceHandleCreateInfo.type = XR_TYPE_DEVICE_ANCHOR_PERSISTENCE_CREATE_INFO_ANDROID;
persistenceHandleCreateInfo.next = nullptr;

XrDeviceAnchorPersistenceANDROID persistenceHandle;
CHK_XR(xrCreateDeviceAnchorPersistenceANDROID(session, &persistenceHandleCreateInfo, &persistenceHandle));

/// Persist an anchor
XrPersistedAnchorSpaceInfo anchorSpaceInfo;
anchorSpaceInfo.type = XR_TYPE_PERSISTED_ANCHOR_SPACE_INFO_ANDROID;
anchorSpaceInfo.next = nullptr;
anchorSpaceInfo.anchor = anchor;

XrUuidEXT anchorId;
CHK_XR(xrPersistAnchorANDROID(persistenceHandle, &anchorSpaceInfo, &anchorId));

// ... Update loop ...
// Poll for anchor persist state to confirm if it was successfully persisted
XrAnchorPersistStateANDROID persistState;
CHK_XR(xrGetAnchorPersistStateANDROID(persistenceHandle, &anchorId, &persistState));
if (persistState == XR_ANCHOR_PERSIST_STATE_PERSISTED_ANDROID)  {
  // The anchor was persisted successfully
}

// Enumerate all persisted anchors
uint32_t anchorCountOutput = 0;
std::vector<XrUuidEXT> allAnchors;

CHK_XR(xrEnumeratePersistedAnchorsANDROID(
  persistenceHandle,
  anchorCountOutput,
  &anchorCountOutput,
  nullptr
));
allAnchors.resize(anchorCountOutput, XR_NULL_HANDLE);

// Fetch the actual anchors in an appropriately resized array.
CHK_XR(xrEnumeratePersistedAnchorsANDROID(
  persistenceHandle,
  anchorCountOutput,
  &anchorCountOutput,
  allAnchors.data()
));

// Creating an anchor from a previously persisted anchor using its UUID
XrTime updateTime; // Time used for the current frame's simulation update.
XrUuidEXT anchorId = allAnchors[0];

XrPersistedAnchorSpaceCreateInfo createInfo;
createInfo.type = XR_TYPE_PERSISTED_ANCHOR_CREATE_INFO_ANDROID;
createInfo.next = nullptr;
createInfo.anchorId = anchorId;

XrSpace anchorSpace = XR_NULL_HANDLE;
CHK_XR(xrCreatePersistedAnchorSpaceANDROID(
  persistenceHandle,
  &createInfo,
  &anchorSpace
));

// The anchor was found and retrieved from the local device successfully.
XrSpaceLocation anchorLocation = { XR_TYPE_SPACE_LOCATION };
CHK_XR(xrLocateSpace(anchorSpace, appSpace, updateTime, &anchorLocation));
XrPosef pose = anchorLocation.pose;

// Once app is done with all persistence related tasks
CHK_XR(xrDestroySpace(anchorSpace));
CHK_XR(xrDestroyDeviceAnchorPersistenceANDROID(persistenceHandle));

Jenis Objek Baru

Konstanta Enum Baru

Enumerasi XrObjectType diperluas dengan:

  • XR_OBJECT_TYPE_DEVICE_ANCHOR_PERSISTENCE_ANDROID

Enumerasi XrResult diperluas dengan:

  • XR_ERROR_ANCHOR_ID_NOT_FOUND_ANDROID
  • XR_ERROR_ANCHOR_ALREADY_PERSISTED_ANDROID
  • XR_ERROR_ANCHOR_NOT_TRACKING_ANDROID
  • XR_ERROR_PERSISTED_DATA_NOT_READY_ANDROID

Enumerasi XrStructureType diperluas dengan:

  • XR_TYPE_PERSISTED_ANCHOR_ANDROID
  • XR_TYPE_PERSISTED_ANCHOR_SPACE_CREATE_INFO_ANDROID
  • XR_TYPE_PERSISTED_ANCHOR_SPACE_INFO_ANDROID
  • XR_TYPE_DEVICE_ANCHOR_PERSISTENCE_CREATE_INFO_ANDROID

Enum Baru

Struktur Baru

Fungsi Baru

Masalah

Histori Versi

  • Revisi 1, 10-10-2024 (Kenny Vercaemer)
    • Deskripsi ekstensi awal