1 module allegro5.haptic;
2 
3 import allegro5.display;
4 import allegro5.mouse;
5 import allegro5.joystick;
6 import allegro5.keyboard;
7 import allegro5.touch_input;
8 
9 version (ALLEGRO_UNSTABLE)
10 	version = AllegroHapticUnstable;
11 version (ALLEGRO_INTERNAL_UNSTABLE)
12 	version = AllegroHapticUnstable;
13 version (ALLEGRO_SRC)
14 	version = AllegroHapticUnstable;
15 
16 version (AllegroHapticUnstable):
17 enum ALLEGRO_HAPTIC_CONSTANTS
18 {
19 	ALLEGRO_HAPTIC_RUMBLE = 1 << 0,
20 	ALLEGRO_HAPTIC_PERIODIC = 1 << 1,
21 	ALLEGRO_HAPTIC_CONSTANT = 1 << 2,
22 	ALLEGRO_HAPTIC_SPRING = 1 << 3,
23 	ALLEGRO_HAPTIC_FRICTION = 1 << 4,
24 	ALLEGRO_HAPTIC_DAMPER = 1 << 5,
25 	ALLEGRO_HAPTIC_INERTIA = 1 << 6,
26 	ALLEGRO_HAPTIC_RAMP = 1 << 7,
27 	ALLEGRO_HAPTIC_SQUARE = 1 << 8,
28 	ALLEGRO_HAPTIC_TRIANGLE = 1 << 9,
29 	ALLEGRO_HAPTIC_SINE = 1 << 10,
30 	ALLEGRO_HAPTIC_SAW_UP = 1 << 11,
31 	ALLEGRO_HAPTIC_SAW_DOWN = 1 << 12,
32 	ALLEGRO_HAPTIC_CUSTOM = 1 << 13,
33 	ALLEGRO_HAPTIC_GAIN = 1 << 14,
34 	ALLEGRO_HAPTIC_ANGLE = 1 << 15,
35 	ALLEGRO_HAPTIC_RADIUS = 1 << 16,
36 	ALLEGRO_HAPTIC_AZIMUTH = 1 << 17,
37 	ALLEGRO_HAPTIC_AUTOCENTER = 1 << 18,
38 }
39 
40 struct ALLEGRO_HAPTIC {}
41 
42 struct ALLEGRO_HAPTIC_DIRECTION
43 {
44 	double angle;
45 	double radius;
46 	double azimuth;
47 }
48 
49 struct ALLEGRO_HAPTIC_REPLAY
50 {
51 	double length;
52 	double delay;
53 }
54 
55 struct ALLEGRO_HAPTIC_ENVELOPE
56 {
57 	double attack_length;
58 	double attack_level;
59 	double fade_length;
60 	double fade_level;
61 }
62 
63 struct ALLEGRO_HAPTIC_CONSTANT_EFFECT
64 {
65 	double level;
66 	ALLEGRO_HAPTIC_ENVELOPE envelope;
67 }
68 
69 struct ALLEGRO_HAPTIC_RAMP_EFFECT
70 {
71 	double start_level;
72 	double end_level;
73 	ALLEGRO_HAPTIC_ENVELOPE envelope;
74 }
75 
76 struct ALLEGRO_HAPTIC_CONDITION_EFFECT
77 {
78 	double right_saturation;
79 	double left_saturation;
80 	double right_coeff;
81 	double left_coeff;
82 	double deadband;
83 	double center;
84 }
85 
86 struct ALLEGRO_HAPTIC_PERIODIC_EFFECT
87 {
88 	int waveform;
89 	double period;
90 	double magnitude;
91 	double offset;
92 	double phase;
93 
94 	ALLEGRO_HAPTIC_ENVELOPE envelope;
95 	int custom_len;
96 	double *custom_data;
97 }
98 
99 struct ALLEGRO_HAPTIC_RUMBLE_EFFECT
100 {
101 	double strong_magnitude;
102 	double weak_magnitude;
103 }
104 
105 union ALLEGRO_HAPTIC_EFFECT_UNION
106 {
107 	ALLEGRO_HAPTIC_CONSTANT_EFFECT constant;
108 	ALLEGRO_HAPTIC_RAMP_EFFECT ramp;
109 	ALLEGRO_HAPTIC_PERIODIC_EFFECT periodic;
110 	ALLEGRO_HAPTIC_CONDITION_EFFECT condition;
111 	ALLEGRO_HAPTIC_RUMBLE_EFFECT rumble;
112 }
113 
114 struct ALLEGRO_HAPTIC_EFFECT
115 {
116 	int type;
117 	ALLEGRO_HAPTIC_DIRECTION direction;
118 	ALLEGRO_HAPTIC_REPLAY replay;
119 	ALLEGRO_HAPTIC_EFFECT_UNION data;
120 }
121 
122 struct ALLEGRO_HAPTIC_EFFECT_ID
123 {
124 	ALLEGRO_HAPTIC* _haptic;
125 	int _id;
126 	int _handle;
127 	void* _pointer;
128 	double _effect_duration;
129 	bool _playing;
130 	double _start_time;
131 	double _end_time;
132 	void* driver;
133 }
134 
135 nothrow @nogc extern(C)
136 {
137    bool al_install_haptic();
138    void al_uninstall_haptic();
139    bool al_is_haptic_installed();
140 
141    bool al_is_mouse_haptic(ALLEGRO_MOUSE*);
142    bool al_is_joystick_haptic(ALLEGRO_JOYSTICK*);
143    bool al_is_keyboard_haptic(ALLEGRO_KEYBOARD*);
144    bool al_is_display_haptic(ALLEGRO_DISPLAY*);
145    bool al_is_touch_input_haptic(ALLEGRO_TOUCH_INPUT*);
146 
147    ALLEGRO_HAPTIC*  al_get_haptic_from_mouse(ALLEGRO_MOUSE*);
148    ALLEGRO_HAPTIC*  al_get_haptic_from_joystick(ALLEGRO_JOYSTICK*);
149    ALLEGRO_HAPTIC*  al_get_haptic_from_keyboard(ALLEGRO_KEYBOARD*);
150    ALLEGRO_HAPTIC*  al_get_haptic_from_display(ALLEGRO_DISPLAY*);
151    ALLEGRO_HAPTIC*  al_get_haptic_from_touch_input(ALLEGRO_TOUCH_INPUT*);
152 
153    bool al_release_haptic(ALLEGRO_HAPTIC*);
154 
155    bool al_is_haptic_active(ALLEGRO_HAPTIC*);
156    int al_get_haptic_capabilities(ALLEGRO_HAPTIC*);
157    bool al_is_haptic_capable(ALLEGRO_HAPTIC*, int);
158 
159    bool al_set_haptic_gain(ALLEGRO_HAPTIC*, double gain);
160    double al_get_haptic_gain(ALLEGRO_HAPTIC*);
161 
162    int al_get_max_haptic_effects(ALLEGRO_HAPTIC*);
163    bool al_is_haptic_effect_ok(ALLEGRO_HAPTIC*, ALLEGRO_HAPTIC_EFFECT*);
164    bool al_upload_haptic_effect(ALLEGRO_HAPTIC*, ALLEGRO_HAPTIC_EFFECT*, ALLEGRO_HAPTIC_EFFECT_ID* play_id);
165    bool al_play_haptic_effect(ALLEGRO_HAPTIC_EFFECT_ID*, int loop);
166    bool al_upload_and_play_haptic_effect(ALLEGRO_HAPTIC*, ALLEGRO_HAPTIC_EFFECT*, int loop, ALLEGRO_HAPTIC_EFFECT_ID* play_id);
167    bool al_stop_haptic_effect(ALLEGRO_HAPTIC_EFFECT_ID*);
168    bool al_is_haptic_effect_playing(ALLEGRO_HAPTIC_EFFECT_ID*);
169    bool al_release_haptic_effect(ALLEGRO_HAPTIC_EFFECT_ID*);
170    double al_get_haptic_effect_duration(ALLEGRO_HAPTIC_EFFECT *);
171    bool al_rumble_haptic(ALLEGRO_HAPTIC*, double intensity, double duration, ALLEGRO_HAPTIC_EFFECT_ID*);
172 }