while (androidApp->destroyRequested == 0) {
// Read all pending events.
for (;;) {
int events;
struct android_poll_source* source;
// If the timeout is zero, returns immediately without blocking.
// If the timeout is negative, waits indefinitely until an event appears.
const int timeoutMilliseconds = (app.Resumed == false && app.SessionActive == false && androidApp->destroyRequested == 0) ? -1 : 0;
if (ALooper_pollAll(timeoutMilliseconds, NULL, &events, (void**)&source) < 0) {
break;
}
// Process this event.
if (source != NULL) {
source->process(androidApp, source);
}
}
app.HandleXrEvents();
...
}
XrReferenceSpaceCreateInfo spaceCreateInfo = {XR_TYPE_REFERENCE_SPACE_CREATE_INFO};
spaceCreateInfo.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_VIEW;
spaceCreateInfo.poseInReferenceSpace.orientation.w = 1.0f;
OXR(xrCreateReferenceSpace(app.Session, &spaceCreateInfo, &app.HeadSpace));
typedef enum XrSpaceComponentTypeFB {
// Works with xrLocateSpace, etc.
XR_SPACE_COMPONENT_TYPE_LOCATABLE_FB = 0,
// enables save, load, erase, etc.
XR_SPACE_COMPONENT_TYPE_STORABLE_FB = 1,
// Bounded 2D component, used in fb_scene extension.
XR_SPACE_COMPONENT_TYPE_BOUNDED_2D_FB = 3,
// Bounded 3D component, used in fb_scene extension.
XR_SPACE_COMPONENT_TYPE_BOUNDED_3D_FB = 4,
// Semantic labels component, used in fb_scene extension.
XR_SPACE_COMPONENT_TYPE_SEMANTIC_LABELS_FB = 5,
// Room layout component, used in fb_scene extension.
XR_SPACE_COMPONENT_TYPE_ROOM_LAYOUT_FB = 6,
// Space container component, used in fb_spatial_entity_container extension.
XR_SPACE_COMPONENT_TYPE_SPACE_CONTAINER_FB = 7,
XR_SPACE_COMPONENT_TYPE_MAX_ENUM_FB = 0x7FFFFFFF
} XrSpaceComponentTypeFB;
XrResult xrEnumerateSpaceSupportedComponentsFB(
XrSpace space,
uint32_t componentTypesCapacityInput,
uint32_t* componentTypesCountOutput,
XrSpaceComponentTypeFB* componentTypes);
XrResult xrSetSpaceComponentStatusFB(
XrSpace space,
const XrSpaceComponentStatusSetInfoFB* info,
XrAsyncRequestIdFB* requestId);
struct XrSpaceComponentStatusSetInfoFB {
XrStructureType type;
const void* XR_MAY_ALIAS next;
XrSpaceComponentTypeFB componentType;
XrBool32 enabled;
XrDuration timeout;
} XrSpaceComponentStatusSetInfoFB;
XrResult xrGetSpaceComponentStatusFB(
XrSpace space,
XrSpaceComponentTypeFB componentType,
XrSpaceComponentStatusFB* status);
XrResult xrGetSpaceUuidFB(
XrSpace space,
XrUuidEXT* uuid);
typedef struct XrUuidEXT {
uint8_t value[XR_UUID_SIZE_EXT];
} XrUuidEXT;
XrResult xrGetSpaceBoundingBox2DFB(
XrSession session,
XrSpace space,
XrRect2Df* boundingBox2DOutput);
XrResult xrGetSpaceBoundingBox3DFB(
XrSession session,
XrSpace space,
XrRect3DfFB* boundingBox3DOutput);
typedef struct XrExtent3DfFB {
float width;
float height;
float depth;
} XrExtent3DfFB;
typedef struct XrOffset3DfFB {
float x;
float y;
float z;
} XrOffset3DfFB;
typedef struct XrRect3DfFB {
XrOffset3DfFB offset;
XrExtent3DfFB extent;
} XrRect3DfFB;
XrResult xrGetSpaceSemanticLabelsFB( XrSession session, XrSpace space, XrSemanticLabelsFB* semanticLabelsOutput);
typedef struct XrSemanticLabelsFB {
XrStructureType type;
const void* XR_MAY_ALIAS next;
// Input of the label buffer capacity in byte.
uint32_t byteCapacityInput;
// Output of the label buffer size in byte.
uint32_t byteCountOutput;
// Multiple labels represented by raw string, separated by comma (,).
char* labels;
} XrSemanticLabelsFB
セマンティックラベル | 説明 | 幾何学表現 |
ルームの構造 | ||
CEILING | 天井 | 2D |
DOOR_FRAME | ドアの枠。壁面内に存在していなければならない | 2D |
FLOOR | 床 | 2D |
INVISIBLE_WALL_FACE | オープンルームを囲むためにスペースの設定によって追加された壁面 | 2D |
WALL_ART | 壁面アート。壁面内に存在していなければならない | 2D |
WALL_FACE | 壁面 | 2D |
WINDOW_FRAME | 窓枠 - 壁面内に存在していなければならない | 2D |
ルームの内容 | ||
COUCH | ソファー | 2D (シート)と3D (立体) |
TABLE | テーブル | 2D (テーブル上面)と3D (立体) |
BED | ベッド | 2D (サーフェス)と3D (立体) |
LAMP | ランプ | 3D |
PLANT | 植物 | 3D |
SCREEN | スクリーン | 3D |
STORAGE | 保存容器 | 2D (単一の棚)と3D (立体) |
メッシュのオブジェクト | ||
GLOBAL_MESH | スペースの設定中にキャプチャされたユーザーのスペースの三角メッシュ | |
未分類のオブジェクト | ||
OTHER | 一般的な立体 | 3D |
OTHERタイプはフォールバックと考えてください。今後、OTHERがタイプではなくなる可能性があり、このラベルを付けているオブジェクトは、変更が必要になるかもしれません。XrResult xrGetSpaceBoundary2DFB(
XrSession session,
XrSpace space,
XrBoundary2DFB* boundary2DOutput);
// 2D boundary for two-call idiom with xrGetSpaceBoundary2DFB.
struct XrBoundary2DFB {
XrStructureType type;
const void* XR_MAY_ALIAS next;
// Input, capacity of the vertex buffer.
uint32_t vertexCapacityInput;
// Output, size of the vertex buffer.
uint32_t vertexCountOutput;
// Vertices of the polygonal boundary in the coordinate frame of the associated space.
// Currently only support outer bounds.
XrVector2f* vertices;
} XrBoundary2DFB;
XrResult xrGetSpaceRoomLayoutFB(
XrSession session,
XrSpace space,
XrRoomLayoutFB* roomLayoutOutput);
typedef struct XrRoomLayoutFB {
XrStructureType type;
const void* XR_MAY_ALIAS next;
// Floor of the room layout.
XrUuidEXT floorUuid;
// Ceiling of the room layout.
XrUuidEXT ceilingUuid;
// Input, capacity of wall list buffer.
uint32_t wallUuidCapacityInput;
// Output, number of walls included in the list.
uint32_t wallUuidCountOutput;
// Ordered list of walls of the room layout.
XrUuidEXT* wallUuids;
} XrRoomLayoutFB;
XrResult xrGetSpaceContainerFB( XrSession session, XrSpace space, XrSpaceContainerFB* spaceContainerOutput);
typedef struct XrSpaceContainerFB {
XrStructureType type;
const void* XR_MAY_ALIAS next;
// Input, capacity of UUID list.
uint32_t uuidCapacityInput;
// Output, number of spatial entities included in the list.
uint32_t uuidCountOutput;
// List of spatial entities contained in the entity to which this component is attached.
XrUuidEXT* uuids;
} XrSpaceContainerFB;
XrResult xrRequestSceneCaptureFB( XrSession session, const XrSceneCaptureRequestFB* request, XrAsyncRequestIdFB* requestId);
typedef struct XrSceneCaptureRequestFB {
XrStructureType type;
const void* XR_MAY_ALIAS next;
// Length of request buffer.
uint32_t requestByteCount;
// Request buffer.
char* request;
} XrSceneCaptureRequestFB;
typedef struct XrEventDataSceneCaptureCompleteFB {
XrStructureType type; // XR_TYPE_EVENT_SCENE_CAPTURE_COMPLETE_FB
const void* XR_MAY_ALIAS next;
XrResult result;
XrAsyncRequestIdFB requestId;
} XrEventDataSceneCaptureCompleteFB;
XrResult xrQuerySpacesFB(
XrSession session,
const XrSpaceQueryInfoBaseHeaderFB* info,
XrAsyncRequestIdFB* requestId);
typedef struct XrSpaceQueryInfoFB {
XrStructureType type;
const void* XR_MAY_ALIAS next;
XrSpaceQueryActionFB queryAction;
uint32_t maxResultCount;
XrDuration timeout;
const XrSpaceFilterInfoBaseHeaderFB* filter;
const XrSpaceFilterInfoBaseHeaderFB* excludeFilter;
} XrSpaceQueryInfoFB;
typedef enum XrSpaceQueryActionFB {
// returns XrSpaces
XR_SPACE_QUERY_ACTION_LOAD_FB = 0,
XR_SPACE_QUERY_ACTION_MAX_ENUM_FB = 0x7FFFFFFF
} XrSpaceQueryActionFB;
typedef struct XrSpaceComponentFilterInfoFB {
XrStructureType type;
const void* XR_MAY_ALIAS next;
XrSpaceComponentTypeFB componentType;
} XrSpaceComponentFilterInfoFB;
typedef struct XrSpaceUuidFilterInfoFB {
XrStructureType type;
const void* XR_MAY_ALIAS next;
uint32_t uuidCount;
const XrUuidEXT* uuids;
} XrSpaceUuidFilterInfoFB;
typedef struct XrSpaceQueryResultsFB {
XrStructureType type;
const void* XR_MAY_ALIAS next;
uint32_t resultCapacityInput;
uint32_t resultCountOutput;
XrSpaceQueryResultFB* results;
} XrSpaceQueryResultsFB;
typedef struct XrSpaceQueryResultFB {
XrSpace space;
XrUuidEXT uuid;
} XrSpaceQueryResultFB;
XrSpaceStorageLocationFilterInfoFB storageLocationFilterInfo = {
XR_TYPE_SPACE_STORAGE_LOCATION_FILTER_INFO_FB,
nullptr,
XR_SPACE_STORAGE_LOCATION_LOCAL_FB};
XrSpaceComponentFilterInfoFB componentFilterInfo = {
XR_TYPE_SPACE_COMPONENT_FILTER_INFO_FB,
&storageLocationFilterInfo,
XR_SPACE_COMPONENT_TYPE_ROOM_LAYOUT_FB};
XrSpaceQueryInfoFB queryInfo = {
XR_TYPE_SPACE_QUERY_INFO_FB,
nullptr,
XR_SPACE_QUERY_ACTION_LOAD_FB,
MAX_PERSISTENT_SPACES,
0,
(XrSpaceFilterInfoBaseHeaderFB*)&componentFilterInfo,
nullptr};
XrAsyncRequestIdFB requestId;
OXR(app.FunPtrs.xrQuerySpacesFB(
app.Session, (XrSpaceQueryInfoBaseHeaderFB*)&queryInfo, &requestId));
XrRoomLayoutFB roomLayout = {};
// First call
OXR(FunPtrs.xrGetSpaceRoomLayoutFB(Session, space, &roomLayout));
// Second call
std::vector<XrUuidEXT> wallUuids(roomLayout.wallUuidCountOutput
);
roomLayout.wallUuidCapacityInput = wallUuids.size();
roomLayout.wallUuids = wallUuids.data();
OXR(FunPtrs.xrGetSpaceRoomLayoutFB(Session, space, &roomLayout));
if (isValid(roomLayout.floorUuid)) {
uuidSet.insert(uuidToHexString(roomLayout.floorUuid));
}
if (isValid(roomLayout.ceilingUuid)) {
uuidSet.insert(uuidToHexString(roomLayout.ceilingUuid));
}
for (uint32_t i = 0; i < roomLayout.wallUuidCountOutput; i++) {
uuidSet.insert(uuidToHexString(roomLayout.wallUuids[i]));
}
XrSpaceContainerFB spaceContainer = {};
// First call
OXR(FunPtrs.xrGetSpaceContainerFB(Session, space, &spaceContainer));
// Second call
std::vector<XrUuidEXT> uuids(spaceContainer.uuidCountOutput);
spaceContainer.uuidCapacityInput = uuids.size();
spaceContainer.uuids = uuids.data();
OXR(FunPtrs.xrGetSpaceContainerFB(Session, space, &spaceContainer));
for (uint32_t i = 0; i < spaceContainer.uuidCountOutput; i++) {
uuidSet.insert(uuidToHexString(spaceContainer.uuids[i]));
}
XrSpaceStorageLocationFilterInfoFB storageLocationFilterInfo = {
XR_TYPE_SPACE_STORAGE_LOCATION_FILTER_INFO_FB,
nullptr,
XR_SPACE_STORAGE_LOCATION_LOCAL_FB};
XrSpaceUuidFilterInfoFB uuidFilterInfo = {
XR_TYPE_SPACE_UUID_FILTER_INFO_FB,
&storageLocationFilterInfo,
(uint32_t)uuidsToQuery.size(),
uuidsToQuery.data()};
XrSpaceQueryInfoFB queryInfo = {
XR_TYPE_SPACE_QUERY_INFO_FB,
nullptr,
XR_SPACE_QUERY_ACTION_LOAD_FB,
MAX_PERSISTENT_SPACES,
0,
(XrSpaceFilterInfoBaseHeaderFB*)&uuidFilterInfo,
nullptr};
XrAsyncRequestIdFB requestId;
OXR(app.FunPtrs.xrQuerySpacesFB(
app.Session, (XrSpaceQueryInfoBaseHeaderFB*)&queryInfo, &requestId));
XrSpaceStorageLocationFilterInfoFB storageLocationFilterInfo = {
XR_TYPE_SPACE_STORAGE_LOCATION_FILTER_INFO_FB,
nullptr,
XR_SPACE_STORAGE_LOCATION_LOCAL_FB};
XrSpaceComponentFilterInfoFB componentFilterInfo = {
XR_TYPE_SPACE_COMPONENT_FILTER_INFO_FB,
&storageLocationFilterInfo,
XR_SPACE_COMPONENT_TYPE_BOUNDED_2D_FB};
XrSpaceQueryInfoFB queryInfo = {
XR_TYPE_SPACE_QUERY_INFO_FB,
nullptr,
XR_SPACE_QUERY_ACTION_LOAD_FB,
MAX_PERSISTENT_SPACES,
0,
(XrSpaceFilterInfoBaseHeaderFB*)&componentFilterInfo,
nullptr};
XrAsyncRequestIdFB requestId;
OXR(app.FunPtrs.xrQuerySpacesFB(
app.Session, (XrSpaceQueryInfoBaseHeaderFB*)&queryInfo, &requestId));
XrSpaceQueryInfoFB queryInfo = {
XR_TYPE_SPACE_QUERY_INFO_FB,
nullptr,
XR_SPACE_QUERY_ACTION_LOAD_FB,
MAX_PERSISTENT_SPACES,
0,
nullptr,
nullptr};
XrAsyncRequestIdFB requestId;
OXR(app.FunPtrs.xrQuerySpacesFB(
app.Session, (XrSpaceQueryInfoBaseHeaderFB*)&queryInfo, &requestId));