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