myou-engine/libs/glfm/src/glfm.h
Alberto Torres 9af1322937 First commit.
* Incomplete port of myou-engine-js to nimskull, after many months of work, and
  a few extra features that weren't exactly necessary for a "first commit" to
  work. Excuse the lack of commit history up to this point.
* Bare bones structure of the documentation and the process to update it.
* Restructure of the whole project to have a more sensible organization.
* Making submodules of forks of larger libraries.
* README, licenses, AUTHORS.md.
2024-08-20 13:08:19 +02:00

1028 lines
40 KiB
C

// GLFM v0.10.0
//
// GLFM is a C API for mobile app development with OpenGL ES. It is largely inspired by GLFW.
// https://github.com/brackeen/glfm
#ifndef GLFM_H
#define GLFM_H
#if !defined(__APPLE__) && !defined(__ANDROID__) && !defined(__EMSCRIPTEN__)
# error Unsupported platform
#endif
#if defined(__APPLE__)
# include <TargetConditionals.h>
# if !(TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_OSX)
# error Unsupported Apple platform
# endif
# if !defined(GL_SILENCE_DEPRECATION)
# define GL_SILENCE_DEPRECATION
# endif
#endif
// OpenGL ES includes
#if defined(GLFM_INCLUDE_ES32)
# if defined(__ANDROID__)
# include <GLES3/gl32.h>
# include <GLES3/gl3ext.h>
# else
# error OpenGL ES 3.2 only supported on Android
# endif
#elif defined(GLFM_INCLUDE_ES31)
# if defined(__ANDROID__)
# include <GLES3/gl31.h>
# include <GLES3/gl3ext.h>
# else
# error OpenGL ES 3.1 only supported on Android
# endif
#elif defined(GLFM_INCLUDE_ES3)
# if defined(__APPLE__)
# if TARGET_OS_OSX
# error OpenGL ES unavailable on macOS
# else
# include <OpenGLES/ES3/gl.h>
# include <OpenGLES/ES3/glext.h>
# endif
# elif defined(__EMSCRIPTEN__)
# include <GLES3/gl3.h>
# include <GLES3/gl2ext.h>
# else
# include <GLES3/gl3.h>
# include <GLES3/gl3ext.h>
# endif
#elif !defined(GLFM_INCLUDE_NONE)
# if defined(__APPLE__)
# if TARGET_OS_OSX
# include <OpenGL/gl3.h>
# else
# include <OpenGLES/ES2/gl.h>
# include <OpenGLES/ES2/glext.h>
# endif
# else
# include <GLES2/gl2.h>
# include <GLES2/gl2ext.h>
# endif
#endif
#ifdef __GNUC__
# define GLFM_DEPRECATED(message) __attribute__((deprecated(message)))
#else
# define GLFM_DEPRECATED(message)
#endif
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
// MARK: - Enums
typedef enum {
GLFMRenderingAPIOpenGLES2,
GLFMRenderingAPIOpenGLES3,
GLFMRenderingAPIOpenGLES31,
GLFMRenderingAPIOpenGLES32,
GLFMRenderingAPIMetal,
} GLFMRenderingAPI;
typedef enum
{
GLFMColorFormatRGBA8888,
GLFMColorFormatRGB888,
GLFMColorFormatRGB565,
} GLFMColorFormat;
typedef enum {
GLFMDepthFormatNone,
GLFMDepthFormat16,
GLFMDepthFormat24,
} GLFMDepthFormat;
typedef enum {
GLFMStencilFormatNone,
GLFMStencilFormat8,
} GLFMStencilFormat;
typedef enum {
GLFMMultisampleNone,
GLFMMultisample4X,
} GLFMMultisample;
typedef enum {
GLFMSwapBehaviorPlatformDefault,
GLFMSwapBehaviorBufferDestroyed,
GLFMSwapBehaviorBufferPreserved,
} GLFMSwapBehavior;
/// Defines whether system UI chrome (status bar, navigation bar) is shown.
typedef enum {
/// Displays the app with the navigation bar.
/// - Android: Show the navigation bar.
/// - iOS: Show the home indicator.
GLFMUserInterfaceChromeNavigation,
/// Displays the app with both the navigation bar and the status bar.
/// - Android: Show the navigation bar and status bar.
/// - iOS: Show both the home indicator and the status bar.
GLFMUserInterfaceChromeNavigationAndStatusBar,
/// Displays the app without any UI chrome.
/// - Android 2.3: Fullscreen.
/// - Android 4.0 - 4.3: Navigation bar dimmed.
/// - Android 4.4: Fullscreen immersive mode.
/// - iOS: Show the home indicator dimmed.
GLFMUserInterfaceChromeNone,
} GLFMUserInterfaceChrome;
enum {
GLFMUserInterfaceChromeFullscreen GLFM_DEPRECATED("Replaced with GLFMUserInterfaceChromeNone") = GLFMUserInterfaceChromeNone,
};
typedef enum {
GLFMInterfaceOrientationUnknown = 0,
GLFMInterfaceOrientationPortrait = (1 << 0),
GLFMInterfaceOrientationPortraitUpsideDown = (1 << 1),
GLFMInterfaceOrientationLandscapeLeft = (1 << 2),
GLFMInterfaceOrientationLandscapeRight = (1 << 3),
GLFMInterfaceOrientationLandscape = (GLFMInterfaceOrientationLandscapeLeft |
GLFMInterfaceOrientationLandscapeRight),
GLFMInterfaceOrientationAll = (GLFMInterfaceOrientationPortrait |
GLFMInterfaceOrientationPortraitUpsideDown |
GLFMInterfaceOrientationLandscapeLeft |
GLFMInterfaceOrientationLandscapeRight),
GLFMInterfaceOrientationAllButUpsideDown = (GLFMInterfaceOrientationPortrait |
GLFMInterfaceOrientationLandscapeLeft |
GLFMInterfaceOrientationLandscapeRight),
} GLFMInterfaceOrientation;
/// *Deprecated:* See ``GLFMInterfaceOrientation``.
typedef enum {
GLFMUserInterfaceOrientationAny GLFM_DEPRECATED("Replaced with GLFMInterfaceOrientationAll") = GLFMInterfaceOrientationAll,
GLFMUserInterfaceOrientationPortrait GLFM_DEPRECATED("Replaced with GLFMInterfaceOrientationPortrait") = GLFMInterfaceOrientationPortrait,
GLFMUserInterfaceOrientationLandscape GLFM_DEPRECATED("Replaced with GLFMInterfaceOrientationLandscape") = GLFMInterfaceOrientationLandscape,
} GLFMUserInterfaceOrientation GLFM_DEPRECATED("Replaced with GLFMInterfaceOrientation");
typedef enum {
GLFMTouchPhaseHover,
GLFMTouchPhaseBegan,
GLFMTouchPhaseMoved,
GLFMTouchPhaseEnded,
GLFMTouchPhaseCancelled,
} GLFMTouchPhase;
typedef enum {
GLFMMouseCursorAuto,
GLFMMouseCursorNone,
GLFMMouseCursorDefault,
GLFMMouseCursorPointer,
GLFMMouseCursorCrosshair,
GLFMMouseCursorText,
GLFMMouseCursorVerticalText,
} GLFMMouseCursor;
typedef enum {
GLFMMouseWheelDeltaPixel,
GLFMMouseWheelDeltaLine,
GLFMMouseWheelDeltaPage
} GLFMMouseWheelDeltaType;
typedef enum
{
#ifdef GLFW_KEYMAP
GLFMKeyCodeUnknown = -1,
GLFMKeyCodeBackspace = 259,
GLFMKeyCodeTab = 258,
GLFMKeyCodeEnter = 257,
GLFMKeyCodeEscape = 256,
#else
GLFMKeyCodeUnknown = 0x00,
GLFMKeyCodeBackspace = 0x08, ///< Backspace key ("delete" on Apple platforms).
GLFMKeyCodeTab = 0x09,
GLFMKeyCodeEnter = 0x0D, ///< Enter key ("return" on Apple platforms).
GLFMKeyCodeEscape = 0x1B,
#endif
GLFMKeyCodeSpace = 0x20,
GLFMKeyCodeQuote = 0x27,
GLFMKeyCodeComma = 0x2C,
GLFMKeyCodeMinus = 0x2D,
GLFMKeyCodePeriod = 0x2E,
GLFMKeyCodeSlash = 0x2F,
GLFMKeyCode0 = 0x30,
GLFMKeyCode1 = 0x31,
GLFMKeyCode2 = 0x32,
GLFMKeyCode3 = 0x33,
GLFMKeyCode4 = 0x34,
GLFMKeyCode5 = 0x35,
GLFMKeyCode6 = 0x36,
GLFMKeyCode7 = 0x37,
GLFMKeyCode8 = 0x38,
GLFMKeyCode9 = 0x39,
GLFMKeyCodeSemicolon = 0x3B,
GLFMKeyCodeEqual = 0x3D,
GLFMKeyCodeA = 0x41,
GLFMKeyCodeB = 0x42,
GLFMKeyCodeC = 0x43,
GLFMKeyCodeD = 0x44,
GLFMKeyCodeE = 0x45,
GLFMKeyCodeF = 0x46,
GLFMKeyCodeG = 0x47,
GLFMKeyCodeH = 0x48,
GLFMKeyCodeI = 0x49,
GLFMKeyCodeJ = 0x4A,
GLFMKeyCodeK = 0x4B,
GLFMKeyCodeL = 0x4C,
GLFMKeyCodeM = 0x4D,
GLFMKeyCodeN = 0x4E,
GLFMKeyCodeO = 0x4F,
GLFMKeyCodeP = 0x50,
GLFMKeyCodeQ = 0x51,
GLFMKeyCodeR = 0x52,
GLFMKeyCodeS = 0x53,
GLFMKeyCodeT = 0x54,
GLFMKeyCodeU = 0x55,
GLFMKeyCodeV = 0x56,
GLFMKeyCodeW = 0x57,
GLFMKeyCodeX = 0x58,
GLFMKeyCodeY = 0x59,
GLFMKeyCodeZ = 0x5A,
GLFMKeyCodeBracketLeft = 0x5B,
GLFMKeyCodeBackslash = 0x5C,
GLFMKeyCodeBracketRight = 0x5D,
GLFMKeyCodeBackquote = 0x60, ///< Backquote, AKA grave.
#ifdef GLFW_KEYMAP
GLFMKeyCodeDelete = 261, ///< Delete key ("forward delete" on Apple platforms).
GLFMKeyCodeCapsLock = 280,
GLFMKeyCodeShiftLeft = 340,
GLFMKeyCodeShiftRight = 344,
GLFMKeyCodeControlLeft = 341,
GLFMKeyCodeControlRight = 345,
GLFMKeyCodeAltLeft = 342, ///< Left alt key (option key on Apple platforms).
GLFMKeyCodeAltRight = 346, ///< Right alt key (option key on Apple platforms).
GLFMKeyCodeMetaLeft = 343, ///< Left meta key (command key on Apple platforms).
GLFMKeyCodeMetaRight = 347, ///< Right meta key (command key on Apple platforms).
GLFMKeyCodeMenu = 348, ///< Menu key, AKA context menu.
GLFMKeyCodeInsert = 260,
GLFMKeyCodePageUp = 266,
GLFMKeyCodePageDown = 267,
GLFMKeyCodeEnd = 269,
GLFMKeyCodeHome = 268,
GLFMKeyCodeArrowLeft = 263,
GLFMKeyCodeArrowUp = 265,
GLFMKeyCodeArrowRight = 262,
GLFMKeyCodeArrowDown = 264,
// GLFMKeyCodePower = 0x99,
// GLFMKeyCodeFunction = 0x9A, ///< Fn key on Apple platforms.
GLFMKeyCodePrintScreen = 283, ///< Print Screen or System Request key.
GLFMKeyCodeScrollLock = 281,
GLFMKeyCodePause = 284, ///< Pause/Break key.
GLFMKeyCodeNumLock = 282, ///< NumLock key ("clear" on Apple platforms).
GLFMKeyCodeNumpadDecimal = 330,
GLFMKeyCodeNumpadMultiply = 332,
GLFMKeyCodeNumpadAdd = 334,
GLFMKeyCodeNumpadDivide = 331,
GLFMKeyCodeNumpadEnter = 335,
GLFMKeyCodeNumpadSubtract = 333,
GLFMKeyCodeNumpadEqual = 336,
GLFMKeyCodeNumpad0 = 320,
GLFMKeyCodeNumpad1 = 321,
GLFMKeyCodeNumpad2 = 322,
GLFMKeyCodeNumpad3 = 323,
GLFMKeyCodeNumpad4 = 324,
GLFMKeyCodeNumpad5 = 325,
GLFMKeyCodeNumpad6 = 326,
GLFMKeyCodeNumpad7 = 327,
GLFMKeyCodeNumpad8 = 328,
GLFMKeyCodeNumpad9 = 329,
GLFMKeyCodeF1 = 290,
GLFMKeyCodeF2 = 291,
GLFMKeyCodeF3 = 292,
GLFMKeyCodeF4 = 293,
GLFMKeyCodeF5 = 294,
GLFMKeyCodeF6 = 295,
GLFMKeyCodeF7 = 296,
GLFMKeyCodeF8 = 297,
GLFMKeyCodeF9 = 298,
GLFMKeyCodeF10 = 299,
GLFMKeyCodeF11 = 300,
GLFMKeyCodeF12 = 301,
GLFMKeyCodeF13 = 302,
GLFMKeyCodeF14 = 303,
GLFMKeyCodeF15 = 304,
GLFMKeyCodeF16 = 305,
GLFMKeyCodeF17 = 306,
GLFMKeyCodeF18 = 307,
GLFMKeyCodeF19 = 308,
GLFMKeyCodeF20 = 309,
GLFMKeyCodeF21 = 310,
GLFMKeyCodeF22 = 311,
GLFMKeyCodeF23 = 312,
GLFMKeyCodeF24 = 313,
GLFMKeyCodeNavigationBack = 400, ///< Back button on Android, menu/back button on tvOS remote.
GLFMKeyCodeMediaSelect = 401, ///< Select button on tvOS remote.
GLFMKeyCodeMediaPlayPause = 402, ///< Play/pause button on tvOS remote.
GLFMKeyCodePower = -1,
GLFMKeyCodeFunction = -1,
#else
GLFMKeyCodeDelete = 0x7F, ///< Delete key ("forward delete" on Apple platforms).
// Non-ASCII keys. These values may change in the future.
GLFMKeyCodeCapsLock = 0x80,
GLFMKeyCodeShiftLeft = 0x81,
GLFMKeyCodeShiftRight = 0x82,
GLFMKeyCodeControlLeft = 0x83,
GLFMKeyCodeControlRight = 0x84,
GLFMKeyCodeAltLeft = 0x85, ///< Left alt key (option key on Apple platforms).
GLFMKeyCodeAltRight = 0x86, ///< Right alt key (option key on Apple platforms).
GLFMKeyCodeMetaLeft = 0x87, ///< Left meta key (command key on Apple platforms).
GLFMKeyCodeMetaRight = 0x88, ///< Right meta key (command key on Apple platforms).
GLFMKeyCodeMenu = 0x89, ///< Menu key, AKA context menu.
GLFMKeyCodeInsert = 0x90,
GLFMKeyCodePageUp = 0x91,
GLFMKeyCodePageDown = 0x92,
GLFMKeyCodeEnd = 0x93,
GLFMKeyCodeHome = 0x94,
GLFMKeyCodeArrowLeft = 0x95,
GLFMKeyCodeArrowUp = 0x96,
GLFMKeyCodeArrowRight = 0x97,
GLFMKeyCodeArrowDown = 0x98,
GLFMKeyCodePower = 0x99,
GLFMKeyCodeFunction = 0x9A, ///< Fn key on Apple platforms.
GLFMKeyCodePrintScreen = 0x9B, ///< Print Screen or System Request key.
GLFMKeyCodeScrollLock = 0x9C,
GLFMKeyCodePause = 0x9D, ///< Pause/Break key.
GLFMKeyCodeNumLock = 0xA0, ///< NumLock key ("clear" on Apple platforms).
GLFMKeyCodeNumpadDecimal = 0xA1,
GLFMKeyCodeNumpadMultiply = 0xA2,
GLFMKeyCodeNumpadAdd = 0xA3,
GLFMKeyCodeNumpadDivide = 0xA4,
GLFMKeyCodeNumpadEnter = 0xA5,
GLFMKeyCodeNumpadSubtract = 0xA6,
GLFMKeyCodeNumpadEqual = 0xA7,
GLFMKeyCodeNumpad0 = 0xB0,
GLFMKeyCodeNumpad1 = 0xB1,
GLFMKeyCodeNumpad2 = 0xB2,
GLFMKeyCodeNumpad3 = 0xB3,
GLFMKeyCodeNumpad4 = 0xB4,
GLFMKeyCodeNumpad5 = 0xB5,
GLFMKeyCodeNumpad6 = 0xB6,
GLFMKeyCodeNumpad7 = 0xB7,
GLFMKeyCodeNumpad8 = 0xB8,
GLFMKeyCodeNumpad9 = 0xB9,
GLFMKeyCodeF1 = 0xC1,
GLFMKeyCodeF2 = 0xC2,
GLFMKeyCodeF3 = 0xC3,
GLFMKeyCodeF4 = 0xC4,
GLFMKeyCodeF5 = 0xC5,
GLFMKeyCodeF6 = 0xC6,
GLFMKeyCodeF7 = 0xC7,
GLFMKeyCodeF8 = 0xC8,
GLFMKeyCodeF9 = 0xC9,
GLFMKeyCodeF10 = 0xD0,
GLFMKeyCodeF11 = 0xD1,
GLFMKeyCodeF12 = 0xD2,
GLFMKeyCodeF13 = 0xD3,
GLFMKeyCodeF14 = 0xD4,
GLFMKeyCodeF15 = 0xD5,
GLFMKeyCodeF16 = 0xD6,
GLFMKeyCodeF17 = 0xD7,
GLFMKeyCodeF18 = 0xD8,
GLFMKeyCodeF19 = 0xD9,
GLFMKeyCodeF20 = 0xDA,
GLFMKeyCodeF21 = 0xDB,
GLFMKeyCodeF22 = 0xDC,
GLFMKeyCodeF23 = 0xDD,
GLFMKeyCodeF24 = 0xDE,
GLFMKeyCodeNavigationBack = 0xE0, ///< Back button on Android, menu/back button on tvOS remote.
GLFMKeyCodeMediaSelect = 0xE1, ///< Select button on tvOS remote.
GLFMKeyCodeMediaPlayPause = 0xE2, ///< Play/pause button on tvOS remote.
#endif
} GLFMKeyCode;
typedef GLFMKeyCode GLFMKey GLFM_DEPRECATED("Replaced with GLFMKeyCode");
enum {
GLFMKeyBackspace GLFM_DEPRECATED("Replaced with GLFMKeyCodeBackspace") = GLFMKeyCodeBackspace,
GLFMKeyTab GLFM_DEPRECATED("Replaced with GLFMKeyCodeTab") = GLFMKeyCodeTab,
GLFMKeyEnter GLFM_DEPRECATED("Replaced with GLFMKeyCodeEnter") = GLFMKeyCodeEnter,
GLFMKeyEscape GLFM_DEPRECATED("Replaced with GLFMKeyCodeEscape") = GLFMKeyCodeEscape,
GLFMKeySpace GLFM_DEPRECATED("Replaced with GLFMKeyCodeSpace") = GLFMKeyCodeSpace,
GLFMKeyPageUp GLFM_DEPRECATED("Replaced with GLFMKeyCodePageUp") = GLFMKeyCodePageUp,
GLFMKeyPageDown GLFM_DEPRECATED("Replaced with GLFMKeyCodePageDown") = GLFMKeyCodePageDown,
GLFMKeyEnd GLFM_DEPRECATED("Replaced with GLFMKeyCodeEnd") = GLFMKeyCodeEnd,
GLFMKeyHome GLFM_DEPRECATED("Replaced with GLFMKeyCodeHome") = GLFMKeyCodeHome,
GLFMKeyLeft GLFM_DEPRECATED("Replaced with GLFMKeyCodeArrowLeft") = GLFMKeyCodeArrowLeft,
GLFMKeyUp GLFM_DEPRECATED("Replaced with GLFMKeyCodeArrowUp") = GLFMKeyCodeArrowUp,
GLFMKeyRight GLFM_DEPRECATED("Replaced with GLFMKeyCodeArrowRight") = GLFMKeyCodeArrowRight,
GLFMKeyDown GLFM_DEPRECATED("Replaced with GLFMKeyCodeArrowDown") = GLFMKeyCodeArrowDown,
GLFMKeyDelete GLFM_DEPRECATED("Replaced with GLFMKeyCodeDelete") = GLFMKeyCodeDelete,
GLFMKeyNavBack GLFM_DEPRECATED("Replaced with GLFMKeyCodeNavigationBack") = GLFMKeyCodeNavigationBack,
GLFMKeyNavMenu GLFM_DEPRECATED("Replaced with GLFMKeyCodeMenu") = GLFMKeyCodeMenu,
GLFMKeyNavSelect GLFM_DEPRECATED("Replaced with GLFMKeyCodeMediaSelect") = GLFMKeyCodeMediaSelect,
GLFMKeyPlayPause GLFM_DEPRECATED("Replaced with GLFMKeyCodeMediaPlayPause") = GLFMKeyCodeMediaPlayPause,
};
typedef enum {
GLFMKeyModifierShift = (1 << 0), ///< Flag indicating a shift key is down.
GLFMKeyModifierControl = (1 << 1), ///< Flag indicating a control (ctrl) key is down.
GLFMKeyModifierAlt = (1 << 2), ///< Flag indicating an alt key is down (option key on Apple platforms).
GLFMKeyModifierMeta = (1 << 3), ///< Flag indicating a meta key is down (command key on Apple platforms).
GLFMKeyModifierFunction = (1 << 4), ///< Flag indicating a function (fn) key is down on Apple platforms.
} GLFMKeyModifier;
enum {
GLFMKeyModifierCtrl GLFM_DEPRECATED("Replaced with GLFMKeyModifierControl") = GLFMKeyModifierControl,
};
typedef enum {
GLFMKeyActionPressed,
GLFMKeyActionRepeated,
GLFMKeyActionReleased,
} GLFMKeyAction;
/// The hardware sensor type. See ``glfmIsSensorAvailable`` and ``glfmSetSensorFunc``.
typedef enum {
/// Accelerometer sensor.
/// In ``GLFMSensorFunc``, the `GLFMSensorEvent` vector is the acceleration in G's.
GLFMSensorAccelerometer,
/// Magnetometer sensor.
/// In ``GLFMSensorFunc``, the `GLFMSensorEvent` vector is the magnetic field in microteslas.
GLFMSensorMagnetometer,
/// Gyroscope sensor.
/// In ``GLFMSensorFunc``, the `GLFMSensorEvent` vector is the rotation rate in radians/second.
GLFMSensorGyroscope,
/// Rotation sensor.
/// In ``GLFMSensorFunc``, the `GLFMSensorEvent` matrix is the rotation matrix where the
/// X axis points North and the Z axis is vertical.
GLFMSensorRotationMatrix,
} GLFMSensor;
typedef enum {
GLFMHapticFeedbackLight,
GLFMHapticFeedbackMedium,
GLFMHapticFeedbackHeavy,
} GLFMHapticFeedbackStyle;
// typedef enum
// {
// GLFMAppEventStart,
// GLFMAppEventResume,
// GLFMAppEventPause,
// GLFMAppEventStop,
// } GLFMAppEvent
// MARK: - Structs and function pointers
typedef struct GLFMDisplay GLFMDisplay;
/// Function pointer returned from ``glfmGetProcAddress``.
typedef void (*GLFMProc)(void);
/// Render callback function. See ``glfmSetRenderFunc``.
typedef void (*GLFMRenderFunc)(GLFMDisplay *display);
/// *Deprecated:* Use ``GLFMRenderFunc``.
typedef void (*GLFMMainLoopFunc)(GLFMDisplay *display, double frameTime)
GLFM_DEPRECATED("See glfmSetRenderFunc and glfmSwapBuffers");
/// Callback function when mouse or touch events occur. See ``glfmSetTouchFunc``.
///
/// - Parameters:
/// - touch: The touch number (zero for primary touch, 1+ for multitouch), or
/// the mouse button number (zero for the primary button, one for secondary, etc.).
/// - phase: The touch phase.
/// - x: The x location of the event, in pixels.
/// - y: The y location of the event, in pixels.
/// - Returns: `true` if the event was handled, `false` otherwise.
typedef bool (*GLFMTouchFunc)(GLFMDisplay *display, int touch, GLFMTouchPhase phase,
double x, double y);
/// Callback function when key events occur. See ``glfmSetKeyFunc``.
///
/// For each key press, this function is called before ``GLFMCharFunc``.
///
/// - Android and tvOS: When the user presses the back button (`GLFMKeyCodeNavigationBack`), this
/// function should return `false` to allow the user to exit the app, or return `true` if the back
/// button was handled in-app.
/// - Returns: `true` if the event was handled, `false` otherwise.
typedef bool (*GLFMKeyFunc)(GLFMDisplay *display, GLFMKeyCode keyCode, GLFMKeyAction action,
int modifiers);
/// Callback function when character input events occur. See ``glfmSetCharFunc``.
///
/// - Parameters:
/// - string: A NULL-terminated UTF-8 string. The string is only valid during the callback, and
/// should be copied if it is needed after the callback returns. The string is never
/// NULL.
/// - modifier: Deprecated and always set to 0.
typedef void (*GLFMCharFunc)(GLFMDisplay *display, const char *string, int modifiers);
/// Callback function when clipboard text is received. See ``glfmRequestClipboardText``.
///
/// - Parameters:
/// - string: A NULL-terminated UTF-8 string. The string is only valid during the callback, and
/// should be copied if it is needed after the callback returns. May be NULL if there
/// is no text in the clipboard, or if the text could not be converted to UTF-8.
typedef void (*GLFMClipboardTextFunc)(GLFMDisplay *display, const char *string);
/// Callback function when mouse wheel input events occur. See ``glfmSetMouseWheelFunc``.
/// - Parameters:
/// - x: The x location of the event, in pixels.
/// - y: The y location of the event, in pixels.
/// - Returns: `true` if the event was handled, `false` otherwise.
typedef bool (*GLFMMouseWheelFunc)(GLFMDisplay *display, double x, double y,
GLFMMouseWheelDeltaType deltaType,
double deltaX, double deltaY, double deltaZ);
/// Callback function when the virtual keyboard visibility changes.
/// See ``glfmSetKeyboardVisibilityChangedFunc``.
typedef void (*GLFMKeyboardVisibilityChangedFunc)(GLFMDisplay *display, bool visible,
double x, double y, double width, double height);
/// Callback function when the app interface orientation changes.
/// See ``glfmSetOrientationChangedFunc``.
typedef void (*GLFMOrientationChangedFunc)(GLFMDisplay *display,
GLFMInterfaceOrientation orientation);
/// Callback function when the chrome insets ("safe area insets") changes.
/// See ``glfmSetDisplayChromeInsetsChangedFunc`` and ``glfmGetDisplayChromeInsets``.
typedef void (*GLFMDisplayChromeInsetsChangedFunc)(GLFMDisplay *display, double top, double right,
double bottom, double left);
/// Callback function when the surface could not be created.
/// See ``glfmSetSurfaceErrorFunc``.
typedef void (*GLFMSurfaceErrorFunc)(GLFMDisplay *display, const char *message);
/// Callback function when the OpenGL surface was created.
/// See ``glfmSetSurfaceCreatedFunc``.
typedef void (*GLFMSurfaceCreatedFunc)(GLFMDisplay *display, int width, int height);
/// Callback function when the OpenGL surface was resized (or rotated).
/// See ``glfmSetSurfaceResizedFunc``.
typedef void (*GLFMSurfaceResizedFunc)(GLFMDisplay *display, int width, int height);
/// Callback function to notify that the surface needs to be redrawn.
/// See ``glfmSetSurfaceRefreshFunc``.
typedef void (*GLFMSurfaceRefreshFunc)(GLFMDisplay *display);
/// Callback function when the OpenGL surface was destroyed.
/// See ``glfmSetSurfaceDestroyedFunc``.
typedef void (*GLFMSurfaceDestroyedFunc)(GLFMDisplay *display);
/// Callback function when the system receives a low memory warning.
/// See ``glfmSetMemoryWarningFunc``.
typedef void (*GLFMMemoryWarningFunc)(GLFMDisplay *display);
/// Callback function when the app loses or gains focus. See ``glfmSetAppFocusFunc``.
///
/// This function is called on startup after `glfmMain()`.
///
/// - Emscripten: This function is called when switching browser tabs and
/// before the page is unloaded.
typedef void (*GLFMAppFocusFunc)(GLFMDisplay *display, bool focused);
/// The result used in the hardware sensor callback. See ``glfmSetSensorFunc``.
///
/// The `vector` is used for all sensor types except for `GLFMSensorRotationMatrix`,
/// which uses `matrix`.
typedef struct {
/// The sensor type
GLFMSensor sensor;
/// The timestamp of the event, which may not be related to wall-clock time.
double timestamp;
union {
/// A three-dimensional vector.
struct {
double x, y, z;
} vector;
/// A 3x3 matrix.
struct {
double m00, m01, m02;
double m10, m11, m12;
double m20, m21, m22;
} matrix;
};
} GLFMSensorEvent;
/// Callback function when sensor events occur. See ``glfmSetSensorFunc``.
typedef void (*GLFMSensorFunc)(GLFMDisplay *display, GLFMSensorEvent event);
// MARK: - Functions
/// Main entry point for a GLFM app.
///
/// In this function, call ``glfmSetDisplayConfig`` and ``glfmSetRenderFunc``.
extern void glfmMain(GLFMDisplay *display);
/// Sets the requested display configuration.
///
/// This function should only be called in ``glfmMain``.
///
/// If the device does not support the preferred rendering API, the next available rendering API is
/// used (OpenGL ES 2.0 if OpenGL ES 3.0 is not available, for example).
/// Call ``glfmGetRenderingAPI`` in the ``GLFMSurfaceCreatedFunc`` to check which rendering API is
/// used.
void glfmSetDisplayConfig(GLFMDisplay *display,
GLFMRenderingAPI preferredAPI,
GLFMColorFormat colorFormat,
GLFMDepthFormat depthFormat,
GLFMStencilFormat stencilFormat,
GLFMMultisample multisample);
/// Sets the user data pointer.
///
/// The data is neither read nor modified. See ``glfmGetUserData``.
void glfmSetUserData(GLFMDisplay *display, void *userData);
/// Gets the user data pointer.
///
/// See ``glfmSetUserData``.
void *glfmGetUserData(const GLFMDisplay *display);
/// Swap buffers.
///
/// This function should be called at the end of the ``GLFMRenderFunc`` if any content was rendered.
///
/// - Emscripten: This function does nothing. Buffer swapping happens automatically if any
/// OpenGL calls were made.
///
/// - Apple platforms: When using the Metal rendering API, this function does nothing.
/// Presenting the Metal drawable must happen in application code.
void glfmSwapBuffers(GLFMDisplay *display);
/// *Deprecated:* Use ``glfmGetSupportedInterfaceOrientation``.
GLFMUserInterfaceOrientation glfmGetUserInterfaceOrientation(GLFMDisplay *display)
GLFM_DEPRECATED("Replaced with glfmGetSupportedInterfaceOrientation");
/// *Deprecated:* Use ``glfmSetSupportedInterfaceOrientation``.
void glfmSetUserInterfaceOrientation(GLFMDisplay *display,
GLFMUserInterfaceOrientation supportedOrientations)
GLFM_DEPRECATED("Replaced with glfmSetSupportedInterfaceOrientation");
/// Returns the supported user interface orientations. Default is `GLFMInterfaceOrientationAll`.
///
/// Actual support may be limited by the device or platform.
GLFMInterfaceOrientation glfmGetSupportedInterfaceOrientation(const GLFMDisplay *display);
/// Sets the supported user interface orientations.
///
/// Typical values are `GLFMInterfaceOrientationAll`, `GLFMInterfaceOrientationPortrait`, or
/// `GLFMInterfaceOrientationLandscape.`
///
/// Actual support may be limited by the device or platform.
void glfmSetSupportedInterfaceOrientation(GLFMDisplay *display,
GLFMInterfaceOrientation supportedOrientations);
/// Gets the current user interface orientation.
///
/// - Returns: Either `GLFMInterfaceOrientationPortrait`, `GLFMInterfaceOrientationLandscapeLeft`,
/// `GLFMInterfaceOrientationLandscapeRight`, `GLFMInterfaceOrientationPortraitUpsideDown`, or
/// `GLFMInterfaceOrientationUnknown`.
GLFMInterfaceOrientation glfmGetInterfaceOrientation(const GLFMDisplay *display);
/// Gets the display size, in pixels.
///
/// The arguments for the `width` and `height` parameters may be `NULL`.
void glfmGetDisplaySize(const GLFMDisplay *display, int *width, int *height);
/// Gets the display scale.
///
/// On Apple platforms, the value will be 1.0 for non-retina displays and 2.0
/// for retina. Similar values will be returned for Android and Emscripten.
double glfmGetDisplayScale(const GLFMDisplay *display);
/// Gets the chrome insets, in pixels (AKA "safe area insets" in iOS).
///
/// The "insets" are the space taken on the outer edges of the display by status bars,
/// navigation bars, and other UI elements.
///
/// The arguments for the `top`, `right`, `bottom`, and `left` parameters may be `NULL`.
void glfmGetDisplayChromeInsets(const GLFMDisplay *display, double *top, double *right,
double *bottom, double *left);
/// Gets the current user interface chrome (status bar and navigation bar status).
GLFMUserInterfaceChrome glfmGetDisplayChrome(const GLFMDisplay *display);
/// Sets the user interface chrome.
///
/// This may modify the chrome insets, but not immediately.
/// Use ``glfmSetDisplayChromeInsetsChangedFunc`` to be notified when insets change.
///
/// - Emscripten: To switch to fullscreen, this function must be called from an user-generated
/// event handler.
void glfmSetDisplayChrome(GLFMDisplay *display, GLFMUserInterfaceChrome uiChrome);
/// Gets the rendering API of the display.
///
/// Defaults to `GLFMRenderingAPIOpenGLES2`.
///
/// The return value is not valid until the surface is created.
GLFMRenderingAPI glfmGetRenderingAPI(const GLFMDisplay *display);
/// Sets the swap behavior for newly created surfaces (Android only).
///
/// In order to take effect, the behavior should be set before the surface
/// is created, preferable at the very beginning of the ``glfmMain`` function.
void glfmSetSwapBehavior(GLFMDisplay *display, GLFMSwapBehavior behavior);
/// Returns the swap buffer behavior.
GLFMSwapBehavior glfmGetSwapBehavior(const GLFMDisplay *display);
/// Gets the address of the specified function.
GLFMProc glfmGetProcAddress(const char *functionName);
/// Gets whether there is currently text available in the system clipboard.
///
/// - Emscripten: Returns true if the Clipboard API is available. It is not possible to know if
/// text is available in the system clipboard until it is requested.
/// - tvOS: No clipboard API is available. Always returns false.
bool glfmHasClipboardText(const GLFMDisplay *display);
/// Requests the system clipboard text.
///
/// The `clipboardTextFunc` callback may be invoked after a delay because the clipboard text
/// may be retrieved from the network (iCloud clipboard) or may require user confirmation (web
/// dialog) before proceeding.
///
/// The `clipboardTextFunc` callback is invoked only once.
///
/// If there was no text in the clipboard, the `clipboardTextFunc` callback is invoked with a NULL
/// string.
///
/// - Emscripten: On some browsers, this function can only be called in an event handler, like
/// ``GLFMTouchFunc`` or ``GLFMKeyFunc``. Currently, Firefox does not support reading
/// from the clipboard.
/// - tvOS: No clipboard API is available. The `clipboardTextFunc` callback is invoked with a NULL
/// string.
void glfmRequestClipboardText(GLFMDisplay *display, GLFMClipboardTextFunc clipboardTextFunc);
/// Set the system clipboard text.
///
/// - tvOS: No clipboard API is available. Always returns false.
///
/// - Parameters:
/// - string: A NULL-terminated UTF-8 string.
/// - Returns: `true` on success, `false` otherwise.
bool glfmSetClipboardText(GLFMDisplay *display, const char *string);
/// Gets the value of the highest precision time available, in seconds.
///
/// The time should not be considered related to wall-clock time.
double glfmGetTime(void);
// MARK: - Callback functions
/// Sets the function to call before each frame is displayed.
///
/// This function is called at regular intervals (typically 60fps).
/// Applications will typically render in this callback. If the application rendered any content,
/// the application should call ``glfmSwapBuffers`` before returning. If the application did
/// not render content, it should return without calling ``glfmSwapBuffers``.
GLFMRenderFunc glfmSetRenderFunc(GLFMDisplay *display, GLFMRenderFunc renderFunc);
/// *Deprecated:* Use ``glfmSetRenderFunc``.
///
/// If this function is set, ``glfmSwapBuffers`` is called after calling the `GLFMMainLoopFunc`.
GLFMMainLoopFunc glfmSetMainLoopFunc(GLFMDisplay *display, GLFMMainLoopFunc mainLoopFunc)
GLFM_DEPRECATED("See glfmSetRenderFunc and glfmSwapBuffers");
/// Sets the function to call when the surface could not be created.
///
/// For example, the browser does not support WebGL.
GLFMSurfaceErrorFunc glfmSetSurfaceErrorFunc(GLFMDisplay *display,
GLFMSurfaceErrorFunc surfaceErrorFunc);
/// Sets the function to call when the surface was created.
GLFMSurfaceCreatedFunc glfmSetSurfaceCreatedFunc(GLFMDisplay *display,
GLFMSurfaceCreatedFunc surfaceCreatedFunc);
/// Sets the function to call when the surface was resized (or rotated).
GLFMSurfaceResizedFunc glfmSetSurfaceResizedFunc(GLFMDisplay *display,
GLFMSurfaceResizedFunc surfaceResizedFunc);
/// Sets the function to call to notify that the surface needs to be redrawn.
///
/// This callback is called when returning from the background, or when the device was rotated.
/// The `GLFMRenderFunc` is called immediately after `GLFMSurfaceRefreshFunc`.
GLFMSurfaceRefreshFunc glfmSetSurfaceRefreshFunc(GLFMDisplay *display,
GLFMSurfaceRefreshFunc surfaceRefreshFunc);
/// Sets the function to call when the surface was destroyed.
///
/// The surface may be destroyed during OpenGL context loss.
/// All OpenGL resources should be deleted in this call.
GLFMSurfaceDestroyedFunc glfmSetSurfaceDestroyedFunc(GLFMDisplay *display,
GLFMSurfaceDestroyedFunc surfaceDestroyedFunc);
/// Sets the function to call when app interface orientation changes.
GLFMOrientationChangedFunc
glfmSetOrientationChangedFunc(GLFMDisplay *display,
GLFMOrientationChangedFunc orientationChangedFunc);
/// Sets the function to call when display chrome insets ("safe area insets") changes.
/// See also ``glfmGetDisplayChromeInsets``
GLFMDisplayChromeInsetsChangedFunc
glfmSetDisplayChromeInsetsChangedFunc(GLFMDisplay *display,
GLFMDisplayChromeInsetsChangedFunc chromeInsetsChangedFunc);
/// Sets the function to call when the system sends a "low memory" warning.
GLFMMemoryWarningFunc glfmSetMemoryWarningFunc(GLFMDisplay *display,
GLFMMemoryWarningFunc lowMemoryFunc);
/// Sets the function to call when the app loses or gains focus (goes into the background or returns
/// from the background).
GLFMAppFocusFunc glfmSetAppFocusFunc(GLFMDisplay *display, GLFMAppFocusFunc focusFunc);
// MARK: - Input functions
/// Sets whether multitouch input is enabled. By default, multitouch is disabled.
///
/// - tvOS: This function does nothing.
void glfmSetMultitouchEnabled(GLFMDisplay *display, bool multitouchEnabled);
/// Gets whether multitouch input is enabled. By default, multitouch is disabled.
///
/// - tvOS: Always returns false.
bool glfmGetMultitouchEnabled(const GLFMDisplay *display);
/// Gets whether the display has touch capabilities.
bool glfmHasTouch(const GLFMDisplay *display);
/// Checks if a hardware sensor is available.
///
/// - Emscripten: Always returns `false`.
bool glfmIsSensorAvailable(const GLFMDisplay *display, GLFMSensor sensor);
/// Sets the mouse cursor (only on platforms with a mouse).
void glfmSetMouseCursor(GLFMDisplay *display, GLFMMouseCursor mouseCursor);
/// Gets whether a virtual onscreen keyboard can be displayed.
///
/// Returns `true` on iOS and Android, `false` on other platforms.
bool glfmHasVirtualKeyboard(const GLFMDisplay *display);
/// Requests to show or hide the onscreen virtual keyboard.
///
/// On iPad, if a hardware keyboard is attached, the virtual keyboard will not actually be shown.
///
/// - Emscripten: this function does nothing.
/// - tvOS: This function does nothing.
void glfmSetKeyboardVisible(GLFMDisplay *display, bool visible);
/// Returns `true` if the virtual keyboard is currently visible.
///
/// - Emscripten: Always returns false.
/// - tvOS: Always returns false.
bool glfmIsKeyboardVisible(const GLFMDisplay *display);
/// Sets the function to call when the virtual keyboard changes visibility or changes bounds.
GLFMKeyboardVisibilityChangedFunc
glfmSetKeyboardVisibilityChangedFunc(GLFMDisplay *display,
GLFMKeyboardVisibilityChangedFunc visibilityChangedFunc);
/// Sets the function to call when a mouse or touch event occurs.
GLFMTouchFunc glfmSetTouchFunc(GLFMDisplay *display, GLFMTouchFunc touchFunc);
/// Sets the function to call when a key event occurs.
///
/// - iOS and tvOS: Key events require iOS 13.4 and tvOS 13.4. No repeated events
/// (`GLFMKeyActionRepeated`) are sent.
///
/// - iOS and Android: Use ``glfmSetKeyboardVisible`` to show the virtual keyboard.
/// - Android and tvOS: When the user presses the back button (`GLFMKeyCodeNavigationBack`), the
/// `GLFMKeyFunc` function should return `false` to allow the user to exit the app, or return `true`
/// if the back button was handled in-app.
GLFMKeyFunc glfmSetKeyFunc(GLFMDisplay *display, GLFMKeyFunc keyFunc);
/// Sets the function to call when character input events occur.
///
/// Character events occur when a user types with a virtual keyboard on iOS and Android, or when
/// typing with a connected physical keyboard.
///
/// On iOS and Android, use ``glfmSetKeyboardVisible`` to show the virtual keyboard.
///
/// The callback function is called for key repeat events in some case, but not all. No repeat
/// events occur in the following situations:
/// * Android virtual keyboard (Except for the backspace key, which does send repeat events).
/// * iOS virtual keyboard.
/// * tvOS physical keyboard.
///
/// On Android, non-ASCII characters are not automatically received due to a limitation in the NDK.
/// To receive them, add this code in your `Activity`:
///
/// ```
/// public class MyActivity extends NativeActivity {
///
/// // Send unicode keyboard input to GLFM (using keycode value Integer.MAX_VALUE)
/// // Override
/// public boolean dispatchKeyEvent(KeyEvent event) {
/// if (event.getKeyCode() == KeyEvent.KEYCODE_UNKNOWN && event.getCharacters() != null &&
/// getWindow() != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
/// String s = event.getCharacters();
/// for (int offset = 0; offset < s.length(); ) {
/// int codepoint = s.codePointAt(offset);
/// getWindow().injectInputEvent(new KeyEvent(event.getDownTime(), event.getEventTime(),
/// KeyEvent.ACTION_DOWN, Integer.MAX_VALUE, 0, 0, 0, codepoint));
/// offset += Character.charCount(codepoint);
/// }
/// return true;
/// }
/// return super.dispatchKeyEvent(event);
/// }
/// }
/// ```
/// This code intercepts character events and re-dispatches them with the unicode values to GLFM.
GLFMCharFunc glfmSetCharFunc(GLFMDisplay *display, GLFMCharFunc charFunc);
/// Sets the function to call when the mouse wheel is moved.
///
/// Only enabled on Emscripten.
GLFMMouseWheelFunc glfmSetMouseWheelFunc(GLFMDisplay *display, GLFMMouseWheelFunc mouseWheelFunc);
/// Sets the function to call when the hardware sensor events occur for a particular sensor.
///
/// If the hardware sensor is not available, this function does nothing.
/// See ``glfmIsSensorAvailable``.
///
/// Each ``GLFMSensor`` type can have its own ``GLFMSensorFunc``.
///
/// The hardware sensor is enabled when the `sensorFunc` is not `NULL`.
///
/// Sensor events can drain battery. To save battery, when sensor events are not needed,
/// set the `sensorFunc` to `NULL` to disable the sensor.
///
/// Sensors are automatically disabled when the app is inactive, and re-enabled when active again.
GLFMSensorFunc glfmSetSensorFunc(GLFMDisplay *display, GLFMSensor sensor, GLFMSensorFunc sensorFunc);
// MARK: - Haptics
/// Returns true if the device supports haptic feedback.
///
/// - iOS: Returns `true` if the device supports haptic feedback (iPhone 7 or newer) and
/// the device is running iOS 13 or newer.
/// - Emscripten: Always returns `false`.
bool glfmIsHapticFeedbackSupported(const GLFMDisplay *display);
/// Performs haptic feedback.
///
/// - Emscripten: This function does nothing.
void glfmPerformHapticFeedback(GLFMDisplay *display, GLFMHapticFeedbackStyle style);
// MARK: - Platform-specific functions
/// Returns `true` if this is an Apple platform that supports Metal, `false` otherwise.
bool glfmIsMetalSupported(const GLFMDisplay *display);
#if defined(__APPLE__) || defined(GLFM_EXPOSE_NATIVE_APPLE)
/// *Apple platforms only*: Returns a pointer to an `MTKView` instance, or `NULL` if Metal is not
/// available.
///
/// This will only return a valid reference after the surface was created.
void *glfmGetMetalView(const GLFMDisplay *display);
/// *Apple platforms only*: Returns a pointer to the `UIViewController` (iOS, tvOS) or the
/// `NSViewController` (macOS) used to display content.
void *glfmGetViewController(const GLFMDisplay *display);
#endif // GLFM_EXPOSE_NATIVE_APPLE
#if defined(__ANDROID__) || defined(GLFM_EXPOSE_NATIVE_ANDROID)
#if defined(__ANDROID__)
# include <android/native_activity.h>
#else
typedef struct ANativeActivity ANativeActivity;
#endif
ANativeActivity *glfmAndroidGetActivity(void) GLFM_DEPRECATED("Use glfmGetAndroidActivity");
/// *Android only*: Returns a pointer to the display's `ANativeActivity` instance.
///
/// The returned `ANativeActivity` may be invalidated when the surface is destroyed. If a reference
/// to the `ANativeActivity` is kept, call this function again to get an updated reference in
/// ``GLFMSurfaceCreatedFunc`` or ``GLFMAppFocusFunc``.
void *glfmGetAndroidActivity(const GLFMDisplay *display);
#endif // GLFM_EXPOSE_NATIVE_ANDROID
#ifdef __cplusplus
}
#endif
#endif // GLFM_H