From a0befac711548cd7c8a6b6897d4c5ff50ebcb751 Mon Sep 17 00:00:00 2001 From: ev1313 Date: Tue, 17 Sep 2013 18:31:19 +0200 Subject: [PATCH] added haptic and messagebox --- sdl2.pas | 5 + sdlhaptic.inc | 1157 +++++++++++++++++++++++++++++++++++++++++++++ sdlmessagebox.inc | 108 +++++ 3 files changed, 1270 insertions(+) create mode 100644 sdlhaptic.inc create mode 100644 sdlmessagebox.inc diff --git a/sdl2.pas b/sdl2.pas index 46808b6..f26b2a5 100644 --- a/sdl2.pas +++ b/sdl2.pas @@ -14,6 +14,7 @@ "sdl_events.h", "sdl_error.h", "sdl_gesture.h", + "sdl_haptic.h", "sdl_joystick.h", "sdl_keyboard.h", "sdl_keycode.h", @@ -21,6 +22,7 @@ "sdl_pixels.h", "sdl_power.h", "sdl_main.h", + "sdl_messagebox.h", "sdl_mouse.h", "sdl_mutex.h", "sdl_rect.h", @@ -78,6 +80,7 @@ { Changelog: ---------- + v.1.70-stable; 17.09.2013: added "sdl_messagebox.h" and "sdl_haptic.h" v.1.63-stable; 16.09.2013: added libs sdl2_image and sdl2_ttf and added sdl_audio.h v.1.62-stable; 03.09.2013: fixed. v.1.61-stable; 02.09.2013: now it should REALLY work with Mac... @@ -164,11 +167,13 @@ interface {$I sdlsurface.inc} {$I sdlshape.inc} {$I sdlvideo.inc} +{$I sdlmessagebox.inc} {$I sdlrenderer.inc} {$I sdlscancode.inc} {$I sdlkeyboard.inc} {$I sdlmouse.inc} {$I sdljoystick.inc} +{$I sdlhaptic.inc} {$I sdltouch.inc} {$I sdlgesture.inc} {$I sdlevents.inc} diff --git a/sdlhaptic.inc b/sdlhaptic.inc new file mode 100644 index 0000000..b0ef8f4 --- /dev/null +++ b/sdlhaptic.inc @@ -0,0 +1,1157 @@ +//from "sdl_haptic.h" + +{** + * + * The SDL Haptic subsystem allows you to control haptic (force feedback) + * devices. + * + * The basic usage is as follows: + * - Initialize the Subsystem (::SDL_INIT_HAPTIC). + * - Open a Haptic Device. + * - SDL_HapticOpen() to open from index. + * - SDL_HapticOpenFromJoystick() to open from an existing joystick. + * - Create an effect (::SDL_HapticEffect). + * - Upload the effect with SDL_HapticNewEffect(). + * - Run the effect with SDL_HapticRunEffect(). + * - (optional) Free the effect with SDL_HapticDestroyEffect(). + * - Close the haptic device with SDL_HapticClose(). + * + * Simple rumble example: + * + * SDL_Haptic *haptic; + * + * // Open the device + * haptic = SDL_HapticOpen( 0 ); + * if (haptic == NULL) + * return -1; + * + * // Initialize simple rumble + * if (SDL_HapticRumbleInit( haptic ) != 0) + * return -1; + * + * // Play effect at 50% strength for 2 seconds + * if (SDL_HapticRumblePlay( haptic, 0.5, 2000 ) != 0) + * return -1; + * SDL_Delay( 2000 ); + * + * // Clean up + * SDL_HapticClose( haptic ); + * + * + * Complete example: + * + * int test_haptic( SDL_Joystick * joystick ) + * SDL_Haptic *haptic; + * SDL_HapticEffect effect; + * int effect_id; + * + * // Open the device + * haptic = SDL_HapticOpenFromJoystick( joystick ); + * if (haptic == NULL) return -1; // Most likely joystick isn't haptic + * + * // See if it can do sine waves + * if ((SDL_HapticQuery(haptic) & SDL_HAPTIC_SINE)==0) + * SDL_HapticClose(haptic); // No sine effect + * return -1; + * + * + * // Create the effect + * memset( &effect, 0, sizeof(SDL_HapticEffect) ); // 0 is safe default + * effect.type = SDL_HAPTIC_SINE; + * effect.periodic.direction.type = SDL_HAPTIC_POLAR; // Polar coordinates + * effect.periodic.direction.dir[0] = 18000; // Force comes from south + * effect.periodic.period = 1000; // 1000 ms + * effect.periodic.magnitude = 20000; // 20000/32767 strength + * effect.periodic.length = 5000; // 5 seconds long + * effect.periodic.attack_length = 1000; // Takes 1 second to get max strength + * effect.periodic.fade_length = 1000; // Takes 1 second to fade away + * + * // Upload the effect + * effect_id = SDL_HapticNewEffect( haptic, &effect ); + * + * // Test the effect + * SDL_HapticRunEffect( haptic, effect_id, 1 ); + * SDL_Delay( 5000); // Wait for the effect to finish + * + * // We destroy the effect, although closing the device also does this + * SDL_HapticDestroyEffect( haptic, effect_id ); + * + * // Close the device + * SDL_HapticClose(haptic); + * + * return 0; // Success + * + * + * + * You can also find out more information on my blog: + * http://bobbens.dyndns.org/journal/2010/sdl_haptic/ + * + * Edgar Simo Serra + *} + +{$I jedi.inc} + + {** + * SDL_Haptic + * + * The haptic structure used to identify an SDL haptic. + * + * SDL_HapticOpen + * SDL_HapticOpenFromJoystick + * SDL_HapticClose + *} +type + PSDL_Haptic = ^TSDL_Haptic; + TSDL_Haptic = record end; + + {** + * Haptic features + * + * Different haptic features a device can have. + *} + + {** + * Haptic effects + *} + + {** + * Constant effect supported. + * + * Constant haptic effect. + * + * SDL_HapticCondition + *} +const + SDL_HAPTIC_CONSTANT = (1 shl 0); + + {** + * Sine wave effect supported. + * + * Periodic haptic effect that simulates sine waves. + * + * SDL_HapticPeriodic + *} +const + SDL_HAPTIC_SINE = (1 shl 1); + + {** + * Square wave effect supported. + * + * Periodic haptic effect that simulates square waves. + * + * SDL_HapticPeriodic + *} +const + SDL_HAPTIC_SQUARE = (1 shl 2); + + {** + * Triangle wave effect supported. + * + * Periodic haptic effect that simulates triangular waves. + * + * SDL_HapticPeriodic + *} +const + SDL_HAPTIC_TRIANGLE = (1 shl 3); + + {** + * Sawtoothup wave effect supported. + * + * Periodic haptic effect that simulates saw tooth up waves. + * + * SDL_HapticPeriodic + *} +const + SDL_HAPTIC_SAWTOOTHUP = (1 shl 4); + + {** + * Sawtoothdown wave effect supported. + * + * Periodic haptic effect that simulates saw tooth down waves. + * + * SDL_HapticPeriodic + *} +const + SDL_HAPTIC_SAWTOOTHDOWN = (1 shl 5); + + {** + * Ramp effect supported. + * + * Ramp haptic effect. + * + * SDL_HapticRamp + *} +const + SDL_HAPTIC_RAMP = (1 shl 6); + + {** + * Spring effect supported - uses axes position. + * + * Condition haptic effect that simulates a spring. Effect is based on the + * axes position. + * + * SDL_HapticCondition + *} +const + SDL_HAPTIC_SPRING = (1 shl 7); + + {** + * Damper effect supported - uses axes velocity. + * + * Condition haptic effect that simulates dampening. Effect is based on the + * axes velocity. + * + * SDL_HapticCondition + *} +const + SDL_HAPTIC_DAMPER = (1 shl 8); + + {** + * Inertia effect supported - uses axes acceleration. + * + * Condition haptic effect that simulates inertia. Effect is based on the axes + * acceleration. + * + * SDL_HapticCondition + *} +const + SDL_HAPTIC_INERTIA = (1 shl 9); + + {** + * Friction effect supported - uses axes movement. + * + * Condition haptic effect that simulates friction. Effect is based on the + * axes movement. + * + * SDL_HapticCondition + *} +const + SDL_HAPTIC_FRICTION = (1 shl 10); + + {** + * Custom effect is supported. + * + * User defined custom haptic effect. + *} +const + SDL_HAPTIC_CUSTOM = (1 shl 11); + + {*Haptic effects*} + + {* These last few are features the device has, not effects *} + + {** + * Device can set global gain. + * + * Device supports setting the global gain. + * + * SDL_HapticSetGain + *} +const + SDL_HAPTIC_GAIN = (1 shl 12); + + {** + * Device can set autocenter. + * + * Device supports setting autocenter. + * + * SDL_HapticSetAutocenter + *} +const + SDL_HAPTIC_AUTOCENTER = (1 shl 13); + + {** + * Device can be queried for effect status. + * + * Device can be queried for effect status. + * + * SDL_HapticGetEffectStatus + *} +const + SDL_HAPTIC_STATUS = (1 shl 14); + + {** + * Device can be paused. + * + * SDL_HapticPause + * SDL_HapticUnpause + *} +const + SDL_HAPTIC_PAUSE = (1 shl 15); + + {** + * Direction encodings + *} + + {** + * Uses polar coordinates for the direction. + * + * SDL_HapticDirection + *} +const + SDL_HAPTIC_POLAR = 0; + + {** + * Uses cartesian coordinates for the direction. + * + * SDL_HapticDirection + *} +const + SDL_HAPTIC_CARTESIAN = 1; + + {** + * Uses spherical coordinates for the direction. + * + * SDL_HapticDirection + *} +const + SDL_HAPTIC_SPHERICAL = 2; + + {*Direction encodings*} + + {*Haptic features*} + + {* + * Misc defines. + *} + + {** + * Used to play a device an infinite number of times. + * + * SDL_HapticRunEffect + *} +const + //SDL_HAPTIC_INFINITY = 4294967295U; + SDL_HAPTIC_INFINITY = 4294967295; //right?! + + {** + * Structure that represents a haptic direction. + * + * Directions can be specified by: + * - SDL_HAPTIC_POLAR : Specified by polar coordinates. + * - SDL_HAPTIC_CARTESIAN : Specified by cartesian coordinates. + * - SDL_HAPTIC_SPHERICAL : Specified by spherical coordinates. + * + * Cardinal directions of the haptic device are relative to the positioning + * of the device. North is considered to be away from the user. + * + * The following diagram represents the cardinal directions: + * + .--. + |__| .-------. + |=.| |.-----.| + |--| || || + | | |'-----'| + |__|~')_____(' + [ COMPUTER ] + + + North (0,-1) + ^ + | + | + (1,0) West <----[ HAPTIC ]----> East (-1,0) + | + | + v + South (0,1) + + + [ USER ] + \|||/ + (o o) + ---ooO-(_)-Ooo--- + + * + * If type is SDL_HAPTIC_POLAR, direction is encoded by hundredths of a + * degree starting north and turning clockwise. ::SDL_HAPTIC_POLAR only uses + * the first dir parameter. The cardinal directions would be: + * - North: 0 (0 degrees) + * - East: 9000 (90 degrees) + * - South: 18000 (180 degrees) + * - West: 27000 (270 degrees) + * + * If type is SDL_HAPTIC_CARTESIAN, direction is encoded by three positions + * (X axis, Y axis and Z axis (with 3 axes)). ::SDL_HAPTIC_CARTESIAN uses + * the first three dir parameters. The cardinal directions would be: + * - North: 0,-1, 0 + * - East: -1, 0, 0 + * - South: 0, 1, 0 + * - West: 1, 0, 0 + * + * The Z axis represents the height of the effect if supported, otherwise + * it's unused. In cartesian encoding (1, 2) would be the same as (2, 4), you + * can use any multiple you want, only the direction matters. + * + * If type is SDL_HAPTIC_SPHERICAL, direction is encoded by two rotations. + * The first two dir parameters are used. The dir parameters are as + * follows (all values are in hundredths of degrees): + * - Degrees from (1, 0) rotated towards (0, 1). + * - Degrees towards (0, 0, 1) (device needs at least 3 axes). + * + * + * Example of force coming from the south with all encodings (force coming + * from the south means the user will have to pull the stick to counteract): + * + * SDL_HapticDirection direction; + * + * // Cartesian directions + * direction.type = SDL_HAPTIC_CARTESIAN; // Using cartesian direction encoding. + * direction.dir[0] = 0; // X position + * direction.dir[1] = 1; // Y position + * // Assuming the device has 2 axes, we don't need to specify third parameter. + * + * // Polar directions + * direction.type = SDL_HAPTIC_POLAR; // We'll be using polar direction encoding. + * direction.dir[0] = 18000; // Polar only uses first parameter + * + * // Spherical coordinates + * direction.type = SDL_HAPTIC_SPHERICAL; // Spherical encoding + * direction.dir[0] = 9000; // Since we only have two axes we don't need more parameters. + * + * + * SDL_HAPTIC_POLAR + * SDL_HAPTIC_CARTESIAN + * SDL_HAPTIC_SPHERICAL + * SDL_HapticEffect + * SDL_HapticNumAxes + *} +type + TSDL_HapticDirection = record + _type: UInt8; {**< The type of encoding. *} + dir: array[0..2] of SInt32; {**< The encoded direction. *} + end; + + {** + * A structure containing a template for a Constant effect. + * + * The struct is exclusive to the ::SDL_HAPTIC_CONSTANT effect. + * + * A constant effect applies a constant force in the specified direction + * to the joystick. + * + * SDL_HAPTIC_CONSTANT + * SDL_HapticEffect + *} +type + TSDL_HapticConstant = record + {* Header *} + _type: UInt16; {**< SDL_HAPTIC_CONSTANT *} + direction: TSDL_HapticDirection; {**< Direction of the effect. *} + + {* Replay *} + length: UInt32; {**< Duration of the effect. *} + delay: UInt16; {**< Delay before starting the effect. *} + + {* Trigger *} + button: UInt16; {**< Button that triggers the effect. *} + interval: UInt16; {**< How soon it can be triggered again after button. *} + + {* Constant *} + level: SInt16; {**< Strength of the constant effect. *} + + {* Envelope *} + attack_length: UInt16; {**< Duration of the attack. *} + attack_level: UInt16; {**< Level at the start of the attack. *} + fade_length: UInt16; {**< Duration of the fade. *} + fade_level: UInt16; {**< Level at the end of the fade. *} + end; + + {** + * A structure containing a template for a Periodic effect. + * + * The struct handles the following effects: + * - SDL_HAPTIC_SINE + * - SDL_HAPTIC_SQUARE + * - SDL_HAPTIC_TRIANGLE + * - SDL_HAPTIC_SAWTOOTHUP + * - SDL_HAPTIC_SAWTOOTHDOWN + * + * A periodic effect consists in a wave-shaped effect that repeats itself + * over time. The type determines the shape of the wave and the parameters + * determine the dimensions of the wave. + * + * Phase is given by hundredth of a cycle meaning that giving the phase a value + * of 9000 will displace it 25% of its period. Here are sample values: + * - 0: No phase displacement. + * - 9000: Displaced 25% of its period. + * - 18000: Displaced 50% of its period. + * - 27000: Displaced 75% of its period. + * - 36000: Displaced 100% of its period, same as 0, but 0 is preferred. + * + * Examples: + * + SDL_HAPTIC_SINE + __ __ __ __ + / \ / \ / \ / + / \__/ \__/ \__/ + + SDL_HAPTIC_SQUARE + __ __ __ __ __ + | | | | | | | | | | + | |__| |__| |__| |__| | + + SDL_HAPTIC_TRIANGLE + /\ /\ /\ /\ /\ + / \ / \ / \ / \ / + / \/ \/ \/ \/ + + SDL_HAPTIC_SAWTOOTHUP + /| /| /| /| /| /| /| + / | / | / | / | / | / | / | + / |/ |/ |/ |/ |/ |/ | + + SDL_HAPTIC_SAWTOOTHDOWN + \ |\ |\ |\ |\ |\ |\ | + \ | \ | \ | \ | \ | \ | \ | + \| \| \| \| \| \| \| + + * + * SDL_HAPTIC_SINE + * SDL_HAPTIC_SQUARE + * SDL_HAPTIC_TRIANGLE + * SDL_HAPTIC_SAWTOOTHUP + * SDL_HAPTIC_SAWTOOTHDOWN + * SDL_HapticEffect + *} +type + TSDL_HapticPeriodic = record + { Header *} + _type: UInt16; {**< SDL_HAPTIC_SINE, SDL_HAPTIC_SQUARE, + SDL_HAPTIC_TRIANGLE, SDL_HAPTIC_SAWTOOTHUP or + SDL_HAPTIC_SAWTOOTHDOWN *} + direction: TSDL_HapticDirection; {**< Direction of the effect. *} + + {* Replay *} + length: UInt32; {**< Duration of the effect. *} + delay: UInt16; {**< Delay before starting the effect. *} + + {* Trigger *} + button: UInt16; {**< Button that triggers the effect. *} + interval: UInt16; {**< How soon it can be triggered again after button. *} + + {* Periodic *} + period: UInt16; {**< Period of the wave. *} + magnitude: SInt16; {**< Peak value. *} + offset: SInt16; {**< Mean value of the wave. *} + phase: UInt16; {**< Horizontal shift given by hundredth of a cycle. *} + + {* Envelope *} + attack_length: UInt16; {**< Duration of the attack. *} + attack_level: UInt16; {**< Level at the start of the attack. *} + fade_length: UInt16; {**< Duration of the fade. *} + fade_level: UInt16; {**< Level at the end of the fade. *} + end; + + {** + * A structure containing a template for a Condition effect. + * + * The struct handles the following effects: + * - SDL_HAPTIC_SPRING: Effect based on axes position. + * - SDL_HAPTIC_DAMPER: Effect based on axes velocity. + * - SDL_HAPTIC_INERTIA: Effect based on axes acceleration. + * - SDL_HAPTIC_FRICTION: Effect based on axes movement. + * + * Direction is handled by condition internals instead of a direction member. + * The condition effect specific members have three parameters. The first + * refers to the X axis, the second refers to the Y axis and the third + * refers to the Z axis. The right terms refer to the positive side of the + * axis and the left terms refer to the negative side of the axis. Please + * refer to the ::SDL_HapticDirection diagram for which side is positive and + * which is negative. + * + * SDL_HapticDirection + * SDL_HAPTIC_SPRING + * SDL_HAPTIC_DAMPER + * SDL_HAPTIC_INERTIA + * SDL_HAPTIC_FRICTION + * SDL_HapticEffect + *} +type + TSDL_HapticCondition = record + {* Header *} + _type: UInt16; {**< SDL_HAPTIC_SPRING, SDL_HAPTIC_DAMPER, + SDL_HAPTIC_INERTIA or SDL_HAPTIC_FRICTION *} + direction: TSDL_HapticDirection; {**< Direction of the effect - Not used ATM. *} + + {* Replay *} + length: UInt32; {**< Duration of the effect. *} + delay: UInt16; {**< Delay before starting the effect. *} + + {* Trigger *} + button: UInt16; {**< Button that triggers the effect. *} + interval: UInt16; {**< How soon it can be triggered again after button. *} + + {* Condition *} + right_sat: array[0..2] of UInt16; {**< Level when joystick is to the positive side. *} + left_sat: array[0..2] of UInt16; {**< Level when joystick is to the negative side. *} + right_coeff: array[0..2] of SInt16; {**< How fast to increase the force towards the positive side. *} + left_coeff: array[0..2] of SInt16; {**< How fast to increase the force towards the negative side. *} + deadband: array[0..2] of UInt16; {**< Size of the dead zone. *} + center: array[0..2] of SInt16; {**< Position of the dead zone. *} + end; + + {** + * A structure containing a template for a Ramp effect. + * + * This struct is exclusively for the ::SDL_HAPTIC_RAMP effect. + * + * The ramp effect starts at start strength and ends at end strength. + * It augments in linear fashion. If you use attack and fade with a ramp + * the effects get added to the ramp effect making the effect become + * quadratic instead of linear. + * + * SDL_HAPTIC_RAMP + * SDL_HapticEffect + *} +type + TSDL_HapticRamp = record + {* Header *} + _type: UInt16; {**< SDL_HAPTIC_RAMP *} + direction: TSDL_HapticDirection; {**< Direction of the effect. *} + + {* Replay *} + length: UInt32; {**< Duration of the effect. *} + delay: UInt16; {**< Delay before starting the effect. *} + + {* Trigger *} + button: UInt16; {**< Button that triggers the effect. *} + interval: UInt16; {**< How soon it can be triggered again after button. *} + + {* Ramp *} + start: SInt16; {**< Beginning strength level. *} + _end: SInt16; {**< Ending strength level. *} + + {* Envelope *} + attack_length: UInt16; {**< Duration of the attack. *} + attack_level: UInt16; {**< Level at the start of the attack. *} + fade_length: UInt16; {**< Duration of the fade. *} + fade_level: UInt16; {**< Level at the end of the fade. *} + end; + + {** + * A structure containing a template for the ::SDL_HAPTIC_CUSTOM effect. + * + * A custom force feedback effect is much like a periodic effect, where the + * application can define its exact shape. You will have to allocate the + * data yourself. Data should consist of channels * samples Uint16 samples. + * + * If channels is one, the effect is rotated using the defined direction. + * Otherwise it uses the samples in data for the different axes. + * + * SDL_HAPTIC_CUSTOM + * SDL_HapticEffect + *} +type + TSDL_HapticCustom = record + {* Header *} + _type: UInt16; {**< SDL_HAPTIC_CUSTOM *} + direction: TSDL_HapticDirection; {**< Direction of the effect. *} + + {* Replay *} + length: UInt32; {**< Duration of the effect. *} + delay: UInt16; {**< Delay before starting the effect. *} + + {* Trigger *} + button: UInt16; {**< Button that triggers the effect. *} + interval: UInt16; {**< How soon it can be triggered again after button. *} + + {* Custom *} + channels: UInt8; {**< Axes to use, minimum of one. *} + period: UInt16; {**< Sample periods. *} + samples: UInt16; {**< Amount of samples. *} + data: PUInt16; {**< Should contain channels*samples items. *} + + {* Envelope *} + attack_length: UInt16; {**< Duration of the attack. *} + attack_level: UInt16; {**< Level at the start of the attack. *} + fade_length: UInt16; {**< Duration of the fade. *} + fade_level: UInt16; {**< Level at the end of the fade. *} + end; + + {** + * The generic template for any haptic effect. + * + * All values max at 32767 (0x7FFF). Signed values also can be negative. + * Time values unless specified otherwise are in milliseconds. + * + * You can also pass SDL_HAPTIC_INFINITY to length instead of a 0-32767 + * value. Neither delay, interval, attack_length nor fade_length support + * SDL_HAPTIC_INFINITY. Fade will also not be used since effect never ends. + * + * Additionally, the SDL_HAPTIC_RAMP effect does not support a duration of + * SDL_HAPTIC_INFINITY. + * + * Button triggers may not be supported on all devices, it is advised to not + * use them if possible. Buttons start at index 1 instead of index 0 like + * the joystick. + * + * If both attack_length and fade_level are 0, the envelope is not used, + * otherwise both values are used. + * + * Common parts: + * + * // Replay - All effects have this + * Uint32 length; // Duration of effect (ms). + * Uint16 delay; // Delay before starting effect. + * + * // Trigger - All effects have this + * Uint16 button; // Button that triggers effect. + * Uint16 interval; // How soon before effect can be triggered again. + * + * // Envelope - All effects except condition effects have this + * Uint16 attack_length; // Duration of the attack (ms). + * Uint16 attack_level; // Level at the start of the attack. + * Uint16 fade_length; // Duration of the fade out (ms). + * Uint16 fade_level; // Level at the end of the fade. + * + * + * + * Here we have an example of a constant effect evolution in time: + * + Strength + ^ + | + | effect level --> _________________ + | / \ + | / \ + | / \ + | / \ + | attack_level --> | \ + | | | <--- fade_level + | + +--------------------------------------------------> Time + [--] [---] + attack_length fade_length + + [------------------][-----------------------] + delay length + + * + * Note either the attack_level or the fade_level may be above the actual + * effect level. + * + * SDL_HapticConstant + * SDL_HapticPeriodic + * SDL_HapticCondition + * SDL_HapticRamp + * SDL_HapticCustom + *} +type + PSDL_HapticEffect = ^TSDL_HapticEffect; + TSDL_HapticEffect = record + {* Common for all force feedback effects *} + _type: UInt16; {**< Effect type. *} + case UInt16 of + 0: (constant: TSDL_HapticConstant;); {**< Constant effect. *} + 1: (periodic: TSDL_HapticPeriodic;); {**< Periodic effect. *} + 2: (condition: TSDL_HapticCondition;); {**< Condition effect. *} + 3: (ramp: TSDL_HapticRamp;); {**< Ramp effect. *} + 4: (custom: TSDL_HapticCustom;); {**< Custom effect. *} + end; + + {* Function prototypes *} + + {** + * Count the number of haptic devices attached to the system. + * + * Number of haptic devices detected on the system. + *} +function SDL_NumHaptics: Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_NumHaptics' {$ENDIF} {$ENDIF}; + + {** + * Get the implementation dependent name of a Haptic device. + * + * This can be called before any joysticks are opened. + * If no name can be found, this function returns NULL. + * + * device_index Index of the device to get its name. + * Name of the device or NULL on error. + * + * SDL_NumHaptics + *} +function SDL_HapticName(device_index: Integer): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticName' {$ENDIF} {$ENDIF}; + + {** + * Opens a Haptic device for usage. + * + * The index passed as an argument refers to the N'th Haptic device on this + * system. + * + * When opening a haptic device, its gain will be set to maximum and + * autocenter will be disabled. To modify these values use + * SDL_HapticSetGain() and SDL_HapticSetAutocenter(). + * + * device_index Index of the device to open. + * Device identifier or NULL on error. + * + * SDL_HapticIndex + * SDL_HapticOpenFromMouse + * SDL_HapticOpenFromJoystick + * SDL_HapticClose + * SDL_HapticSetGain + * SDL_HapticSetAutocenter + * SDL_HapticPause + * SDL_HapticStopAll + *} +function SDL_HapticOpen(device_index: Integer): PSDL_Haptic cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticOpen' {$ENDIF} {$ENDIF}; + + {** + * Checks if the haptic device at index has been opened. + * + * device_index Index to check to see if it has been opened. + * 1 if it has been opened or 0 if it hasn't. + * + * SDL_HapticOpen + * SDL_HapticIndex + *} +function SDL_HapticOpened(device_index: Integer): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticOpened' {$ENDIF} {$ENDIF}; + + {** + * Gets the index of a haptic device. + * + * haptic Haptic device to get the index of. + * The index of the haptic device or -1 on error. + * + * SDL_HapticOpen + * SDL_HapticOpened + *} +function SDL_HapticIndex(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticIndex' {$ENDIF} {$ENDIF}; + + {** + * Gets whether or not the current mouse has haptic capabilities. + * + * SDL_TRUE if the mouse is haptic, SDL_FALSE if it isn't. + * + * SDL_HapticOpenFromMouse + *} +function SDL_MouseIsHaptic: Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_MouseInHaptic' {$ENDIF} {$ENDIF}; + + {** + * Tries to open a haptic device from the current mouse. + * + * The haptic device identifier or NULL on error. + * + * SDL_MouseIsHaptic + * SDL_HapticOpen + *} +function SDL_HapticOpenFromMouse: PSDL_Haptic cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticOpenFromMouse' {$ENDIF} {$ENDIF}; + + {** + * Checks to see if a joystick has haptic features. + * + * joystick Joystick to test for haptic capabilities. + * 1 if the joystick is haptic, 0 if it isn't + * or -1 if an error ocurred. + * + * SDL_HapticOpenFromJoystick + *} +function SDL_JoystickIsHaptic(joystick: PSDL_Joystick): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickIsHaptic' {$ENDIF} {$ENDIF}; + + {** + * Opens a Haptic device for usage from a Joystick device. + * + * You must still close the haptic device seperately. It will not be closed + * with the joystick. + * + * When opening from a joystick you should first close the haptic device before + * closing the joystick device. If not, on some implementations the haptic + * device will also get unallocated and you'll be unable to use force feedback + * on that device. + * + * joystick Joystick to create a haptic device from. + * A valid haptic device identifier on success or NULL on error. + * + * SDL_HapticOpen + * SDL_HapticClose + *} +function SDL_HapticOpenFromJoystick(joystick: PSDL_Joystick): PSDL_Haptic cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticOpenFromJoystick' {$ENDIF} {$ENDIF}; + + {** + * Closes a Haptic device previously opened with SDL_HapticOpen(). + * + * haptic Haptic device to close. + *} +procedure SDL_HapticClose(haptic: PSDL_Haptic) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticClose' {$ENDIF} {$ENDIF}; + + {** + * Returns the number of effects a haptic device can store. + * + * On some platforms this isn't fully supported, and therefore is an + * approximation. Always check to see if your created effect was actually + * created and do not rely solely on SDL_HapticNumEffects(). + * + * haptic The haptic device to query effect max. + * The number of effects the haptic device can store or + * -1 on error. + * + * SDL_HapticNumEffectsPlaying + * SDL_HapticQuery + *} +function SDL_HapticNumEffects(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticNumEffects' {$ENDIF} {$ENDIF}; + + {** + * Returns the number of effects a haptic device can play at the same + * time. + * + * This is not supported on all platforms, but will always return a value. + * Added here for the sake of completeness. + * + * haptic The haptic device to query maximum playing effects. + * The number of effects the haptic device can play at the same time + * or -1 on error. + * + * SDL_HapticNumEffects + * SDL_HapticQuery + *} +function SDL_HapticNumEffectsPlaying(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticNumEffectsPlaying' {$ENDIF} {$ENDIF}; + + {** + * Gets the haptic devices supported features in bitwise matter. + * + * Example: + * + * if (SDL_HapticQueryEffects(haptic) & SDL_HAPTIC_CONSTANT) + * printf("We have constant haptic effect!"); + * + * + * + * haptic The haptic device to query. + * Haptic features in bitwise manner (OR'd). + * + * SDL_HapticNumEffects + * SDL_HapticEffectSupported + *} +function SDL_HapticQuery(haptic: PSDL_Haptic): UInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticQuery' {$ENDIF} {$ENDIF}; + + {** + * Gets the number of haptic axes the device has. + * + * SDL_HapticDirection + *} +function SDL_HapticNumAxes(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticNumAxes' {$ENDIF} {$ENDIF}; + + {** + * Checks to see if effect is supported by haptic. + * + * haptic Haptic device to check on. + * effect Effect to check to see if it is supported. + * SDL_TRUE if effect is supported, SDL_FALSE if it isn't or -1 on error. + * + * SDL_HapticQuery + * SDL_HapticNewEffect + *} +function SDL_HapticEffectSupported(haptic: PSDL_Haptic; effect: PSDL_HapticEffect): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticEffectSupported' {$ENDIF} {$ENDIF}; + + {** + * Creates a new haptic effect on the device. + * + * haptic Haptic device to create the effect on. + * effect Properties of the effect to create. + * The id of the effect on success or -1 on error. + * + * SDL_HapticUpdateEffect + * SDL_HapticRunEffect + * SDL_HapticDestroyEffect + *} +function SDL_HapticNewEffect(haptic: PSDL_Haptic; effect: PSDL_HapticEffect): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticNewEffect' {$ENDIF} {$ENDIF}; + + {** + * Updates the properties of an effect. + * + * Can be used dynamically, although behaviour when dynamically changing + * direction may be strange. Specifically the effect may reupload itself + * and start playing from the start. You cannot change the type either when + * running SDL_HapticUpdateEffect(). + * + * haptic Haptic device that has the effect. + * effect Effect to update. + * data New effect properties to use. + * The id of the effect on success or -1 on error. + * + * SDL_HapticNewEffect + * SDL_HapticRunEffect + * SDL_HapticDestroyEffect + *} +function SDL_HapticUpdateEffect(haptic: PSDL_Haptic; effect: Integer; data: PSDL_HapticEffect): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticUpdateEffect' {$ENDIF} {$ENDIF}; + + {** + * Runs the haptic effect on its associated haptic device. + * + * If iterations are ::SDL_HAPTIC_INFINITY, it'll run the effect over and over + * repeating the envelope (attack and fade) every time. If you only want the + * effect to last forever, set ::SDL_HAPTIC_INFINITY in the effect's length + * parameter. + * + * haptic Haptic device to run the effect on. + * effect Identifier of the haptic effect to run. + * iterations Number of iterations to run the effect. Use + * SDL_HAPTIC_INFINITY for infinity. + * 0 on success or -1 on error. + * + * SDL_HapticStopEffect + * SDL_HapticDestroyEffect + * SDL_HapticGetEffectStatus + *} +function SDL_HapticRunEffect(haptic: PSDL_Haptic; effect: Integer; iterations: UInt32): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticRunEffect' {$ENDIF} {$ENDIF}; + + {** + * Stops the haptic effect on its associated haptic device. + * + * haptic Haptic device to stop the effect on. + * effect Identifier of the effect to stop. + * 0 on success or -1 on error. + * + * SDL_HapticRunEffect + * SDL_HapticDestroyEffect + *} +function SDL_HapticStopEffect(haptic: PSDL_Haptic; effect: Integer): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticStopEffect' {$ENDIF} {$ENDIF}; + + {** + * Destroys a haptic effect on the device. + * + * This will stop the effect if it's running. Effects are automatically + * destroyed when the device is closed. + * + * haptic Device to destroy the effect on. + * effect Identifier of the effect to destroy. + * + * SDL_HapticNewEffect + *} +procedure SDL_HapticDestroyEffect(haptic: PSDL_Haptic; effect: Integer) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticDestroyEffect' {$ENDIF} {$ENDIF}; + + {** + * Gets the status of the current effect on the haptic device. + * + * Device must support the ::SDL_HAPTIC_STATUS feature. + * + * haptic Haptic device to query the effect status on. + * effect Identifier of the effect to query its status. + * 0 if it isn't playing, 1 if it is playing or -1 on error. + * + * SDL_HapticRunEffect + * SDL_HapticStopEffect + *} +function SDL_HapticGetEffectStatus(haptic: PSDL_Haptic; effect: Integer): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticGetEffectStatus' {$ENDIF} {$ENDIF}; + + {** + * Sets the global gain of the device. + * + * Device must support the SDL_HAPTIC_GAIN feature. + * + * The user may specify the maximum gain by setting the environment variable + * SDL_HAPTIC_GAIN_MAX which should be between 0 and 100. All calls to + * SDL_HapticSetGain() will scale linearly using SDL_HAPTIC_GAIN_MAX as the + * maximum. + * + * haptic Haptic device to set the gain on. + * gain Value to set the gain to, should be between 0 and 100. + * 0 on success or -1 on error. + * + * SDL_HapticQuery + *} +function SDL_HapticSetGain(haptic: PSDL_Haptic; gain: Integer): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticSetGain' {$ENDIF} {$ENDIF}; + + {** + * Sets the global autocenter of the device. + * + * Autocenter should be between 0 and 100. Setting it to 0 will disable + * autocentering. + * + * Device must support the ::SDL_HAPTIC_AUTOCENTER feature. + * + * haptic Haptic device to set autocentering on. + * autocenter Value to set autocenter to, 0 disables autocentering. + * 0 on success or -1 on error. + * + * SDL_HapticQuery + *} +function SDL_HapticSetAutocenter(haptic: PSDL_Haptic; autocenter: Integer): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticSetAutocenter' {$ENDIF} {$ENDIF}; + + {** + * Pauses a haptic device. + * + * Device must support the SDL_HAPTIC_PAUSE feature. Call + * SDL_HapticUnpause() to resume playback. + * + * Do not modify the effects nor add new ones while the device is paused. + * That can cause all sorts of weird errors. + * + * haptic Haptic device to pause. + * 0 on success or -1 on error. + * + * SDL_HapticUnpause + *} +function SDL_HapticPause(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticPause' {$ENDIF} {$ENDIF}; + + {** + * Unpauses a haptic device. + * + * Call to unpause after SDL_HapticPause(). + * + * haptic Haptic device to pause. + * 0 on success or -1 on error. + * + * SDL_HapticPause + *} +function SDL_HapticUnpause(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticUnPause' {$ENDIF} {$ENDIF}; + + {** + * Stops all the currently playing effects on a haptic device. + * + * haptic Haptic device to stop. + * 0 on success or -1 on error. + *} +function SDL_HapticStopAll(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticStopAll' {$ENDIF} {$ENDIF}; + + {** + * Checks to see if rumble is supported on a haptic device.. + * + * haptic Haptic device to check to see if it supports rumble. + * SDL_TRUE if effect is supported, SDL_FALSE if it isn't or -1 on error. + * + * SDL_HapticRumbleInit + * SDL_HapticRumblePlay + * SDL_HapticRumbleStop + *} +function SDL_HapticRumbleSupported(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticRumbleSupported' {$ENDIF} {$ENDIF}; + + {** + * Initializes the haptic device for simple rumble playback. + * + * haptic Haptic device to initialize for simple rumble playback. + * 0 on success or -1 on error. + * + * SDL_HapticOpen + * SDL_HapticRumbleSupported + * SDL_HapticRumblePlay + * SDL_HapticRumbleStop + *} +function SDL_HapticRumbleInit(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticRumbleInit' {$ENDIF} {$ENDIF}; + + {** + * Runs simple rumble on a haptic device + * + * haptic Haptic device to play rumble effect on. + * strength Strength of the rumble to play as a 0-1 float value. + * length Length of the rumble to play in milliseconds. + * 0 on success or -1 on error. + * + * SDL_HapticRumbleSupported + * SDL_HapticRumbleInit + * SDL_HapticRumbleStop + *} +function SDL_HapticRumblePlay(haptic: PSDL_Haptic; strength: Float; length: UInt32): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticRumblePlay' {$ENDIF} {$ENDIF}; + + {** + * Stops the simple rumble on a haptic device. + * + * haptic Haptic to stop the rumble on. + * 0 on success or -1 on error. + * + * SDL_HapticRumbleSupported + * SDL_HapticRumbleInit + * SDL_HapticRumblePlay + *} +function SDL_HapticRumbleStop(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticRumbleStop' {$ENDIF} {$ENDIF}; + diff --git a/sdlmessagebox.inc b/sdlmessagebox.inc new file mode 100644 index 0000000..2728f56 --- /dev/null +++ b/sdlmessagebox.inc @@ -0,0 +1,108 @@ +//from "sdl_messagebox.h" + + {** + * SDL_MessageBox flags. If supported will display warning icon, etc. + *} + +const + SDL_MESSAGEBOX_ERROR = $00000010; {**< error dialog *} + SDL_MESSAGEBOX_WARNING = $00000020; {**< warning dialog *} + SDL_MESSAGEBOX_INFORMATION = $00000040; {**< informational dialog *} + +type + TSDL_MessageBoxFlags = Byte; + + {** + * Flags for SDL_MessageBoxButtonData. + *} +const + SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT = $00000001; {**< Marks the default button when return is hit *} + SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT = $00000002; {**< Marks the default button when escape is hit *} +type + TSDL_MessageBoxButtonFlags = Byte; + + {** + * Individual button data. + *} +type + PSDL_MessageBoxButtonData = ^TSDL_MessageBoxButtonData; + TSDL_MessageBoxButtonData = record + flags: UInt32; {**< ::SDL_MessageBoxButtonFlags *} + buttonid: Integer; {**< User defined button id (value returned via SDL_ShowMessageBox) *} + text: PAnsiChar; {**< The UTF-8 button text *} + end; + + {** + * RGB value used in a message box color scheme + *} +type + PSDL_MessageBoxColor = ^TSDL_MessageBoxColor; + TSDL_MessageBoxColor = record + r, g, b: UInt8; + end; + + PSDL_MessageBoxColorType = ^TSDL_MessageBoxColorType; + TSDL_MessageBoxColorType = (SDL_MESSAGEBOX_COLOR_BACKGROUND, + SDL_MESSAGEBOX_COLOR_TEXT, + SDL_MESSAGEBOX_COLOR_BUTTON_BORDER, + SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND, + SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED, + SDL_MESSAGEBOX_COLOR_MAX); + + {** + * A set of colors to use for message box dialogs + *} +type + PSDL_MessageBoxColorScheme = ^TSDL_MessageBoxColorScheme; + TSDL_MessageBoxColorScheme = record + //colors: array[0..SDL_MESSAGEBOX_COLOR_MAX-1] of TSDL_MessageBoxColor; + colors: array[0..4] of TSDL_MessageBoxColor; //right?! + end; + + {** + * MessageBox structure containing title, text, window, etc. + *} +type + PSDL_MessageBoxData = ^TSDL_MessageBoxData; + TSDL_MessageBoxData = record + flags: UInt32; {**< SDL_MessageBoxFlags *} + window: PSDL_Window; {**< Parent window, can be NULL *} + title: PAnsiChar; {**< UTF-8 title *} + _message: PAnsiChar; {**< UTF-8 message text *} + + numbuttons: Integer; + buttons: PSDL_MessageBoxButtonData; + + colorScheme: PSDL_MessageBoxColorScheme; {**< SDL_MessageBoxColorScheme, can be NULL to use system settings *} + end; + + {** + * Create a modal message box. + * + * messageboxdata The SDL_MessageBoxData structure with title, text, etc. + * buttonid The pointer to which user id of hit button should be copied. + * + * -1 on error, otherwise 0 and buttonid contains user id of button + * hit or -1 if dialog was closed. + * + * This function should be called on the thread that created the parent + * window, or on the main thread if the messagebox has no parent. It will + * block execution of that thread until the user clicks a button or + * closes the messagebox. + *} +function SDL_ShowMessageBox(messageboxdata: PSDL_MessageBoxData; buttonid: PInt): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ShowMessageBox' {$ENDIF} {$ENDIF}; + + {** + * Create a simple modal message box + * + * flags SDL_MessageBoxFlags + * title UTF-8 title text + * message UTF-8 message text + * window The parent window, or NULL for no parent + * + * 0 on success, -1 on error + * + * SDL_ShowMessageBox + *} +function SDL_ShowSimpleMessageBox(flags: UInt32; title: PAnsiChar; _message: PAnsiChar; window: PSDL_Window): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ShowSimpleMessageBox' {$ENDIF} {$ENDIF}; +