+4
src/xrt/state_trackers/oxr/CMakeLists.txt
+4
src/xrt/state_trackers/oxr/CMakeLists.txt
···
106
106
target_sources(st_oxr PRIVATE oxr_api_body_tracking.c oxr_body_tracking.c)
107
107
endif()
108
108
109
+
if(XRT_FEATURE_OPENXR_FACE_TRACKING_ANDROID)
110
+
target_sources(st_oxr PRIVATE oxr_api_face_tracking_android.c oxr_face_tracking_android.c)
111
+
endif()
112
+
109
113
if(XRT_FEATURE_OPENXR_FACIAL_TRACKING_HTC)
110
114
target_sources(st_oxr PRIVATE oxr_api_face_tracking_htc.c oxr_face_tracking_htc.c)
111
115
endif()
+82
src/xrt/state_trackers/oxr/oxr_api_face_tracking_android.c
+82
src/xrt/state_trackers/oxr/oxr_api_face_tracking_android.c
···
1
+
// Copyright 2025, Collabora, Ltd.
2
+
// SPDX-License-Identifier: BSL-1.0
3
+
/*!
4
+
* @file
5
+
* @brief Android face tracking related API entrypoint functions.
6
+
* @author Korcan Hussein <korcan.hussein@collabora.com>
7
+
* @ingroup oxr_api
8
+
*/
9
+
10
+
#include <stdio.h>
11
+
#include <stdlib.h>
12
+
#include <string.h>
13
+
14
+
#include "util/u_trace_marker.h"
15
+
16
+
#include "oxr_objects.h"
17
+
#include "oxr_logger.h"
18
+
19
+
#include "oxr_api_funcs.h"
20
+
#include "oxr_api_verify.h"
21
+
#include "oxr_handle.h"
22
+
23
+
XRAPI_ATTR XrResult XRAPI_CALL
24
+
oxr_xrCreateFaceTrackerANDROID(XrSession session,
25
+
const XrFaceTrackerCreateInfoANDROID *createInfo,
26
+
XrFaceTrackerANDROID *faceTracker)
27
+
{
28
+
OXR_TRACE_MARKER();
29
+
struct oxr_logger log;
30
+
struct oxr_session *sess = NULL;
31
+
OXR_VERIFY_SESSION_AND_INIT_LOG(&log, session, sess, "xrCreateFaceTrackerANDROID");
32
+
OXR_VERIFY_SESSION_NOT_LOST(&log, sess);
33
+
OXR_VERIFY_EXTENSION(&log, sess->sys->inst, ANDROID_face_tracking);
34
+
OXR_VERIFY_ARG_TYPE_AND_NOT_NULL(&log, createInfo, XR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROID);
35
+
return oxr_face_tracker_android_create(&log, sess, createInfo, faceTracker);
36
+
}
37
+
38
+
XRAPI_ATTR XrResult XRAPI_CALL
39
+
oxr_xrDestroyFaceTrackerANDROID(XrFaceTrackerANDROID facialTracker)
40
+
{
41
+
OXR_TRACE_MARKER();
42
+
struct oxr_logger log;
43
+
struct oxr_face_tracker_android *face_tracker_android = NULL;
44
+
OXR_VERIFY_FACE_TRACKER_ANDROID_AND_INIT_LOG(&log, facialTracker, face_tracker_android,
45
+
"xrDestroyFaceTrackerANDROID");
46
+
return oxr_handle_destroy(&log, &face_tracker_android->handle);
47
+
}
48
+
49
+
XRAPI_ATTR XrResult XRAPI_CALL
50
+
oxr_xrGetFaceStateANDROID(XrFaceTrackerANDROID faceTracker,
51
+
const XrFaceStateGetInfoANDROID *getInfo,
52
+
XrFaceStateANDROID *faceStateOutput)
53
+
{
54
+
OXR_TRACE_MARKER();
55
+
struct oxr_logger log;
56
+
struct oxr_face_tracker_android *face_tracker_android = NULL;
57
+
OXR_VERIFY_FACE_TRACKER_ANDROID_AND_INIT_LOG(&log, faceTracker, face_tracker_android, "xrGetFaceStateANDROID");
58
+
OXR_VERIFY_SESSION_NOT_LOST(&log, face_tracker_android->sess);
59
+
OXR_VERIFY_ARG_NOT_NULL(&log, face_tracker_android->xdev);
60
+
OXR_VERIFY_ARG_TYPE_AND_NOT_NULL(&log, getInfo, XR_TYPE_FACE_STATE_GET_INFO_ANDROID);
61
+
OXR_VERIFY_ARG_TYPE_AND_NOT_NULL(&log, faceStateOutput, XR_TYPE_FACE_STATE_ANDROID);
62
+
OXR_VERIFY_ARG_TIME_NOT_ZERO(&log, getInfo->time);
63
+
OXR_VERIFY_TWO_CALL_ARRAY(&log, faceStateOutput->parametersCapacityInput,
64
+
(&faceStateOutput->parametersCountOutput), faceStateOutput->parameters);
65
+
OXR_VERIFY_TWO_CALL_ARRAY(&log, faceStateOutput->regionConfidencesCapacityInput,
66
+
(&faceStateOutput->regionConfidencesCountOutput), faceStateOutput->regionConfidences);
67
+
return oxr_get_face_state_android(&log, face_tracker_android, getInfo, faceStateOutput);
68
+
}
69
+
70
+
XRAPI_ATTR XrResult XRAPI_CALL
71
+
oxr_xrGetFaceCalibrationStateANDROID(XrFaceTrackerANDROID faceTracker, XrBool32 *faceIsCalibratedOutput)
72
+
{
73
+
OXR_TRACE_MARKER();
74
+
struct oxr_logger log;
75
+
struct oxr_face_tracker_android *face_tracker_android = NULL;
76
+
OXR_VERIFY_FACE_TRACKER_ANDROID_AND_INIT_LOG(&log, faceTracker, face_tracker_android,
77
+
"xrGetFaceCalibrationStateANDROID");
78
+
OXR_VERIFY_SESSION_NOT_LOST(&log, face_tracker_android->sess);
79
+
OXR_VERIFY_ARG_NOT_NULL(&log, face_tracker_android->xdev);
80
+
OXR_VERIFY_ARG_NOT_NULL(&log, faceIsCalibratedOutput);
81
+
return oxr_get_face_calibration_state_android(&log, face_tracker_android, faceIsCalibratedOutput);
82
+
}
+24
src/xrt/state_trackers/oxr/oxr_api_funcs.h
+24
src/xrt/state_trackers/oxr/oxr_api_funcs.h
···
779
779
oxr_xrCancelFutureEXT(XrInstance instance, const XrFutureCancelInfoEXT *cancelInfo);
780
780
#endif
781
781
782
+
/*
783
+
*
784
+
* oxr_api_face_tracking_android.c
785
+
*
786
+
*/
787
+
788
+
#ifdef OXR_HAVE_ANDROID_face_tracking
789
+
XRAPI_ATTR XrResult XRAPI_CALL
790
+
oxr_xrCreateFaceTrackerANDROID(XrSession session,
791
+
const XrFaceTrackerCreateInfoANDROID *createInfo,
792
+
XrFaceTrackerANDROID *faceTracker);
793
+
794
+
XRAPI_ATTR XrResult XRAPI_CALL
795
+
oxr_xrDestroyFaceTrackerANDROID(XrFaceTrackerANDROID facialTracker);
796
+
797
+
XRAPI_ATTR XrResult XRAPI_CALL
798
+
oxr_xrGetFaceStateANDROID(XrFaceTrackerANDROID faceTracker,
799
+
const XrFaceStateGetInfoANDROID *getInfo,
800
+
XrFaceStateANDROID *faceStateOutput);
801
+
802
+
XRAPI_ATTR XrResult XRAPI_CALL
803
+
oxr_xrGetFaceCalibrationStateANDROID(XrFaceTrackerANDROID faceTracker, XrBool32 *faceIsCalibratedOutput);
804
+
#endif
805
+
782
806
/*!
783
807
* @}
784
808
*/
+7
src/xrt/state_trackers/oxr/oxr_api_negotiate.c
+7
src/xrt/state_trackers/oxr/oxr_api_negotiate.c
···
419
419
ENTRY_IF_EXT(xrCancelFutureEXT, EXT_future);
420
420
#endif // OXR_HAVE_EXT_future
421
421
422
+
#ifdef OXR_HAVE_ANDROID_face_tracking
423
+
ENTRY_IF_EXT(xrCreateFaceTrackerANDROID, ANDROID_face_tracking);
424
+
ENTRY_IF_EXT(xrDestroyFaceTrackerANDROID, ANDROID_face_tracking);
425
+
ENTRY_IF_EXT(xrGetFaceCalibrationStateANDROID, ANDROID_face_tracking);
426
+
ENTRY_IF_EXT(xrGetFaceStateANDROID, ANDROID_face_tracking);
427
+
#endif
428
+
422
429
#ifdef OXR_HAVE_KHR_extended_struct_name_lengths
423
430
ENTRY_IF_EXT(xrStructureTypeToString2KHR, KHR_extended_struct_name_lengths);
424
431
#endif // OXR_HAVE_KHR_extended_struct_name_lengths
+2
src/xrt/state_trackers/oxr/oxr_api_verify.h
+2
src/xrt/state_trackers/oxr/oxr_api_verify.h
···
97
97
#define OXR_VERIFY_FUTURE_AND_INIT_LOG(log, thing, new_thing, name) \
98
98
OXR_VERIFY_AND_SET_AND_INIT(log, thing, new_thing, oxr_future_ext, FUTURE, name, new_thing->inst); \
99
99
OXR_VERIFY_FUTURE_VALID(log, new_thing)
100
+
#define OXR_VERIFY_FACE_TRACKER_ANDROID_AND_INIT_LOG(log, thing, new_thing, name) \
101
+
OXR_VERIFY_AND_SET_AND_INIT(log, thing, new_thing, oxr_face_tracker_android, FTRACKER, name, new_thing->sess->sys->inst)
100
102
// clang-format on
101
103
102
104
#define OXR_VERIFY_INSTANCE_NOT_NULL(log, arg, new_arg) OXR_VERIFY_SET(log, arg, new_arg, oxr_instance, INSTANCE);
+51
src/xrt/state_trackers/oxr/oxr_face_tracking_android.c
+51
src/xrt/state_trackers/oxr/oxr_face_tracking_android.c
···
1
+
// Copyright 2025, Collabora, Ltd.
2
+
// SPDX-License-Identifier: BSL-1.0
3
+
/*!
4
+
* @file
5
+
* @brief Android face tracking related API entrypoint functions.
6
+
* @author Korcan Hussein <korcan.hussein@collabora.com>
7
+
* @ingroup oxr_main
8
+
*/
9
+
10
+
#include <stdio.h>
11
+
#include <stdlib.h>
12
+
#include <string.h>
13
+
14
+
#include "oxr_objects.h"
15
+
#include "oxr_logger.h"
16
+
#include "oxr_handle.h"
17
+
18
+
static XrResult
19
+
oxr_face_tracker_android_destroy_cb(struct oxr_logger *log, struct oxr_handle_base *hb)
20
+
{
21
+
struct oxr_face_tracker_android *face_tracker_android = (struct oxr_face_tracker_android *)hb;
22
+
free(face_tracker_android);
23
+
return XR_SUCCESS;
24
+
}
25
+
26
+
XrResult
27
+
oxr_face_tracker_android_create(struct oxr_logger *log,
28
+
struct oxr_session *sess,
29
+
const XrFaceTrackerCreateInfoANDROID *createInfo,
30
+
XrFaceTrackerANDROID *faceTracker)
31
+
{
32
+
return oxr_session_success_result(sess);
33
+
}
34
+
35
+
XrResult
36
+
oxr_get_face_state_android(struct oxr_logger *log,
37
+
struct oxr_face_tracker_android *facial_tracker_android,
38
+
const XrFaceStateGetInfoANDROID *getInfo,
39
+
XrFaceStateANDROID *faceStateOutput)
40
+
{
41
+
42
+
return oxr_session_success_result(facial_tracker_android->sess);
43
+
}
44
+
45
+
XrResult
46
+
oxr_get_face_calibration_state_android(struct oxr_logger *log,
47
+
struct oxr_face_tracker_android *facial_tracker_android,
48
+
XrBool32 *faceIsCalibratedOutput)
49
+
{
50
+
return oxr_session_success_result(facial_tracker_android->sess);
51
+
}
+55
src/xrt/state_trackers/oxr/oxr_objects.h
+55
src/xrt/state_trackers/oxr/oxr_objects.h
···
127
127
struct oxr_action_set_ref;
128
128
struct oxr_action_ref;
129
129
struct oxr_hand_tracker;
130
+
struct oxr_face_tracker_android;
130
131
struct oxr_facial_tracker_htc;
131
132
struct oxr_face_tracker2_fb;
132
133
struct oxr_body_tracker_fb;
···
467
468
return XRT_CAST_PTR_TO_OXR_HANDLE(XrFaceTracker2FB, face_tracker2_fb);
468
469
}
469
470
#endif
471
+
472
+
#ifdef OXR_HAVE_ANDROID_face_tracking
473
+
/*!
474
+
* To go back to a OpenXR object.
475
+
*
476
+
* @relates oxr_facial_tracker_htc
477
+
*/
478
+
static inline XrFaceTrackerANDROID
479
+
oxr_face_tracker_android_to_openxr(struct oxr_face_tracker_android *face_tracker_android)
480
+
{
481
+
return XRT_CAST_PTR_TO_OXR_HANDLE(XrFaceTrackerANDROID, face_tracker_android);
482
+
}
483
+
#endif
484
+
470
485
/*!
471
486
*
472
487
* @name oxr_input.c
···
3093
3108
XrResult
3094
3109
oxr_event_push_XrEventDataUserPresenceChangedEXT(struct oxr_logger *log, struct oxr_session *sess, bool isUserPresent);
3095
3110
#endif // OXR_HAVE_EXT_user_presence
3111
+
3112
+
#ifdef OXR_HAVE_ANDROID_face_tracking
3113
+
/*!
3114
+
* Android specific Facial tracker.
3115
+
*
3116
+
* Parent type/handle is @ref oxr_instance
3117
+
*
3118
+
*
3119
+
* @obj{XrFaceTrackerANDROID}
3120
+
* @extends oxr_handle_base
3121
+
*/
3122
+
struct oxr_face_tracker_android
3123
+
{
3124
+
//! Common structure for things referred to by OpenXR handles.
3125
+
struct oxr_handle_base handle;
3126
+
3127
+
//! Owner of this face tracker.
3128
+
struct oxr_session *sess;
3129
+
3130
+
//! xrt_device backing this face tracker
3131
+
struct xrt_device *xdev;
3132
+
};
3133
+
3134
+
XrResult
3135
+
oxr_face_tracker_android_create(struct oxr_logger *log,
3136
+
struct oxr_session *sess,
3137
+
const XrFaceTrackerCreateInfoANDROID *createInfo,
3138
+
XrFaceTrackerANDROID *faceTracker);
3139
+
3140
+
XrResult
3141
+
oxr_get_face_state_android(struct oxr_logger *log,
3142
+
struct oxr_face_tracker_android *facial_tracker_android,
3143
+
const XrFaceStateGetInfoANDROID *getInfo,
3144
+
XrFaceStateANDROID *faceStateOutput);
3145
+
3146
+
XrResult
3147
+
oxr_get_face_calibration_state_android(struct oxr_logger *log,
3148
+
struct oxr_face_tracker_android *facial_tracker_android,
3149
+
XrBool32 *faceIsCalibratedOutput);
3150
+
#endif // OXR_HAVE_ANDROID_face_tracking
3096
3151
3097
3152
/*!
3098
3153
* @}