/* SPDX-License-Identifier: GPL-2.0-or-later * Copyright 2001-2002 NaN Holding BV. All rights reserved. */ /** \file * \ingroup GHOST */ #pragma once #include #ifdef WITH_CXX_GUARDEDALLOC # include "MEM_guardedalloc.h" #else /* Convenience unsigned abbreviations (#WITH_CXX_GUARDEDALLOC defines these). */ typedef unsigned int uint; typedef unsigned short ushort; typedef unsigned long ulong; typedef unsigned char uchar; #endif #if defined(WITH_CXX_GUARDEDALLOC) && defined(__cplusplus) # define GHOST_DECLARE_HANDLE(name) \ typedef struct name##__ { \ int unused; \ MEM_CXX_CLASS_ALLOC_FUNCS(#name) \ } * name #else # define GHOST_DECLARE_HANDLE(name) \ typedef struct name##__ { \ int unused; \ } * name #endif /** * Creates a "handle" for a C++ GHOST object. * A handle is just an opaque pointer to an empty struct. * In the API the pointer is cast to the actual C++ class. * The 'name' argument to the macro is the name of the handle to create. */ GHOST_DECLARE_HANDLE(GHOST_SystemHandle); GHOST_DECLARE_HANDLE(GHOST_TimerTaskHandle); GHOST_DECLARE_HANDLE(GHOST_WindowHandle); GHOST_DECLARE_HANDLE(GHOST_EventHandle); GHOST_DECLARE_HANDLE(GHOST_RectangleHandle); GHOST_DECLARE_HANDLE(GHOST_EventConsumerHandle); GHOST_DECLARE_HANDLE(GHOST_ContextHandle); GHOST_DECLARE_HANDLE(GHOST_XrContextHandle); typedef void (*GHOST_TBacktraceFn)(void *file_handle); /** * A reference to cursor bitmap data. */ typedef struct { /** `RGBA` bytes. */ const uint8_t *data; int data_size[2]; int hot_spot[2]; } GHOST_CursorBitmapRef; typedef enum { GHOST_glStereoVisual = (1 << 0), GHOST_glDebugContext = (1 << 1), } GHOST_GLFlags; typedef enum GHOST_DialogOptions { GHOST_DialogWarning = (1 << 0), GHOST_DialogError = (1 << 1), } GHOST_DialogOptions; typedef void *GHOST_TUserDataPtr; typedef enum { GHOST_kFailure = 0, GHOST_kSuccess } GHOST_TSuccess; /* Xtilt and Ytilt represent how much the pen is tilted away from * vertically upright in either the X or Y direction, with X and Y the * axes of the tablet surface. * In other words, Xtilt and Ytilt are components of a vector created by projecting * the pen's angle in 3D space vertically downwards on to the XY plane * --Matt */ typedef enum { GHOST_kTabletModeNone = 0, GHOST_kTabletModeStylus, GHOST_kTabletModeEraser } GHOST_TTabletMode; typedef enum { GHOST_kTabletAutomatic = 0, /* Show as Windows Ink to users to match "Use Windows Ink" in tablet utilities, * but we use the dependent Windows Pointer API. */ GHOST_kTabletWinPointer, GHOST_kTabletWintab, } GHOST_TTabletAPI; typedef struct GHOST_TabletData { GHOST_TTabletMode Active; /* 0=None, 1=Stylus, 2=Eraser */ float Pressure; /* range 0.0 (not touching) to 1.0 (full pressure) */ float Xtilt; /* range 0.0 (upright) to 1.0 (tilted fully against the tablet surface) */ float Ytilt; /* as above */ } GHOST_TabletData; static const GHOST_TabletData GHOST_TABLET_DATA_NONE = { GHOST_kTabletModeNone, /* No cursor in range */ 1.0f, /* Pressure */ 0.0f, /* Xtilt */ 0.0f}; /* Ytilt */ typedef enum { GHOST_kNotVisible = 0, GHOST_kPartiallyVisible, GHOST_kFullyVisible } GHOST_TVisibility; typedef enum { GHOST_kFireTimeNever = 0xFFFFFFFF } GHOST_TFireTimeConstant; typedef enum { GHOST_kModifierKeyLeftShift = 0, GHOST_kModifierKeyRightShift, GHOST_kModifierKeyLeftAlt, GHOST_kModifierKeyRightAlt, GHOST_kModifierKeyLeftControl, GHOST_kModifierKeyRightControl, GHOST_kModifierKeyLeftOS, GHOST_kModifierKeyRightOS, GHOST_kModifierKeyNum } GHOST_TModifierKey; typedef enum { GHOST_kWindowStateNormal = 0, GHOST_kWindowStateMaximized, GHOST_kWindowStateMinimized, GHOST_kWindowStateFullScreen, GHOST_kWindowStateEmbedded, // GHOST_kWindowStateModified, // GHOST_kWindowStateUnModified, } GHOST_TWindowState; typedef enum { GHOST_kConsoleWindowStateHide = 0, GHOST_kConsoleWindowStateShow, GHOST_kConsoleWindowStateToggle, GHOST_kConsoleWindowStateHideForNonConsoleLaunch } GHOST_TConsoleWindowState; typedef enum { GHOST_kWindowOrderTop = 0, GHOST_kWindowOrderBottom } GHOST_TWindowOrder; typedef enum { GHOST_kDrawingContextTypeNone = 0, GHOST_kDrawingContextTypeOpenGL, #ifdef WIN32 GHOST_kDrawingContextTypeD3D, #endif #ifdef __APPLE__ GHOST_kDrawingContextTypeMetal, #endif } GHOST_TDrawingContextType; typedef enum { GHOST_kButtonMaskNone, GHOST_kButtonMaskLeft, GHOST_kButtonMaskMiddle, GHOST_kButtonMaskRight, GHOST_kButtonMaskButton4, GHOST_kButtonMaskButton5, /* Trackballs and programmable buttons. */ GHOST_kButtonMaskButton6, GHOST_kButtonMaskButton7, GHOST_kButtonNum } GHOST_TButton; typedef enum { GHOST_kEventUnknown = 0, GHOST_kEventCursorMove, /* Mouse move event. */ GHOST_kEventButtonDown, /* Mouse button event. */ GHOST_kEventButtonUp, /* Mouse button event. */ GHOST_kEventWheel, /* Mouse wheel event. */ GHOST_kEventTrackpad, /* Trackpad event. */ #ifdef WITH_INPUT_NDOF GHOST_kEventNDOFMotion, /* N degree of freedom device motion event. */ GHOST_kEventNDOFButton, /* N degree of freedom device button event. */ #endif GHOST_kEventKeyDown, GHOST_kEventKeyUp, // GHOST_kEventKeyAuto, GHOST_kEventQuitRequest, GHOST_kEventWindowClose, GHOST_kEventWindowActivate, GHOST_kEventWindowDeactivate, GHOST_kEventWindowUpdate, GHOST_kEventWindowSize, GHOST_kEventWindowMove, GHOST_kEventWindowDPIHintChanged, GHOST_kEventDraggingEntered, GHOST_kEventDraggingUpdated, GHOST_kEventDraggingExited, GHOST_kEventDraggingDropDone, GHOST_kEventOpenMainFile, /* Needed for Cocoa to open double-clicked .blend file at startup. */ GHOST_kEventNativeResolutionChange, /* Needed for Cocoa when window moves to other display. */ GHOST_kEventTimer, GHOST_kEventImeCompositionStart, GHOST_kEventImeComposition, GHOST_kEventImeCompositionEnd, GHOST_kNumEventTypes } GHOST_TEventType; typedef enum { GHOST_kStandardCursorFirstCursor = 0, GHOST_kStandardCursorDefault = 0, GHOST_kStandardCursorRightArrow, GHOST_kStandardCursorLeftArrow, GHOST_kStandardCursorInfo, GHOST_kStandardCursorDestroy, GHOST_kStandardCursorHelp, GHOST_kStandardCursorWait, GHOST_kStandardCursorText, GHOST_kStandardCursorCrosshair, GHOST_kStandardCursorCrosshairA, GHOST_kStandardCursorCrosshairB, GHOST_kStandardCursorCrosshairC, GHOST_kStandardCursorPencil, GHOST_kStandardCursorUpArrow, GHOST_kStandardCursorDownArrow, GHOST_kStandardCursorVerticalSplit, GHOST_kStandardCursorHorizontalSplit, GHOST_kStandardCursorEraser, GHOST_kStandardCursorKnife, GHOST_kStandardCursorEyedropper, GHOST_kStandardCursorZoomIn, GHOST_kStandardCursorZoomOut, GHOST_kStandardCursorMove, GHOST_kStandardCursorNSEWScroll, GHOST_kStandardCursorNSScroll, GHOST_kStandardCursorEWScroll, GHOST_kStandardCursorStop, GHOST_kStandardCursorUpDown, GHOST_kStandardCursorLeftRight, GHOST_kStandardCursorTopSide, GHOST_kStandardCursorBottomSide, GHOST_kStandardCursorLeftSide, GHOST_kStandardCursorRightSide, GHOST_kStandardCursorTopLeftCorner, GHOST_kStandardCursorTopRightCorner, GHOST_kStandardCursorBottomRightCorner, GHOST_kStandardCursorBottomLeftCorner, GHOST_kStandardCursorCopy, GHOST_kStandardCursorCustom, GHOST_kStandardCursorNumCursors } GHOST_TStandardCursor; typedef enum { GHOST_kKeyUnknown = -1, GHOST_kKeyBackSpace, GHOST_kKeyTab, GHOST_kKeyLinefeed, GHOST_kKeyClear, GHOST_kKeyEnter = 0x0D, GHOST_kKeyEsc = 0x1B, GHOST_kKeySpace = ' ', GHOST_kKeyQuote = 0x27, GHOST_kKeyComma = ',', GHOST_kKeyMinus = '-', GHOST_kKeyPlus = '+', GHOST_kKeyPeriod = '.', GHOST_kKeySlash = '/', /* Number keys. */ GHOST_kKey0 = '0', GHOST_kKey1, GHOST_kKey2, GHOST_kKey3, GHOST_kKey4, GHOST_kKey5, GHOST_kKey6, GHOST_kKey7, GHOST_kKey8, GHOST_kKey9, GHOST_kKeySemicolon = ';', GHOST_kKeyEqual = '=', /* Character keys. */ GHOST_kKeyA = 'A', GHOST_kKeyB, GHOST_kKeyC, GHOST_kKeyD, GHOST_kKeyE, GHOST_kKeyF, GHOST_kKeyG, GHOST_kKeyH, GHOST_kKeyI, GHOST_kKeyJ, GHOST_kKeyK, GHOST_kKeyL, GHOST_kKeyM, GHOST_kKeyN, GHOST_kKeyO, GHOST_kKeyP, GHOST_kKeyQ, GHOST_kKeyR, GHOST_kKeyS, GHOST_kKeyT, GHOST_kKeyU, GHOST_kKeyV, GHOST_kKeyW, GHOST_kKeyX, GHOST_kKeyY, GHOST_kKeyZ, GHOST_kKeyLeftBracket = '[', GHOST_kKeyRightBracket = ']', GHOST_kKeyBackslash = 0x5C, GHOST_kKeyAccentGrave = '`', #define _GHOST_KEY_MODIFIER_MIN GHOST_kKeyLeftShift /* Modifiers: See #GHOST_KEY_MODIFIER_CHECK. */ GHOST_kKeyLeftShift = 0x100, GHOST_kKeyRightShift, GHOST_kKeyLeftControl, GHOST_kKeyRightControl, GHOST_kKeyLeftAlt, GHOST_kKeyRightAlt, GHOST_kKeyLeftOS, /* Command key on Apple, Windows key(s) on Windows. */ GHOST_kKeyRightOS, #define _GHOST_KEY_MODIFIER_MAX GHOST_kKeyRightOS GHOST_kKeyGrLess, /* German PC only! */ GHOST_kKeyApp, /* Also known as menu key. */ GHOST_kKeyCapsLock, GHOST_kKeyNumLock, GHOST_kKeyScrollLock, GHOST_kKeyLeftArrow, GHOST_kKeyRightArrow, GHOST_kKeyUpArrow, GHOST_kKeyDownArrow, GHOST_kKeyPrintScreen, GHOST_kKeyPause, GHOST_kKeyInsert, GHOST_kKeyDelete, GHOST_kKeyHome, GHOST_kKeyEnd, GHOST_kKeyUpPage, GHOST_kKeyDownPage, /* Numpad keys. */ GHOST_kKeyNumpad0, GHOST_kKeyNumpad1, GHOST_kKeyNumpad2, GHOST_kKeyNumpad3, GHOST_kKeyNumpad4, GHOST_kKeyNumpad5, GHOST_kKeyNumpad6, GHOST_kKeyNumpad7, GHOST_kKeyNumpad8, GHOST_kKeyNumpad9, GHOST_kKeyNumpadPeriod, GHOST_kKeyNumpadEnter, GHOST_kKeyNumpadPlus, GHOST_kKeyNumpadMinus, GHOST_kKeyNumpadAsterisk, GHOST_kKeyNumpadSlash, /* Function keys. */ GHOST_kKeyF1, GHOST_kKeyF2, GHOST_kKeyF3, GHOST_kKeyF4, GHOST_kKeyF5, GHOST_kKeyF6, GHOST_kKeyF7, GHOST_kKeyF8, GHOST_kKeyF9, GHOST_kKeyF10, GHOST_kKeyF11, GHOST_kKeyF12, GHOST_kKeyF13, GHOST_kKeyF14, GHOST_kKeyF15, GHOST_kKeyF16, GHOST_kKeyF17, GHOST_kKeyF18, GHOST_kKeyF19, GHOST_kKeyF20, GHOST_kKeyF21, GHOST_kKeyF22, GHOST_kKeyF23, GHOST_kKeyF24, /* Multimedia keypad buttons. */ GHOST_kKeyMediaPlay, GHOST_kKeyMediaStop, GHOST_kKeyMediaFirst, GHOST_kKeyMediaLast } GHOST_TKey; #define GHOST_KEY_MODIFIER_NUM ((_GHOST_KEY_MODIFIER_MAX - _GHOST_KEY_MODIFIER_MIN) + 1) #define GHOST_KEY_MODIFIER_TO_INDEX(key) ((unsigned int)(key)-_GHOST_KEY_MODIFIER_MIN) #define GHOST_KEY_MODIFIER_FROM_INDEX(key) \ (GHOST_TKey)(((unsigned int)(key) + _GHOST_KEY_MODIFIER_MIN)) #define GHOST_KEY_MODIFIER_CHECK(key) (GHOST_KEY_MODIFIER_TO_INDEX(key) < GHOST_KEY_MODIFIER_NUM) typedef enum { /** Grab not set. */ GHOST_kGrabDisable = 0, /** No cursor adjustments. */ GHOST_kGrabNormal, /** Wrap the mouse location to prevent limiting screen bounds. */ GHOST_kGrabWrap, /** * Hide the mouse while grabbing and restore the original location on release * (used for number buttons and some other draggable UI elements). */ GHOST_kGrabHide, } GHOST_TGrabCursorMode; #define GHOST_GRAB_NEEDS_SOFTWARE_CURSOR_FOR_WARP(grab) ((grab) == GHOST_kGrabWrap) typedef enum { /** Axis that cursor grab will wrap. */ GHOST_kAxisNone = 0, GHOST_kAxisX = (1 << 0), GHOST_kAxisY = (1 << 1), } GHOST_TAxisFlag; typedef void *GHOST_TEventDataPtr; typedef struct { /** The x-coordinate of the cursor position. */ int32_t x; /** The y-coordinate of the cursor position. */ int32_t y; /** Associated tablet data. */ GHOST_TabletData tablet; } GHOST_TEventCursorData; typedef struct { /** The mask of the mouse button. */ GHOST_TButton button; /** Associated tablet data. */ GHOST_TabletData tablet; } GHOST_TEventButtonData; typedef struct { /** Displacement of a mouse wheel. */ int32_t z; } GHOST_TEventWheelData; typedef enum { GHOST_kTrackpadEventUnknown = 0, GHOST_kTrackpadEventScroll, GHOST_kTrackpadEventRotate, GHOST_kTrackpadEventSwipe, /* Reserved, not used for now */ GHOST_kTrackpadEventMagnify, GHOST_kTrackpadEventSmartMagnify } GHOST_TTrackpadEventSubTypes; typedef struct { /** The event subtype */ GHOST_TTrackpadEventSubTypes subtype; /** The x-location of the trackpad event */ int32_t x; /** The y-location of the trackpad event */ int32_t y; /** The x-delta or value of the trackpad event */ int32_t deltaX; /** The y-delta (currently only for scroll subtype) of the trackpad event */ int32_t deltaY; /** The delta is inverted from the device due to system preferences. */ char isDirectionInverted; } GHOST_TEventTrackpadData; typedef enum { GHOST_kDragnDropTypeUnknown = 0, GHOST_kDragnDropTypeFilenames, /* Array of strings representing file names (full path). */ GHOST_kDragnDropTypeString, /* Unformatted text UTF-8 string. */ GHOST_kDragnDropTypeBitmap /* Bitmap image data. */ } GHOST_TDragnDropTypes; typedef struct { /** The x-coordinate of the cursor position. */ int32_t x; /** The y-coordinate of the cursor position. */ int32_t y; /** The dropped item type */ GHOST_TDragnDropTypes dataType; /** The "dropped content" */ GHOST_TEventDataPtr data; } GHOST_TEventDragnDropData; /** similar to wmImeData */ typedef struct { /** size_t */ GHOST_TUserDataPtr result_len, composite_len; /** char * utf8 encoding */ GHOST_TUserDataPtr result, composite; /** Cursor position in the IME composition. */ int cursor_position; /** Represents the position of the beginning of the selection */ int target_start; /** Represents the position of the end of the selection */ int target_end; } GHOST_TEventImeData; typedef struct { int count; uint8_t **strings; } GHOST_TStringArray; typedef enum { GHOST_kNotStarted = 0, GHOST_kStarting, GHOST_kInProgress, GHOST_kFinishing, GHOST_kFinished } GHOST_TProgress; #ifdef WITH_INPUT_NDOF typedef struct { /** N-degree of freedom device data v3 [GSoC 2010] */ /* Each component normally ranges from -1 to +1, but can exceed that. * These use blender standard view coordinates, * with positive rotations being CCW about the axis. */ /* translation: */ float tx, ty, tz; /* rotation: * - `axis = (rx,ry,rz).normalized` * - `amount = (rx,ry,rz).magnitude` [in revolutions, 1.0 = 360 deg]. */ float rx, ry, rz; /** Time since previous NDOF Motion event */ float dt; /** Starting, #GHOST_kInProgress or #GHOST_kFinishing (for modal handlers) */ GHOST_TProgress progress; } GHOST_TEventNDOFMotionData; typedef enum { GHOST_kPress, GHOST_kRelease } GHOST_TButtonAction; /* Good for mouse or other buttons too? */ typedef struct { GHOST_TButtonAction action; short button; } GHOST_TEventNDOFButtonData; #endif // WITH_INPUT_NDOF typedef struct { /** The key code. */ GHOST_TKey key; /** The unicode character. if the length is 6, not NULL terminated if all 6 are set. */ char utf8_buf[6]; /** * Enabled when the key is held (auto-repeat). * In this case press events are sent without a corresponding release/up event. * * All back-ends must set this variable for correct behavior regarding repeatable keys. */ char is_repeat; } GHOST_TEventKeyData; typedef enum { GHOST_kUserSpecialDirDesktop, GHOST_kUserSpecialDirDocuments, GHOST_kUserSpecialDirDownloads, GHOST_kUserSpecialDirMusic, GHOST_kUserSpecialDirPictures, GHOST_kUserSpecialDirVideos, GHOST_kUserSpecialDirCaches, /* Can be extended as needed. */ } GHOST_TUserSpecialDirTypes; typedef struct { /** Number of pixels on a line. */ uint32_t xPixels; /** Number of lines. */ uint32_t yPixels; /** Number of bits per pixel. */ uint32_t bpp; /** Refresh rate (in Hertz). */ uint32_t frequency; } GHOST_DisplaySetting; typedef struct { int flags; GHOST_TDrawingContextType context_type; } GHOST_GLSettings; typedef enum { /** Axis that cursor grab will wrap. */ GHOST_kDebugDefault = (1 << 1), GHOST_kDebugWintab = (1 << 2), } GHOST_TDebugFlags; typedef struct { int flags; } GHOST_Debug; #ifdef _WIN32 typedef void *GHOST_TEmbedderWindowID; #endif // _WIN32 #ifndef _WIN32 /* I can't use "Window" from `X11/Xlib.h` * because it conflicts with Window defined in `winlay.h`. */ typedef int GHOST_TEmbedderWindowID; #endif // _WIN32 /** * A timer task callback routine. * \param task: The timer task object. * \param time: Time since this timer started (in milliseconds). */ #ifdef __cplusplus class GHOST_ITimerTask; typedef void (*GHOST_TimerProcPtr)(GHOST_ITimerTask *task, uint64_t time); #else struct GHOST_TimerTaskHandle__; typedef void (*GHOST_TimerProcPtr)(struct GHOST_TimerTaskHandle__ *task, uint64_t time); #endif #ifdef WITH_XR_OPENXR struct GHOST_XrDrawViewInfo; struct GHOST_XrError; /** * The XR view (i.e. the OpenXR runtime) may require a different graphics library than OpenGL. * An off-screen texture of the viewport will then be drawn into using OpenGL, * but the final texture draw call will happen through another library (say DirectX). * * This enum defines the possible graphics bindings to attempt to enable. */ typedef enum GHOST_TXrGraphicsBinding { GHOST_kXrGraphicsUnknown = 0, GHOST_kXrGraphicsOpenGL, # ifdef WIN32 GHOST_kXrGraphicsD3D11, # endif /* For later */ // GHOST_kXrGraphicsVulkan, } GHOST_TXrGraphicsBinding; typedef void (*GHOST_XrErrorHandlerFn)(const struct GHOST_XrError *); typedef void (*GHOST_XrSessionCreateFn)(void); typedef void (*GHOST_XrSessionExitFn)(void *customdata); typedef void (*GHOST_XrCustomdataFreeFn)(void *customdata); typedef void *(*GHOST_XrGraphicsContextBindFn)(void); typedef void (*GHOST_XrGraphicsContextUnbindFn)(GHOST_ContextHandle graphics_context); typedef void (*GHOST_XrDrawViewFn)(const struct GHOST_XrDrawViewInfo *draw_view, void *customdata); /** * An array of #GHOST_TXrGraphicsBinding items defining the candidate bindings to use. * The first available candidate will be chosen, so order defines priority. */ typedef const GHOST_TXrGraphicsBinding *GHOST_XrGraphicsBindingCandidates; typedef struct { float position[3]; /* Blender convention (w, x, y, z) */ float orientation_quat[4]; } GHOST_XrPose; enum { GHOST_kXrContextDebug = (1 << 0), GHOST_kXrContextDebugTime = (1 << 1), # ifdef WIN32 /* Needed to avoid issues with the SteamVR OpenGL graphics binding * (use DirectX fallback instead). */ GHOST_kXrContextGpuNVIDIA = (1 << 2), # endif }; typedef struct { const GHOST_XrGraphicsBindingCandidates gpu_binding_candidates; unsigned int gpu_binding_candidates_count; unsigned int context_flag; } GHOST_XrContextCreateInfo; typedef struct { GHOST_XrPose base_pose; GHOST_XrSessionCreateFn create_fn; GHOST_XrSessionExitFn exit_fn; void *exit_customdata; } GHOST_XrSessionBeginInfo; /** Texture format for XR swapchain. */ typedef enum GHOST_TXrSwapchainFormat { GHOST_kXrSwapchainFormatRGBA8, GHOST_kXrSwapchainFormatRGBA16, GHOST_kXrSwapchainFormatRGBA16F, GHOST_kXrSwapchainFormatRGB10_A2, } GHOST_TXrSwapchainFormat; typedef struct GHOST_XrDrawViewInfo { int ofsx, ofsy; int width, height; GHOST_XrPose eye_pose; GHOST_XrPose local_pose; struct { float angle_left, angle_right; float angle_up, angle_down; } fov; GHOST_TXrSwapchainFormat swapchain_format; /** Set if the buffer should be submitted with a SRGB transfer applied. */ char expects_srgb_buffer; /** The view that this info represents. Not necessarily the "eye index" (e.g. for quad view * systems, etc). */ char view_idx; } GHOST_XrDrawViewInfo; typedef struct GHOST_XrError { const char *user_message; void *customdata; } GHOST_XrError; typedef struct GHOST_XrActionSetInfo { const char *name; GHOST_XrCustomdataFreeFn customdata_free_fn; void *customdata; /* wmXrActionSet */ } GHOST_XrActionSetInfo; /** XR action type. Enum values match those in OpenXR's * XrActionType enum for consistency. */ typedef enum GHOST_XrActionType { GHOST_kXrActionTypeBooleanInput = 1, GHOST_kXrActionTypeFloatInput = 2, GHOST_kXrActionTypeVector2fInput = 3, GHOST_kXrActionTypePoseInput = 4, GHOST_kXrActionTypeVibrationOutput = 100, } GHOST_XrActionType; typedef struct GHOST_XrActionInfo { const char *name; GHOST_XrActionType type; uint32_t count_subaction_paths; const char **subaction_paths; /** States for each subaction path. */ void *states; /** Input thresholds/regions for each subaction path. */ float *float_thresholds; int16_t *axis_flags; GHOST_XrCustomdataFreeFn customdata_free_fn; void *customdata; /* wmXrAction */ } GHOST_XrActionInfo; typedef struct GHOST_XrActionBindingInfo { const char *component_path; float float_threshold; int16_t axis_flag; GHOST_XrPose pose; } GHOST_XrActionBindingInfo; typedef struct GHOST_XrActionProfileInfo { const char *action_name; const char *profile_path; uint32_t count_subaction_paths; const char **subaction_paths; /** Bindings for each subaction path. */ const GHOST_XrActionBindingInfo *bindings; } GHOST_XrActionProfileInfo; typedef struct GHOST_XrControllerModelVertex { float position[3]; float normal[3]; } GHOST_XrControllerModelVertex; typedef struct GHOST_XrControllerModelComponent { /** World space transform. */ float transform[4][4]; uint32_t vertex_offset; uint32_t vertex_count; uint32_t index_offset; uint32_t index_count; } GHOST_XrControllerModelComponent; typedef struct GHOST_XrControllerModelData { uint32_t count_vertices; const GHOST_XrControllerModelVertex *vertices; uint32_t count_indices; const uint32_t *indices; uint32_t count_components; const GHOST_XrControllerModelComponent *components; } GHOST_XrControllerModelData; #endif /* WITH_XR_OPENXR */