diff --git a/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Commands.cs b/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Commands.cs index 36c985f..43547ab 100644 --- a/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Commands.cs +++ b/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Commands.cs @@ -1907,6 +1907,42 @@ public static XrResult xrDestroyBodyTrackerBD(XrBodyTrackerBD bodyTracker) public static XrResult xrLocateBodyJointsBD(XrBodyTrackerBD bodyTracker, XrBodyJointsLocateInfoBD* locateInfo, XrBodyJointLocationsBD* locations) => xrLocateBodyJointsBD_ptr(bodyTracker, locateInfo, locations); + [UnmanagedFunctionPointer(CallConv)] + private delegate XrResult xrEnumerateFacialSimulationModesBDDelegate(XrSession session, uint modeCapacityInput, uint* modeCountOutput, XrFacialSimulationModeBD* modes); + private static xrEnumerateFacialSimulationModesBDDelegate xrEnumerateFacialSimulationModesBD_ptr; + public static XrResult xrEnumerateFacialSimulationModesBD(XrSession session, uint modeCapacityInput, uint* modeCountOutput, XrFacialSimulationModeBD* modes) + => xrEnumerateFacialSimulationModesBD_ptr(session, modeCapacityInput, modeCountOutput, modes); + + [UnmanagedFunctionPointer(CallConv)] + private delegate XrResult xrCreateFaceTrackerBDDelegate(XrSession session, XrFaceTrackerCreateInfoBD* createInfo, XrFaceTrackerBD* tracker); + private static xrCreateFaceTrackerBDDelegate xrCreateFaceTrackerBD_ptr; + public static XrResult xrCreateFaceTrackerBD(XrSession session, XrFaceTrackerCreateInfoBD* createInfo, XrFaceTrackerBD* tracker) + => xrCreateFaceTrackerBD_ptr(session, createInfo, tracker); + + [UnmanagedFunctionPointer(CallConv)] + private delegate XrResult xrDestroyFaceTrackerBDDelegate(XrFaceTrackerBD tracker); + private static xrDestroyFaceTrackerBDDelegate xrDestroyFaceTrackerBD_ptr; + public static XrResult xrDestroyFaceTrackerBD(XrFaceTrackerBD tracker) + => xrDestroyFaceTrackerBD_ptr(tracker); + + [UnmanagedFunctionPointer(CallConv)] + private delegate XrResult xrGetFacialSimulationDataBDDelegate(XrFaceTrackerBD tracker, XrFacialSimulationDataGetInfoBD* info, XrFacialSimulationDataBD* facialData); + private static xrGetFacialSimulationDataBDDelegate xrGetFacialSimulationDataBD_ptr; + public static XrResult xrGetFacialSimulationDataBD(XrFaceTrackerBD tracker, XrFacialSimulationDataGetInfoBD* info, XrFacialSimulationDataBD* facialData) + => xrGetFacialSimulationDataBD_ptr(tracker, info, facialData); + + [UnmanagedFunctionPointer(CallConv)] + private delegate XrResult xrSetFacialSimulationModeBDDelegate(XrFaceTrackerBD tracker, XrFacialSimulationModeBD mode); + private static xrSetFacialSimulationModeBDDelegate xrSetFacialSimulationModeBD_ptr; + public static XrResult xrSetFacialSimulationModeBD(XrFaceTrackerBD tracker, XrFacialSimulationModeBD mode) + => xrSetFacialSimulationModeBD_ptr(tracker, mode); + + [UnmanagedFunctionPointer(CallConv)] + private delegate XrResult xrGetFacialSimulationModeBDDelegate(XrFaceTrackerBD tracker, XrFacialSimulationModeBD* mode); + private static xrGetFacialSimulationModeBDDelegate xrGetFacialSimulationModeBD_ptr; + public static XrResult xrGetFacialSimulationModeBD(XrFaceTrackerBD tracker, XrFacialSimulationModeBD* mode) + => xrGetFacialSimulationModeBD_ptr(tracker, mode); + [UnmanagedFunctionPointer(CallConv)] private delegate XrResult xrEnumerateSpatialEntityComponentTypesBDDelegate(XrSenseDataSnapshotBD snapshot, ulong entityId, uint componentTypeCapacityInput, uint* componentTypeCountOutput, XrSpatialEntityComponentTypeBD* componentTypes); private static xrEnumerateSpatialEntityComponentTypesBDDelegate xrEnumerateSpatialEntityComponentTypesBD_ptr; @@ -2207,6 +2243,30 @@ public static XrResult xrEnumeratePersistedAnchorsANDROID(XrDeviceAnchorPersiste public static XrResult xrUnpersistAnchorANDROID(XrDeviceAnchorPersistenceANDROID handle, XrUuid* anchorId) => xrUnpersistAnchorANDROID_ptr(handle, anchorId); + [UnmanagedFunctionPointer(CallConv)] + private delegate XrResult xrCreateFaceTrackerANDROIDDelegate(XrSession session, XrFaceTrackerCreateInfoANDROID* createInfo, XrFaceTrackerANDROID* faceTracker); + private static xrCreateFaceTrackerANDROIDDelegate xrCreateFaceTrackerANDROID_ptr; + public static XrResult xrCreateFaceTrackerANDROID(XrSession session, XrFaceTrackerCreateInfoANDROID* createInfo, XrFaceTrackerANDROID* faceTracker) + => xrCreateFaceTrackerANDROID_ptr(session, createInfo, faceTracker); + + [UnmanagedFunctionPointer(CallConv)] + private delegate XrResult xrDestroyFaceTrackerANDROIDDelegate(XrFaceTrackerANDROID faceTracker); + private static xrDestroyFaceTrackerANDROIDDelegate xrDestroyFaceTrackerANDROID_ptr; + public static XrResult xrDestroyFaceTrackerANDROID(XrFaceTrackerANDROID faceTracker) + => xrDestroyFaceTrackerANDROID_ptr(faceTracker); + + [UnmanagedFunctionPointer(CallConv)] + private delegate XrResult xrGetFaceStateANDROIDDelegate(XrFaceTrackerANDROID faceTracker, XrFaceStateGetInfoANDROID* getInfo, XrFaceStateANDROID* faceStateOutput); + private static xrGetFaceStateANDROIDDelegate xrGetFaceStateANDROID_ptr; + public static XrResult xrGetFaceStateANDROID(XrFaceTrackerANDROID faceTracker, XrFaceStateGetInfoANDROID* getInfo, XrFaceStateANDROID* faceStateOutput) + => xrGetFaceStateANDROID_ptr(faceTracker, getInfo, faceStateOutput); + + [UnmanagedFunctionPointer(CallConv)] + private delegate XrResult xrGetFaceCalibrationStateANDROIDDelegate(XrFaceTrackerANDROID faceTracker, XrBool32* faceIsCalibratedOutput); + private static xrGetFaceCalibrationStateANDROIDDelegate xrGetFaceCalibrationStateANDROID_ptr; + public static XrResult xrGetFaceCalibrationStateANDROID(XrFaceTrackerANDROID faceTracker, XrBool32* faceIsCalibratedOutput) + => xrGetFaceCalibrationStateANDROID_ptr(faceTracker, faceIsCalibratedOutput); + [UnmanagedFunctionPointer(CallConv)] private delegate XrResult xrGetPassthroughCameraStateANDROIDDelegate(XrSession session, XrPassthroughCameraStateGetInfoANDROID* getInfo, XrPassthroughCameraStateANDROID* cameraStateOutput); private static xrGetPassthroughCameraStateANDROIDDelegate xrGetPassthroughCameraStateANDROID_ptr; @@ -2873,6 +2933,12 @@ public static void LoadFunctionPointers(XrInstance instance = default) nativeLib.LoadFunction("xrCreateBodyTrackerBD", out xrCreateBodyTrackerBD_ptr); nativeLib.LoadFunction("xrDestroyBodyTrackerBD", out xrDestroyBodyTrackerBD_ptr); nativeLib.LoadFunction("xrLocateBodyJointsBD", out xrLocateBodyJointsBD_ptr); + nativeLib.LoadFunction("xrEnumerateFacialSimulationModesBD", out xrEnumerateFacialSimulationModesBD_ptr); + nativeLib.LoadFunction("xrCreateFaceTrackerBD", out xrCreateFaceTrackerBD_ptr); + nativeLib.LoadFunction("xrDestroyFaceTrackerBD", out xrDestroyFaceTrackerBD_ptr); + nativeLib.LoadFunction("xrGetFacialSimulationDataBD", out xrGetFacialSimulationDataBD_ptr); + nativeLib.LoadFunction("xrSetFacialSimulationModeBD", out xrSetFacialSimulationModeBD_ptr); + nativeLib.LoadFunction("xrGetFacialSimulationModeBD", out xrGetFacialSimulationModeBD_ptr); nativeLib.LoadFunction("xrEnumerateSpatialEntityComponentTypesBD", out xrEnumerateSpatialEntityComponentTypesBD_ptr); nativeLib.LoadFunction("xrGetSpatialEntityUuidBD", out xrGetSpatialEntityUuidBD_ptr); nativeLib.LoadFunction("xrGetSpatialEntityComponentDataBD", out xrGetSpatialEntityComponentDataBD_ptr); @@ -2923,6 +2989,10 @@ public static void LoadFunctionPointers(XrInstance instance = default) nativeLib.LoadFunction("xrCreatePersistedAnchorSpaceANDROID", out xrCreatePersistedAnchorSpaceANDROID_ptr); nativeLib.LoadFunction("xrEnumeratePersistedAnchorsANDROID", out xrEnumeratePersistedAnchorsANDROID_ptr); nativeLib.LoadFunction("xrUnpersistAnchorANDROID", out xrUnpersistAnchorANDROID_ptr); + nativeLib.LoadFunction("xrCreateFaceTrackerANDROID", out xrCreateFaceTrackerANDROID_ptr); + nativeLib.LoadFunction("xrDestroyFaceTrackerANDROID", out xrDestroyFaceTrackerANDROID_ptr); + nativeLib.LoadFunction("xrGetFaceStateANDROID", out xrGetFaceStateANDROID_ptr); + nativeLib.LoadFunction("xrGetFaceCalibrationStateANDROID", out xrGetFaceCalibrationStateANDROID_ptr); nativeLib.LoadFunction("xrGetPassthroughCameraStateANDROID", out xrGetPassthroughCameraStateANDROID_ptr); nativeLib.LoadFunction("xrEnumerateRaycastSupportedTrackableTypesANDROID", out xrEnumerateRaycastSupportedTrackableTypesANDROID_ptr); nativeLib.LoadFunction("xrRaycastANDROID", out xrRaycastANDROID_ptr); diff --git a/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Constants.cs b/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Constants.cs index 0044129..f5ce4f7 100644 --- a/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Constants.cs +++ b/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Constants.cs @@ -42,17 +42,17 @@ public static partial class OpenXRNative public const string XR_KHR_COMPOSITION_LAYER_EQUIRECT_EXTENSION_NAME = "XR_KHR_composition_layer_equirect"; public const uint XR_EXT_debug_utils_SPEC_VERSION = 5; public const string XR_EXT_DEBUG_UTILS_EXTENSION_NAME = "XR_EXT_debug_utils"; - public const uint XR_KHR_opengl_enable_SPEC_VERSION = 11; + public const uint XR_KHR_opengl_enable_SPEC_VERSION = 12; public const string XR_KHR_OPENGL_ENABLE_EXTENSION_NAME = "XR_KHR_opengl_enable"; - public const uint XR_KHR_opengl_es_enable_SPEC_VERSION = 9; + public const uint XR_KHR_opengl_es_enable_SPEC_VERSION = 10; public const string XR_KHR_OPENGL_ES_ENABLE_EXTENSION_NAME = "XR_KHR_opengl_es_enable"; - public const uint XR_KHR_vulkan_enable_SPEC_VERSION = 9; + public const uint XR_KHR_vulkan_enable_SPEC_VERSION = 10; public const string XR_KHR_VULKAN_ENABLE_EXTENSION_NAME = "XR_KHR_vulkan_enable"; - public const uint XR_KHR_D3D11_enable_SPEC_VERSION = 10; + public const uint XR_KHR_D3D11_enable_SPEC_VERSION = 11; public const string XR_KHR_D3D11_ENABLE_EXTENSION_NAME = "XR_KHR_D3D11_enable"; - public const uint XR_KHR_D3D12_enable_SPEC_VERSION = 10; + public const uint XR_KHR_D3D12_enable_SPEC_VERSION = 11; public const string XR_KHR_D3D12_ENABLE_EXTENSION_NAME = "XR_KHR_D3D12_enable"; - public const uint XR_KHR_metal_enable_SPEC_VERSION = 2; + public const uint XR_KHR_metal_enable_SPEC_VERSION = 3; public const string XR_KHR_METAL_ENABLE_EXTENSION_NAME = "XR_KHR_metal_enable"; public const uint XR_EXT_eye_gaze_interaction_SPEC_VERSION = 2; public const string XR_EXT_EYE_GAZE_INTERACTION_EXTENSION_NAME = "XR_EXT_eye_gaze_interaction"; @@ -76,7 +76,7 @@ public static partial class OpenXRNative public const string XR_FB_COMPOSITION_LAYER_IMAGE_LAYOUT_EXTENSION_NAME = "XR_FB_composition_layer_image_layout"; public const uint XR_FB_composition_layer_alpha_blend_SPEC_VERSION = 3; public const string XR_FB_COMPOSITION_LAYER_ALPHA_BLEND_EXTENSION_NAME = "XR_FB_composition_layer_alpha_blend"; - public const uint XR_MND_headless_SPEC_VERSION = 2; + public const uint XR_MND_headless_SPEC_VERSION = 3; public const string XR_MND_HEADLESS_EXTENSION_NAME = "XR_MND_headless"; public const uint XR_OCULUS_android_session_state_enable_SPEC_VERSION = 1; public const string XR_OCULUS_ANDROID_SESSION_STATE_ENABLE_EXTENSION_NAME = "XR_OCULUS_android_session_state_enable"; @@ -132,7 +132,7 @@ public static partial class OpenXRNative public const string XR_KHR_LOADER_INIT_EXTENSION_NAME = "XR_KHR_loader_init"; public const uint XR_KHR_loader_init_android_SPEC_VERSION = 1; public const string XR_KHR_LOADER_INIT_ANDROID_EXTENSION_NAME = "XR_KHR_loader_init_android"; - public const uint XR_KHR_vulkan_enable2_SPEC_VERSION = 3; + public const uint XR_KHR_vulkan_enable2_SPEC_VERSION = 4; public const string XR_KHR_VULKAN_ENABLE2_EXTENSION_NAME = "XR_KHR_vulkan_enable2"; public const uint XR_KHR_composition_layer_equirect2_SPEC_VERSION = 1; public const string XR_KHR_COMPOSITION_LAYER_EQUIRECT2_EXTENSION_NAME = "XR_KHR_composition_layer_equirect2"; @@ -335,7 +335,7 @@ public static partial class OpenXRNative public const uint XR_META_spatial_entity_sharing_SPEC_VERSION = 1; public const string XR_META_SPATIAL_ENTITY_SHARING_EXTENSION_NAME = "XR_META_spatial_entity_sharing"; public const uint XR_MAX_SPACES_PER_SHARE_REQUEST_META = 32; - public const uint XR_META_environment_depth_SPEC_VERSION = 1; + public const uint XR_META_environment_depth_SPEC_VERSION = 2; public const string XR_META_ENVIRONMENT_DEPTH_EXTENSION_NAME = "XR_META_environment_depth"; public const uint XR_EXT_uuid_SPEC_VERSION = 1; public const string XR_EXT_UUID_EXTENSION_NAME = "XR_EXT_uuid"; @@ -367,6 +367,8 @@ public static partial class OpenXRNative public const string XR_BD_CONTROLLER_INTERACTION_EXTENSION_NAME = "XR_BD_controller_interaction"; public const uint XR_BD_body_tracking_SPEC_VERSION = 1; public const string XR_BD_BODY_TRACKING_EXTENSION_NAME = "XR_BD_body_tracking"; + public const uint XR_BD_facial_simulation_SPEC_VERSION = 1; + public const string XR_BD_FACIAL_SIMULATION_EXTENSION_NAME = "XR_BD_facial_simulation"; public const uint XR_BD_spatial_sensing_SPEC_VERSION = 1; public const string XR_BD_SPATIAL_SENSING_EXTENSION_NAME = "XR_BD_spatial_sensing"; public const uint XR_BD_spatial_anchor_SPEC_VERSION = 2; @@ -381,6 +383,8 @@ public static partial class OpenXRNative public const string XR_BD_FUTURE_PROGRESS_EXTENSION_NAME = "XR_BD_future_progress"; public const uint XR_BD_spatial_plane_SPEC_VERSION = 1; public const string XR_BD_SPATIAL_PLANE_EXTENSION_NAME = "XR_BD_spatial_plane"; + public const uint XR_BD_ultra_controller_interaction_SPEC_VERSION = 1; + public const string XR_BD_ULTRA_CONTROLLER_INTERACTION_EXTENSION_NAME = "XR_BD_ultra_controller_interaction"; public const uint XR_EXT_local_floor_SPEC_VERSION = 1; public const string XR_EXT_LOCAL_FLOOR_EXTENSION_NAME = "XR_EXT_local_floor"; public const uint XR_EXT_hand_tracking_data_source_SPEC_VERSION = 1; @@ -393,13 +397,17 @@ public static partial class OpenXRNative public const string XR_ANDROID_TRACKABLES_EXTENSION_NAME = "XR_ANDROID_trackables"; public const uint XR_ANDROID_device_anchor_persistence_SPEC_VERSION = 1; public const string XR_ANDROID_DEVICE_ANCHOR_PERSISTENCE_EXTENSION_NAME = "XR_ANDROID_device_anchor_persistence"; + public const uint XR_ANDROID_face_tracking_SPEC_VERSION = 1; + public const string XR_ANDROID_FACE_TRACKING_EXTENSION_NAME = "XR_ANDROID_face_tracking"; + public const uint XR_FACE_PARAMETER_COUNT_ANDROID = 68; + public const uint XR_FACE_REGION_CONFIDENCE_COUNT_ANDROID = 3; public const uint XR_ANDROID_passthrough_camera_state_SPEC_VERSION = 1; public const string XR_ANDROID_PASSTHROUGH_CAMERA_STATE_EXTENSION_NAME = "XR_ANDROID_passthrough_camera_state"; public const uint XR_ANDROID_raycast_SPEC_VERSION = 1; public const string XR_ANDROID_RAYCAST_EXTENSION_NAME = "XR_ANDROID_raycast"; - public const uint XR_ANDROID_trackables_object_SPEC_VERSION = 1; + public const uint XR_ANDROID_trackables_object_SPEC_VERSION = 2; public const string XR_ANDROID_TRACKABLES_OBJECT_EXTENSION_NAME = "XR_ANDROID_trackables_object"; - public const uint XR_EXT_future_SPEC_VERSION = 1; + public const uint XR_EXT_future_SPEC_VERSION = 2; public const string XR_EXT_FUTURE_EXTENSION_NAME = "XR_EXT_future"; public const uint XR_NULL_FUTURE_EXT = 0; public const uint XR_EXT_user_presence_SPEC_VERSION = 1; diff --git a/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Enums.cs b/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Enums.cs index 4ee6a78..8f2c6b1 100644 --- a/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Enums.cs +++ b/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Enums.cs @@ -372,6 +372,7 @@ public enum XrStructureType XR_TYPE_ENVIRONMENT_DEPTH_IMAGE_META = 1000291005, XR_TYPE_ENVIRONMENT_DEPTH_HAND_REMOVAL_SET_INFO_META = 1000291006, XR_TYPE_SYSTEM_ENVIRONMENT_DEPTH_PROPERTIES_META = 1000291007, + XR_TYPE_ENVIRONMENT_DEPTH_IMAGE_TIMESTAMP_META = 1000291008, XR_TYPE_RENDER_MODEL_CREATE_INFO_EXT = 1000300000, XR_TYPE_RENDER_MODEL_PROPERTIES_GET_INFO_EXT = 1000300001, XR_TYPE_RENDER_MODEL_PROPERTIES_EXT = 1000300002, @@ -408,6 +409,11 @@ public enum XrStructureType XR_TYPE_BODY_JOINTS_LOCATE_INFO_BD = 1000385002, XR_TYPE_BODY_JOINT_LOCATIONS_BD = 1000385003, XR_TYPE_SYSTEM_BODY_TRACKING_PROPERTIES_BD = 1000385004, + XR_TYPE_SYSTEM_FACIAL_SIMULATION_PROPERTIES_BD = 1000386001, + XR_TYPE_FACE_TRACKER_CREATE_INFO_BD = 1000386002, + XR_TYPE_FACIAL_SIMULATION_DATA_GET_INFO_BD = 1000386003, + XR_TYPE_FACIAL_SIMULATION_DATA_BD = 1000386004, + XR_TYPE_LIP_EXPRESSION_DATA_BD = 1000386005, XR_TYPE_SYSTEM_SPATIAL_SENSING_PROPERTIES_BD = 1000389000, XR_TYPE_SPATIAL_ENTITY_COMPONENT_GET_INFO_BD = 1000389001, XR_TYPE_SPATIAL_ENTITY_LOCATION_GET_INFO_BD = 1000389002, @@ -464,6 +470,10 @@ public enum XrStructureType XR_TYPE_PERSISTED_ANCHOR_SPACE_INFO_ANDROID = 1000457002, XR_TYPE_DEVICE_ANCHOR_PERSISTENCE_CREATE_INFO_ANDROID = 1000457003, XR_TYPE_SYSTEM_DEVICE_ANCHOR_PERSISTENCE_PROPERTIES_ANDROID = 1000457004, + XR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROID = 1000458000, + XR_TYPE_FACE_STATE_GET_INFO_ANDROID = 1000458001, + XR_TYPE_FACE_STATE_ANDROID = 1000458002, + XR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES_ANDROID = 1000458003, XR_TYPE_PASSTHROUGH_CAMERA_STATE_GET_INFO_ANDROID = 1000460000, XR_TYPE_SYSTEM_PASSTHROUGH_CAMERA_STATE_PROPERTIES_ANDROID = 1000460001, XR_TYPE_RAYCAST_INFO_ANDROID = 1000463000, @@ -706,6 +716,7 @@ public enum XrResult XR_ERROR_ANCHOR_ALREADY_PERSISTED_ANDROID = -1000457001, XR_ERROR_ANCHOR_NOT_TRACKING_ANDROID = -1000457002, XR_ERROR_PERSISTED_DATA_NOT_READY_ANDROID = -1000457003, + XR_ERROR_SERVICE_NOT_READY_ANDROID = -1000458000, XR_ERROR_FUTURE_PENDING_EXT = -1000469001, XR_ERROR_FUTURE_INVALID_EXT = -1000469002, XR_ERROR_SYSTEM_NOTIFICATION_PERMISSION_DENIED_ML = -1000473000, @@ -768,12 +779,14 @@ public enum XrObjectType XR_OBJECT_TYPE_PASSTHROUGH_HTC = 1000317000, XR_OBJECT_TYPE_BODY_TRACKER_HTC = 1000320000, XR_OBJECT_TYPE_BODY_TRACKER_BD = 1000385000, + XR_OBJECT_TYPE_FACE_TRACKER_BD = 1000386000, XR_OBJECT_TYPE_SENSE_DATA_PROVIDER_BD = 1000389000, XR_OBJECT_TYPE_SENSE_DATA_SNAPSHOT_BD = 1000389001, XR_OBJECT_TYPE_ANCHOR_BD = 1000389002, XR_OBJECT_TYPE_PLANE_DETECTOR_EXT = 1000429000, XR_OBJECT_TYPE_TRACKABLE_TRACKER_ANDROID = 1000455001, XR_OBJECT_TYPE_DEVICE_ANCHOR_PERSISTENCE_ANDROID = 1000457000, + XR_OBJECT_TYPE_FACE_TRACKER_ANDROID = 1000458000, XR_OBJECT_TYPE_WORLD_MESH_DETECTOR_ML = 1000474000, XR_OBJECT_TYPE_FACIAL_EXPRESSION_CLIENT_ML = 1000482000, XR_OBJECT_TYPE_SPATIAL_ENTITY_EXT = 1000740000, @@ -2165,6 +2178,92 @@ public enum XrCompareOpFB XR_COMPARE_OP_ALWAYS_FB = 7, } + public enum XrFaceParameterIndicesANDROID + { + XR_FACE_PARAMETER_INDICES_BROW_LOWERER_L_ANDROID = 0, + XR_FACE_PARAMETER_INDICES_BROW_LOWERER_R_ANDROID = 1, + XR_FACE_PARAMETER_INDICES_CHEEK_PUFF_L_ANDROID = 2, + XR_FACE_PARAMETER_INDICES_CHEEK_PUFF_R_ANDROID = 3, + XR_FACE_PARAMETER_INDICES_CHEEK_RAISER_L_ANDROID = 4, + XR_FACE_PARAMETER_INDICES_CHEEK_RAISER_R_ANDROID = 5, + XR_FACE_PARAMETER_INDICES_CHEEK_SUCK_L_ANDROID = 6, + XR_FACE_PARAMETER_INDICES_CHEEK_SUCK_R_ANDROID = 7, + XR_FACE_PARAMETER_INDICES_CHIN_RAISER_B_ANDROID = 8, + XR_FACE_PARAMETER_INDICES_CHIN_RAISER_T_ANDROID = 9, + XR_FACE_PARAMETER_INDICES_DIMPLER_L_ANDROID = 10, + XR_FACE_PARAMETER_INDICES_DIMPLER_R_ANDROID = 11, + XR_FACE_PARAMETER_INDICES_EYES_CLOSED_L_ANDROID = 12, + XR_FACE_PARAMETER_INDICES_EYES_CLOSED_R_ANDROID = 13, + XR_FACE_PARAMETER_INDICES_EYES_LOOK_DOWN_L_ANDROID = 14, + XR_FACE_PARAMETER_INDICES_EYES_LOOK_DOWN_R_ANDROID = 15, + XR_FACE_PARAMETER_INDICES_EYES_LOOK_LEFT_L_ANDROID = 16, + XR_FACE_PARAMETER_INDICES_EYES_LOOK_LEFT_R_ANDROID = 17, + XR_FACE_PARAMETER_INDICES_EYES_LOOK_RIGHT_L_ANDROID = 18, + XR_FACE_PARAMETER_INDICES_EYES_LOOK_RIGHT_R_ANDROID = 19, + XR_FACE_PARAMETER_INDICES_EYES_LOOK_UP_L_ANDROID = 20, + XR_FACE_PARAMETER_INDICES_EYES_LOOK_UP_R_ANDROID = 21, + XR_FACE_PARAMETER_INDICES_INNER_BROW_RAISER_L_ANDROID = 22, + XR_FACE_PARAMETER_INDICES_INNER_BROW_RAISER_R_ANDROID = 23, + XR_FACE_PARAMETER_INDICES_JAW_DROP_ANDROID = 24, + XR_FACE_PARAMETER_INDICES_JAW_SIDEWAYS_LEFT_ANDROID = 25, + XR_FACE_PARAMETER_INDICES_JAW_SIDEWAYS_RIGHT_ANDROID = 26, + XR_FACE_PARAMETER_INDICES_JAW_THRUST_ANDROID = 27, + XR_FACE_PARAMETER_INDICES_LID_TIGHTENER_L_ANDROID = 28, + XR_FACE_PARAMETER_INDICES_LID_TIGHTENER_R_ANDROID = 29, + XR_FACE_PARAMETER_INDICES_LIP_CORNER_DEPRESSOR_L_ANDROID = 30, + XR_FACE_PARAMETER_INDICES_LIP_CORNER_DEPRESSOR_R_ANDROID = 31, + XR_FACE_PARAMETER_INDICES_LIP_CORNER_PULLER_L_ANDROID = 32, + XR_FACE_PARAMETER_INDICES_LIP_CORNER_PULLER_R_ANDROID = 33, + XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_LB_ANDROID = 34, + XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_LT_ANDROID = 35, + XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_RB_ANDROID = 36, + XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_RT_ANDROID = 37, + XR_FACE_PARAMETER_INDICES_LIP_PRESSOR_L_ANDROID = 38, + XR_FACE_PARAMETER_INDICES_LIP_PRESSOR_R_ANDROID = 39, + XR_FACE_PARAMETER_INDICES_LIP_PUCKER_L_ANDROID = 40, + XR_FACE_PARAMETER_INDICES_LIP_PUCKER_R_ANDROID = 41, + XR_FACE_PARAMETER_INDICES_LIP_STRETCHER_L_ANDROID = 42, + XR_FACE_PARAMETER_INDICES_LIP_STRETCHER_R_ANDROID = 43, + XR_FACE_PARAMETER_INDICES_LIP_SUCK_LB_ANDROID = 44, + XR_FACE_PARAMETER_INDICES_LIP_SUCK_LT_ANDROID = 45, + XR_FACE_PARAMETER_INDICES_LIP_SUCK_RB_ANDROID = 46, + XR_FACE_PARAMETER_INDICES_LIP_SUCK_RT_ANDROID = 47, + XR_FACE_PARAMETER_INDICES_LIP_TIGHTENER_L_ANDROID = 48, + XR_FACE_PARAMETER_INDICES_LIP_TIGHTENER_R_ANDROID = 49, + XR_FACE_PARAMETER_INDICES_LIPS_TOWARD_ANDROID = 50, + XR_FACE_PARAMETER_INDICES_LOWER_LIP_DEPRESSOR_L_ANDROID = 51, + XR_FACE_PARAMETER_INDICES_LOWER_LIP_DEPRESSOR_R_ANDROID = 52, + XR_FACE_PARAMETER_INDICES_MOUTH_LEFT_ANDROID = 53, + XR_FACE_PARAMETER_INDICES_MOUTH_RIGHT_ANDROID = 54, + XR_FACE_PARAMETER_INDICES_NOSE_WRINKLER_L_ANDROID = 55, + XR_FACE_PARAMETER_INDICES_NOSE_WRINKLER_R_ANDROID = 56, + XR_FACE_PARAMETER_INDICES_OUTER_BROW_RAISER_L_ANDROID = 57, + XR_FACE_PARAMETER_INDICES_OUTER_BROW_RAISER_R_ANDROID = 58, + XR_FACE_PARAMETER_INDICES_UPPER_LID_RAISER_L_ANDROID = 59, + XR_FACE_PARAMETER_INDICES_UPPER_LID_RAISER_R_ANDROID = 60, + XR_FACE_PARAMETER_INDICES_UPPER_LIP_RAISER_L_ANDROID = 61, + XR_FACE_PARAMETER_INDICES_UPPER_LIP_RAISER_R_ANDROID = 62, + XR_FACE_PARAMETER_INDICES_TONGUE_OUT_ANDROID = 63, + XR_FACE_PARAMETER_INDICES_TONGUE_LEFT_ANDROID = 64, + XR_FACE_PARAMETER_INDICES_TONGUE_RIGHT_ANDROID = 65, + XR_FACE_PARAMETER_INDICES_TONGUE_UP_ANDROID = 66, + XR_FACE_PARAMETER_INDICES_TONGUE_DOWN_ANDROID = 67, + } + + public enum XrFaceTrackingStateANDROID + { + XR_FACE_TRACKING_STATE_PAUSED_ANDROID = 0, + XR_FACE_TRACKING_STATE_STOPPED_ANDROID = 1, + XR_FACE_TRACKING_STATE_TRACKING_ANDROID = 2, + } + + public enum XrFaceConfidenceRegionsANDROID + { + XR_FACE_CONFIDENCE_REGIONS_LOWER_ANDROID = 0, + XR_FACE_CONFIDENCE_REGIONS_LEFT_UPPER_ANDROID = 1, + XR_FACE_CONFIDENCE_REGIONS_RIGHT_UPPER_ANDROID = 2, + } + public enum XrPassthroughCameraStateANDROID { XR_PASSTHROUGH_CAMERA_STATE_DISABLED_ANDROID = 0, @@ -2739,4 +2838,92 @@ public enum XrWorldMeshBlockResultML XR_WORLD_MESH_BLOCK_RESULT_PARTIAL_UPDATE_ML = 3, } + public enum XrFacialSimulationModeBD + { + XR_FACIAL_SIMULATION_MODE_DEFAULT_BD = 0, + XR_FACIAL_SIMULATION_MODE_COMBINED_AUDIO_BD = 1, + XR_FACIAL_SIMULATION_MODE_COMBINED_AUDIO_WITH_LIP_BD = 2, + XR_FACIAL_SIMULATION_MODE_ONLY_AUDIO_WITH_LIP_BD = 3, + } + + public enum XrFaceExpressionBD + { + XR_FACE_EXPRESSION_BROW_DROP_L_BD = 0, + XR_FACE_EXPRESSION_BROW_DROP_R_BD = 1, + XR_FACE_EXPRESSION_BROW_INNER_UPWARDS_BD = 2, + XR_FACE_EXPRESSION_BROW_OUTER_UPWARDS_L_BD = 3, + XR_FACE_EXPRESSION_BROW_OUTER_UPWARDS_R_BD = 4, + XR_FACE_EXPRESSION_EYE_BLINK_L_BD = 5, + XR_FACE_EXPRESSION_EYE_LOOK_DROP_L_BD = 6, + XR_FACE_EXPRESSION_EYE_LOOK_IN_L_BD = 7, + XR_FACE_EXPRESSION_EYE_LOOK_OUT_L_BD = 8, + XR_FACE_EXPRESSION_EYE_LOOK_UPWARDS_L_BD = 9, + XR_FACE_EXPRESSION_EYE_LOOK_SQUINT_L_BD = 10, + XR_FACE_EXPRESSION_EYE_LOOK_WIDE_L_BD = 11, + XR_FACE_EXPRESSION_EYE_BLINK_R_BD = 12, + XR_FACE_EXPRESSION_EYE_LOOK_DROP_R_BD = 13, + XR_FACE_EXPRESSION_EYE_LOOK_IN_R_BD = 14, + XR_FACE_EXPRESSION_EYE_LOOK_OUT_R_BD = 15, + XR_FACE_EXPRESSION_EYE_LOOK_UPWARDS_R_BD = 16, + XR_FACE_EXPRESSION_EYE_LOOK_SQUINT_R_BD = 17, + XR_FACE_EXPRESSION_EYE_LOOK_WIDE_R_BD = 18, + XR_FACE_EXPRESSION_NOSE_SNEER_L_BD = 19, + XR_FACE_EXPRESSION_NOSE_SNEER_R_BD = 20, + XR_FACE_EXPRESSION_CHEEK_PUFF_BD = 21, + XR_FACE_EXPRESSION_CHEEK_SQUINT_L_BD = 22, + XR_FACE_EXPRESSION_CHEEK_SQUINT_R_BD = 23, + XR_FACE_EXPRESSION_MOUTH_CLOSE_BD = 24, + XR_FACE_EXPRESSION_MOUTH_FUNNEL_BD = 25, + XR_FACE_EXPRESSION_MOUTH_PUCKER_BD = 26, + XR_FACE_EXPRESSION_MOUTH_L_BD = 27, + XR_FACE_EXPRESSION_MOUTH_R_BD = 28, + XR_FACE_EXPRESSION_MOUTH_SMILE_L_BD = 29, + XR_FACE_EXPRESSION_MOUTH_SMILE_R_BD = 30, + XR_FACE_EXPRESSION_MOUTH_FROWN_L_BD = 31, + XR_FACE_EXPRESSION_MOUTH_FROWN_R_BD = 32, + XR_FACE_EXPRESSION_MOUTH_DIMPLE_L_BD = 33, + XR_FACE_EXPRESSION_MOUTH_DIMPLE_R_BD = 34, + XR_FACE_EXPRESSION_MOUTH_STRETCH_L_BD = 35, + XR_FACE_EXPRESSION_MOUTH_STRETCH_R_BD = 36, + XR_FACE_EXPRESSION_MOUTH_ROLL_LOWER_BD = 37, + XR_FACE_EXPRESSION_MOUTH_ROLL_UPPER_BD = 38, + XR_FACE_EXPRESSION_MOUTH_SHRUG_LOWER_BD = 39, + XR_FACE_EXPRESSION_MOUTH_SHRUG_UPPER_BD = 40, + XR_FACE_EXPRESSION_MOUTH_PRESS_L_BD = 41, + XR_FACE_EXPRESSION_MOUTH_PRESS_R_BD = 42, + XR_FACE_EXPRESSION_MOUTH_LOWER_DROP_L_BD = 43, + XR_FACE_EXPRESSION_MOUTH_LOWER_DROP_R_BD = 44, + XR_FACE_EXPRESSION_MOUTH_UPPER_UPWARDS_L_BD = 45, + XR_FACE_EXPRESSION_MOUTH_UPPER_UPWARDS_R_BD = 46, + XR_FACE_EXPRESSION_JAW_FORWARD_BD = 47, + XR_FACE_EXPRESSION_JAW_L_BD = 48, + XR_FACE_EXPRESSION_JAW_R_BD = 49, + XR_FACE_EXPRESSION_JAW_OPEN_BD = 50, + XR_FACE_EXPRESSION_TONGUE_OUT_BD = 51, + } + + public enum XrLipExpressionBD + { + XR_LIP_EXPRESSION_PP_BD = 0, + XR_LIP_EXPRESSION_CH_BD = 1, + XR_LIP_EXPRESSION_LO_BD = 2, + XR_LIP_EXPRESSION_O_BD = 3, + XR_LIP_EXPRESSION_I_BD = 4, + XR_LIP_EXPRESSION_LU_BD = 5, + XR_LIP_EXPRESSION_RR_BD = 6, + XR_LIP_EXPRESSION_XX_BD = 7, + XR_LIP_EXPRESSION_LAA_BD = 8, + XR_LIP_EXPRESSION_LI_BD = 9, + XR_LIP_EXPRESSION_FF_BD = 10, + XR_LIP_EXPRESSION_U_BD = 11, + XR_LIP_EXPRESSION_TH_BD = 12, + XR_LIP_EXPRESSION_LKK_BD = 13, + XR_LIP_EXPRESSION_SS_BD = 14, + XR_LIP_EXPRESSION_LE_BD = 15, + XR_LIP_EXPRESSION_DD_BD = 16, + XR_LIP_EXPRESSION_E_BD = 17, + XR_LIP_EXPRESSION_LNN_BD = 18, + XR_LIP_EXPRESSION_SIL_BD = 19, + } + } diff --git a/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Handles.cs b/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Handles.cs index 76b33b9..c2f848f 100644 --- a/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Handles.cs +++ b/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Handles.cs @@ -242,6 +242,21 @@ public partial struct XrPassthroughHTC : IEquatable public override int GetHashCode() => Handle.GetHashCode(); } + public partial struct XrFaceTrackerANDROID : IEquatable +{ + public readonly ulong Handle; + public XrFaceTrackerANDROID(ulong existingHandle) { Handle = existingHandle; } + public static XrFaceTrackerANDROID Null => new XrFaceTrackerANDROID(0); + public static implicit operator XrFaceTrackerANDROID(ulong handle) => new XrFaceTrackerANDROID(handle); + public static bool operator ==(XrFaceTrackerANDROID left, XrFaceTrackerANDROID right) => left.Handle == right.Handle; + public static bool operator !=(XrFaceTrackerANDROID left, XrFaceTrackerANDROID right) => left.Handle != right.Handle; + public static bool operator ==(XrFaceTrackerANDROID left, ulong right) => left.Handle == right; + public static bool operator !=(XrFaceTrackerANDROID left, ulong right) => left.Handle != right; + public bool Equals(XrFaceTrackerANDROID h) => Handle == h.Handle; + public override bool Equals(object o) => o is XrFaceTrackerANDROID h && Equals(h); + public override int GetHashCode() => Handle.GetHashCode(); +} + public partial struct XrTrackableTrackerANDROID : IEquatable { public readonly ulong Handle; @@ -662,6 +677,21 @@ public partial struct XrAnchorBD : IEquatable public override int GetHashCode() => Handle.GetHashCode(); } + public partial struct XrFaceTrackerBD : IEquatable +{ + public readonly ulong Handle; + public XrFaceTrackerBD(ulong existingHandle) { Handle = existingHandle; } + public static XrFaceTrackerBD Null => new XrFaceTrackerBD(0); + public static implicit operator XrFaceTrackerBD(ulong handle) => new XrFaceTrackerBD(handle); + public static bool operator ==(XrFaceTrackerBD left, XrFaceTrackerBD right) => left.Handle == right.Handle; + public static bool operator !=(XrFaceTrackerBD left, XrFaceTrackerBD right) => left.Handle != right.Handle; + public static bool operator ==(XrFaceTrackerBD left, ulong right) => left.Handle == right; + public static bool operator !=(XrFaceTrackerBD left, ulong right) => left.Handle != right; + public bool Equals(XrFaceTrackerBD h) => Handle == h.Handle; + public override bool Equals(object o) => o is XrFaceTrackerBD h && Equals(h); + public override int GetHashCode() => Handle.GetHashCode(); +} + public partial struct XrSpatialGraphNodeBindingMSFT : IEquatable { public readonly ulong Handle; diff --git a/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Structs.cs b/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Structs.cs index 221f820..aedf0cc 100644 --- a/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Structs.cs +++ b/OpenXRGen/Evergine.Bindings.OpenXR/Generated/Structs.cs @@ -148,7 +148,7 @@ public unsafe partial struct XrApiLayerCreateInfo public uint structVersion; public UIntPtr structSize; public void* loaderInstance; - public byte settings_file_location; + public fixed byte settings_file_location[512]; public XrApiLayerNextInfo* nextInfo; } @@ -5602,7 +5602,8 @@ public unsafe partial struct XrEyeGazesFB { public XrStructureType type; public void* next; - public XrEyeGazeFB gaze; + public XrEyeGazeFB gaze_0; + public XrEyeGazeFB gaze_1; public long time; } @@ -8147,6 +8148,45 @@ public unsafe partial struct XrForceFeedbackCurlApplyLocationMNDX public float value; } + [StructLayout(LayoutKind.Sequential)] + public unsafe partial struct XrFaceTrackerCreateInfoANDROID + { + public XrStructureType type; + public void* next; + } + + [StructLayout(LayoutKind.Sequential)] + public unsafe partial struct XrFaceStateGetInfoANDROID + { + public XrStructureType type; + public void* next; + public long time; + } + + [StructLayout(LayoutKind.Sequential)] + public unsafe partial struct XrFaceStateANDROID + { + public XrStructureType type; + public void* next; + public uint parametersCapacityInput; + public uint parametersCountOutput; + public float* parameters; + public XrFaceTrackingStateANDROID faceTrackingState; + public long sampleTime; + public XrBool32 isValid; + public uint regionConfidencesCapacityInput; + public uint regionConfidencesCountOutput; + public float* regionConfidences; + } + + [StructLayout(LayoutKind.Sequential)] + public unsafe partial struct XrSystemFaceTrackingPropertiesANDROID + { + public XrStructureType type; + public void* next; + public XrBool32 supportsFaceTracking; + } + [StructLayout(LayoutKind.Sequential)] public unsafe partial struct XrSystemPassthroughCameraStatePropertiesANDROID { @@ -8784,7 +8824,7 @@ public unsafe partial struct XrFrustumf [StructLayout(LayoutKind.Sequential)] public unsafe partial struct XrUuid { - public byte data; + public fixed byte data[(int)OpenXRNative.XR_UUID_SIZE]; } [StructLayout(LayoutKind.Sequential)] @@ -8952,6 +8992,14 @@ public unsafe partial struct XrEnvironmentDepthImageMETA public XrEnvironmentDepthImageViewMETA views_1; } + [StructLayout(LayoutKind.Sequential)] + public unsafe partial struct XrEnvironmentDepthImageTimestampMETA + { + public XrStructureType type; + public void* next; + public long captureTime; + } + [StructLayout(LayoutKind.Sequential)] public unsafe partial struct XrEnvironmentDepthHandRemovalSetInfoMETA { @@ -10261,5 +10309,50 @@ public unsafe partial struct XrSpatialComponentMarkerListEXT public XrSpatialMarkerDataEXT* markers; } + [StructLayout(LayoutKind.Sequential)] + public unsafe partial struct XrSystemFacialSimulationPropertiesBD + { + public XrStructureType type; + public void* next; + public XrBool32 supportsFaceTracking; + } + + [StructLayout(LayoutKind.Sequential)] + public unsafe partial struct XrFaceTrackerCreateInfoBD + { + public XrStructureType type; + public void* next; + public XrFacialSimulationModeBD mode; + } + + [StructLayout(LayoutKind.Sequential)] + public unsafe partial struct XrFacialSimulationDataGetInfoBD + { + public XrStructureType type; + public void* next; + public long time; + } + + [StructLayout(LayoutKind.Sequential)] + public unsafe partial struct XrFacialSimulationDataBD + { + public XrStructureType type; + public void* next; + public uint faceExpressionWeightCount; + public float* faceExpressionWeights; + public XrBool32 isUpperFaceDataValid; + public XrBool32 isLowerFaceDataValid; + public long time; + } + + [StructLayout(LayoutKind.Sequential)] + public unsafe partial struct XrLipExpressionDataBD + { + public XrStructureType type; + public void* next; + public uint lipsyncExpressionWeightCount; + public float* lipsyncExpressionWeights; + } + } diff --git a/OpenXRGen/OpenXRGen/OpenXRSpecification.cs b/OpenXRGen/OpenXRGen/OpenXRSpecification.cs index 018ed85..39263e3 100644 --- a/OpenXRGen/OpenXRGen/OpenXRSpecification.cs +++ b/OpenXRGen/OpenXRGen/OpenXRSpecification.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Text.RegularExpressions; using System.Xml.Linq; namespace OpenXRGen @@ -22,6 +23,7 @@ public class OpenXRSpecification public List Features = new List(); public Dictionary BaseTypes = new Dictionary(); public Dictionary Alias = new Dictionary(); + public Dictionary Defines = new Dictionary(); public List Extensions = new List(); public static OpenXRSpecification FromFile(string xmlFile) @@ -61,6 +63,32 @@ public static OpenXRSpecification FromFile(string xmlFile) var types = registry.Elements("types"); + // #define values are tracked for struct array sizing, not emitted as generated C# constants. + var defineTypes = types.Elements("type").Where(t => t.Attribute("category")?.Value == "define"); + foreach (var defineType in defineTypes) + { + var name = defineType.Element("name")?.Value; + if (string.IsNullOrEmpty(name) || spec.Defines.ContainsKey(name)) + { + continue; + } + + // XElement.Value is like "#define XR_FOO 123" (without XML tags). + var valueMatch = Regex.Match(defineType.Value, $@"#define\s+{Regex.Escape(name)}\s+(?.+)"); + if (!valueMatch.Success) + { + continue; + } + + var value = valueMatch.Groups["value"].Value.Trim(); + if (string.IsNullOrEmpty(value)) + { + continue; + } + + spec.Defines[name] = value; + } + // FuncPointers var funcPointers = types.Elements("type").Where(f => f.Attribute("category")?.Value == "funcpointer"); foreach (var func in funcPointers) diff --git a/OpenXRGen/OpenXRGen/Program.cs b/OpenXRGen/OpenXRGen/Program.cs index 4c9d83b..f0dfb29 100644 --- a/OpenXRGen/OpenXRGen/Program.cs +++ b/OpenXRGen/OpenXRGen/Program.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Immutable; +using System.Globalization; using System.IO; using System.Linq; using System.Reflection; @@ -8,6 +9,54 @@ namespace OpenXRGen { class Program { + private static bool TryParseDefineIntValue(string rawValue, out int value) + { + value = 0; + if (string.IsNullOrWhiteSpace(rawValue)) + { + return false; + } + + string trimmed = rawValue.Trim(); + + while (trimmed.StartsWith("(") && trimmed.EndsWith(")") && trimmed.Length > 2) + { + trimmed = trimmed.Substring(1, trimmed.Length - 2).Trim(); + } + + if (trimmed.Contains(" ") || trimmed.Contains("(") || trimmed.Contains(")") || trimmed.Contains("*") || trimmed.Contains("+") || trimmed.Contains("/")) + { + return false; + } + + bool negative = trimmed.StartsWith("-"); + if (negative) + { + trimmed = trimmed.Substring(1); + } + + string normalized = trimmed.TrimEnd('u', 'U', 'l', 'L'); + + if (normalized.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) + { + if (!int.TryParse(normalized.Substring(2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out value)) + { + return false; + } + } + else if (!int.TryParse(normalized, NumberStyles.Integer, CultureInfo.InvariantCulture, out value)) + { + return false; + } + + if (negative) + { + value = -value; + } + + return true; + } + static void Main(string[] args) { string vkFile = Path.Combine("..", "..", "..", "..", "..", "KhronosRegistry", "xr.xml"); @@ -165,24 +214,56 @@ static void Main(string[] args) else if (member.ConstantValue != null) { var validConstant = openXRVersion.Constants.FirstOrDefault(c => c.Name == member.ConstantValue); + var enumCount = openXRVersion.Enums + .SelectMany(e => e.Values) + .FirstOrDefault(v => v.Name == member.ConstantValue); + openXRSpec.Defines.TryGetValue(member.ConstantValue, out var defineValueRaw); + bool hasDefineIntValue = TryParseDefineIntValue(defineValueRaw, out int defineCount); if (Helpers.SupportFixed(csType)) { - file.WriteLine($"\t\tpublic fixed {csType} {Helpers.ValidatedName(member.Name)}[(int)OpenXRNative.{validConstant.Name}];"); + if (validConstant != null) + { + file.WriteLine($"\t\tpublic fixed {csType} {Helpers.ValidatedName(member.Name)}[(int)OpenXRNative.{validConstant.Name}];"); + } + else if (enumCount != null) + { + file.WriteLine($"\t\tpublic fixed {csType} {Helpers.ValidatedName(member.Name)}[{enumCount.Value}];"); + } + else if (hasDefineIntValue) + { + file.WriteLine($"\t\tpublic fixed {csType} {Helpers.ValidatedName(member.Name)}[{defineCount}];"); + } + else + { + throw new InvalidOperationException($"Cannot resolve array size constant '{member.ConstantValue}' for member '{member.Name}' in struct '{structure.Name}'."); + } } else { int count = 0; - if (validConstant.Value == null) + if (validConstant != null && validConstant.Value == null) { var alias = openXRVersion.Constants.FirstOrDefault(c => c.Name == validConstant.Alias); count = int.Parse(alias.Value); } - else + else if (validConstant != null) { count = int.Parse(validConstant.Value); } + else if (enumCount != null) + { + count = enumCount.Value; + } + else if (hasDefineIntValue) + { + count = defineCount; + } + else + { + throw new InvalidOperationException($"Cannot resolve array size constant '{member.ConstantValue}' for member '{member.Name}' in struct '{structure.Name}'."); + } for (int i = 0; i < count; i++) { diff --git a/OpenXRGen/OpenXRGen/StructureDefinition.cs b/OpenXRGen/OpenXRGen/StructureDefinition.cs index 20a79ca..bb2dbfb 100644 --- a/OpenXRGen/OpenXRGen/StructureDefinition.cs +++ b/OpenXRGen/OpenXRGen/StructureDefinition.cs @@ -90,19 +90,29 @@ public static Member FromXML(XElement elem) if (m.ConstantValue == null) { - Match match = Regex.Match(m.Value, $@"{m.Name}\[(\d+)\](\[(\d+)\])?"); - if (match.Captures.Count > 0) + Match match = Regex.Match(m.Value, $@"{Regex.Escape(m.Name)}\[(?[^\]]+)\](\[(?[^\]]+)\])?"); + if (match.Success) { - if (match.Groups[2].Value != string.Empty) + string count1 = match.Groups["count1"].Value; + string count2 = match.Groups["count2"].Value; + + bool firstIsNumeric = int.TryParse(count1, out int value1); + bool secondIsPresent = !string.IsNullOrEmpty(count2); + int value2 = 0; + bool secondIsNumeric = secondIsPresent && int.TryParse(count2, out value2); + + if (firstIsNumeric && !secondIsPresent) + { + m.ElementCount = value1; + } + else if (firstIsNumeric && secondIsNumeric) { - string valueString1 = match.Groups[1].Value; - string valueString2 = match.Groups[3].Value; - m.ElementCount = int.Parse(valueString1) * int.Parse(valueString2); + m.ElementCount = value1 * value2; } - else + else if (!secondIsPresent) { - string valueString = match.Groups[1].Value; - m.ElementCount = int.Parse(valueString); + // Handles array declarations using symbolic constants in member text. + m.ConstantValue = count1; } } }