]> icculus.org git repositories - taylor/freespace2.git/blob - include/sw_force.h
Initial revision
[taylor/freespace2.git] / include / sw_force.h
1 /****************************************************************************
2
3     MODULE:             SW_Force.H
4         Tab settings:   5 9
5
6         Copyright 1995, 1996, Microsoft Corporation,    All Rights Reserved.
7
8         You have a royalty-free right to use, modify, reproduce and 
9         distribute this header Files (and/or any modified version) in 
10         any way you find useful, provided that you agree that 
11         Microsoft has no warranty obligations or liability for any 
12         Application Files which are created using the header Files. 
13
14     PURPOSE:            Header for SideWinder Force Feedback Joystick
15                                 and interface to DirectInput Force Feedback API
16     
17
18         Author(s):      Name:
19         ----------      ----------------
20
21
22         Revision History:
23         -----------------
24         Version Date            Author  Comments
25         1.0     24-Mar-97       MEA     original
26         
27 ****************************************************************************/
28 #ifndef _SW_Force_SEEN
29 #define _SW_Force_SEEN
30 #include <winerror.h>
31 #include <windows.h>
32 #include <mmsystem.h>
33 #include <objbase.h>
34 #define INC_OLE2
35 #include <windows.h>
36 #include <ole2.h>
37 #include <ole2ver.h>
38 #undef INITGUIDS
39
40 #include "sw_guid.hpp"
41 #include "vdinput.h"
42 #include "sw_error.hpp"
43
44 /*
45 #include "sw_guid.h"
46 #include "vdinput.h"
47 #include "sw_error.h"
48 */
49
50
51 //
52 // --- Defines and macros for making DirectInput FF a little easier to work 
53 //     with.
54 //
55 #define SINE                    1
56 #define COSINE                  2
57 #define SQUARE_HIGH             3
58 #define SQUARE_LOW              4
59 #define TRIANGLE_UP             5
60 #define TRIANGLE_DOWN   6
61 #define SAWTOOTH_UP             7
62 #define SAWTOOTH_DOWN   8
63 #define RAMP_UP                 9
64 #define RAMP_DOWN               10
65 #define SPRING                  11
66 #define INERTIA                 12
67 #define DAMPER                  13
68 #define FRICTION                14
69 #define WALL                    15
70
71 #define HZ_TO_uS(HZ) ((int)(1000000.0/(double)(HZ) + 0.5))
72 #define uS_TO_HZ(uS) (max(1,(int)((double)(uS)/1000000.0 + 0.5)))
73
74 #ifndef X_AXIS
75 #define X_AXIS  1
76 #endif
77
78 #ifndef Y_AXIS
79 #define Y_AXIS  2
80 #endif
81
82 //---------------------------------------------------------------------------
83 // Function prototype declarations C-callable
84 //---------------------------------------------------------------------------
85 #ifdef __cplusplus
86 extern "C" {
87 #endif
88
89 HRESULT SWFF_OpenDefaultFFJoystick(
90         IN HWND hWnd,
91         OUT LPDIRECTINPUT* ppDI, 
92         OUT LPDIRECTINPUTDEVICE2* ppDIDevice2);
93
94 HRESULT SWFF_OpenDefaultFFJoystickEx(
95         IN HWND hWnd,
96         IN HINSTANCE hInstance,
97         OUT LPDIRECTINPUT* ppDI, 
98         OUT LPDIRECTINPUTDEVICE2* ppDIDevice,
99         DWORD dwFlags);
100
101 HRESULT SWFF_DestroyEffect(
102         IN LPDIRECTINPUTDEVICE2 pDIDevice,
103         IN LPDIRECTINPUTEFFECT pDIEffect);
104
105 HRESULT SWFF_DestroyAllEffects(
106         IN LPDIRECTINPUTDEVICE2 pDIDevice);
107
108 HRESULT SWFF_SetGain(
109         IN LPDIRECTINPUTEFFECT pDIEffect,
110         IN DWORD dwGain);
111
112 HRESULT SWFF_SetDirection(
113         IN LPDIRECTINPUTEFFECT pDIEffect,
114         IN DWORD dwAngle);
115
116 HRESULT SWFF_SetDuration(
117         IN LPDIRECTINPUTEFFECT pDIEffect,
118         IN DWORD dwDuration);
119
120 HRESULT SWFF_SetDirectionGain(
121         IN LPDIRECTINPUTEFFECT pDIEffect,
122         IN DWORD dwAngle,
123         IN DWORD dwMag);
124
125 HRESULT SWFF_PutRawForce(
126         IN LPDIRECTINPUTEFFECT pDIEffect,
127         IN LONG lMagnitude,
128         IN DWORD dwDirection);
129
130 HRESULT SWFF_PutRawAxisForce(
131         IN LPDIRECTINPUTEFFECT pDIEffect,
132         IN LONG lMagnitude);
133
134 HRESULT SWFF_CreateRawForceEffect(
135         IN LPDIRECTINPUTDEVICE2 pDIDevice, 
136         IN OUT LPDIRECTINPUTEFFECT * ppDIEffect,
137         IN LONG lMagnitude,
138         IN DWORD dwDirection);
139
140 HRESULT SWFF_CreateRawAxisForceEffect(
141         IN LPDIRECTINPUTDEVICE2 pDIDevice, 
142         IN OUT LPDIRECTINPUTEFFECT * ppDIEffect,
143         IN LONG lMagnitude,
144         IN DWORD dwAxis);
145
146 HRESULT SWFF_CreateROMEffect(
147         IN LPDIRECTINPUTDEVICE2 pDIDevice, 
148         IN OUT LPDIRECTINPUTEFFECT * ppDIEffect,
149         IN REFGUID refGUID,
150         IN DWORD dwDuration,            
151         IN DWORD dwGain,
152         IN DWORD dwDirection,           
153         IN LONG lButton);
154
155 HRESULT SWFF_CreatePeriodicEffect(
156         IN LPDIRECTINPUTDEVICE2 pDIDevice,
157         IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
158         IN DWORD dwType,
159         IN DWORD dwDuration,            
160         IN DWORD dwPeriod,                      
161         IN DWORD dwDirection,           
162         IN DWORD dwMagnitude,           
163         IN LONG lOffset,                        
164         IN DWORD dwAttackTime,          
165         IN DWORD dwAttackLevel,         
166         IN DWORD dwFadeTime,            
167         IN DWORD dwFadeLevel,           
168         IN LONG lButton);                       
169
170 HRESULT SWFF_CreateSpringEffect(        
171         IN LPDIRECTINPUTDEVICE2 pDIDevice,
172         IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
173         IN DWORD dwDuration,            
174         IN LONG lKx,                            
175         IN LONG lCenterX,                       
176         IN LONG lKy,                            
177         IN LONG lCenterY,                       
178         IN LONG lButton);
179         
180 HRESULT SWFF_CreateDamperEffect(
181         IN LPDIRECTINPUTDEVICE2 pDIDevice,
182         IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
183         IN DWORD dwDuration,            
184         IN LONG lBx,                            
185         IN LONG lV0x,                           
186         IN LONG lBy,                            
187         IN LONG lV0y,                           
188         IN LONG lButton);
189
190 HRESULT SWFF_CreateInertiaEffect(
191         IN LPDIRECTINPUTDEVICE2 pDIDevice,
192         IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
193         IN DWORD dwDuration,            
194         IN LONG lMx,                            
195         IN LONG lA0x,                           
196         IN LONG lMy,                            
197         IN LONG lA0y,                           
198         IN LONG lButton);
199
200 HRESULT SWFF_CreateFrictionEffect(
201         IN LPDIRECTINPUTDEVICE2 pDIDevice,
202         IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
203         IN DWORD dwDuration,            
204         IN LONG lFx,                            
205         IN LONG lFy,                            
206         IN LONG lButton);
207
208 HRESULT SWFF_CreateConditionEffect(
209         IN LPDIRECTINPUTDEVICE2 pDIDevice,
210         IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
211         IN DWORD dwType,
212         IN DWORD dwDuration,            
213         IN LONG lXCoefficient,          
214         IN LONG lXOffset,                       
215         IN LONG lYCoefficient,          
216         IN LONG lYOffset,                       
217         IN LONG lButton);                       
218
219 HRESULT SWFF_CreateRampEffect(
220         IN LPDIRECTINPUTDEVICE2 pDIDevice,
221         IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
222         IN DWORD dwDuration,            
223         IN DWORD dwDirection,           
224         IN LONG lStart,                         
225         IN LONG lEnd,                           
226         IN DWORD dwAttackTime,          
227         IN DWORD dwAttackLevel,         
228         IN DWORD dwFadeTime,            
229         IN DWORD dwFadeLevel,           
230         IN LONG lButtonMask);
231
232 HRESULT SWFF_CreateConstantForceEffect(
233         IN LPDIRECTINPUTDEVICE2 pDIDevice,
234         IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
235         IN DWORD dwDuration,            
236         IN DWORD dwDirection,           
237         IN LONG lMagnitude,                     
238         IN DWORD dwAttackTime,          
239         IN DWORD dwAttackLevel,         
240         IN DWORD dwFadeTime,            
241         IN DWORD dwFadeLevel,           
242         IN LONG lButton);
243
244 HRESULT SWFF_CreateWallEffect(
245         IN LPDIRECTINPUTDEVICE2 pDIDevice,
246         IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
247         IN DWORD dwDuration,            
248         IN DWORD dwDirection,           
249         IN DWORD dwDistance,            
250         IN BOOL bInner,                         
251         IN LONG lWallCoefficient,       
252         IN LONG lButton);                       
253
254 HRESULT SWFF_CreateVFXEffectFromFile(
255         IN LPDIRECTINPUTDEVICE2 pDIDevice, 
256         IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
257         IN const TCHAR *pszFileName);
258
259 HRESULT SWFF_CreateVFXEffectFromFileEx(
260         IN LPDIRECTINPUTDEVICE2 pDIDevice, 
261         IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
262         IN const TCHAR *pszFileName,
263         IN DWORD dwDuration,
264         IN DWORD dwGain,
265         IN DWORD dwDirection);
266
267 HRESULT SWFF_CreateVFXEffectFromBuffer(
268         IN LPDIRECTINPUTDEVICE2 pDIDevice, 
269         IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
270         IN const LPVOID pBuffer,
271         IN DWORD dwBufferSize);
272
273 HRESULT SWFF_CreateVFXEffectFromBufferEx(
274         IN LPDIRECTINPUTDEVICE2 pDIDevice, 
275         IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
276         IN const LPVOID pBuffer,
277         IN DWORD dwBufferSize,
278         IN DWORD dwDuration,
279         IN DWORD dwGain,
280         IN DWORD dwDirection);
281
282 HRESULT SWFF_CreateDIEffectFromFile(
283         IN LPDIRECTINPUTDEVICE2 pDIDevice, 
284         IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
285         IN const TCHAR *pszFileName);
286
287 HRESULT SWFF_CreateDIEffectFromFileEx(
288         IN LPDIRECTINPUTDEVICE2 pDIDevice, 
289         IN OUT LPDIRECTINPUTEFFECT** pppDIEffect,
290         IN OUT PDWORD pdwEffectCount,
291         IN const TCHAR *pszFileName,
292         IN OUT void** ppUDBuffer,
293         IN OUT PDWORD pdwOutFlags);
294
295 HRESULT SWFF_CreateDIEffectFromBuffer(
296         IN LPDIRECTINPUTDEVICE2 pDIDevice, 
297         IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
298         IN const LPVOID pBuffer,
299         IN DWORD dwBufferSize);
300
301 HRESULT SWFF_CreateDIEffectFromBufferEx(
302         IN LPDIRECTINPUTDEVICE2 pDIDevice, 
303         IN OUT LPDIRECTINPUTEFFECT** pppDIEffect,
304         IN OUT PDWORD pdwEffectCount,
305         IN const LPVOID pBuffer,
306         IN DWORD dwBufferSize,
307         IN OUT void** ppUDBuffer,
308         IN OUT PDWORD pdwOutFlags);
309
310 BOOL SWFF_RegisterVFXObject(LPCTSTR pszVFXPath);
311
312 BOOL SWFF_GetJoyData(
313         IN int nJoyID, 
314         IN OUT JOYINFOEX * pjix, 
315         OUT char *pszErr);
316 /*
317 HRESULT SWFF_GetJoyData2(
318         IN LPDIRECTINPUTDEVICE2 pDIDevice,
319         IN OUT LPDIJOYSTATE pjs);
320 */
321 void SWFF_ErrorCodeToString(
322         IN HRESULT hResult, 
323         OUT TCHAR * pszCodeString);
324
325
326 #ifdef __cplusplus
327 }
328 #endif
329
330 //
331 // --- IVFX Interface prototypes
332 //
333 #ifndef PPVOID
334 typedef LPVOID * PPVOID;
335 #endif  //PPVOID
336
337 typedef struct IVFX                     *PVFX;
338 typedef struct IVFX                             **PPVFX;
339
340 #define VFXCE_CREATE_SINGLE             0x00001
341 #define VFXCE_CREATE_MULTIPLE   0x00002
342 #define VFXCE_CALC_BUFFER_SIZE  0x00004
343 #define VFXCE_CALC_EFFECT_COUNT 0x00008
344 #define VFXCE_CONCATENATE               0x00010
345 #define VFXCE_SUPERIMPOSE               0x00020
346
347
348 #undef INTERFACE
349 #define INTERFACE IVFX
350 DECLARE_INTERFACE_(IVFX, IUnknown)
351 {
352     //IUnknown members
353         STDMETHOD(QueryInterface) (THIS_ REFIID, PPVOID) PURE;
354     STDMETHOD_(ULONG,AddRef)  (THIS) PURE;
355     STDMETHOD_(ULONG,Release) (THIS) PURE;
356
357     //IVFX Interface members
358         // General Methods
359         STDMETHOD_(HRESULT, CreateEffectFromFile) (
360                 THIS_   
361                 LPDIRECTINPUTDEVICE2,
362                 LPDIRECTINPUTEFFECT*,
363                 LPDWORD,
364                 const TCHAR*,
365                 LPVOID,
366                 LPDWORD,
367                 DWORD,
368                 LPDWORD) PURE;
369
370         STDMETHOD_(HRESULT, CreateEffectFromBuffer) (
371                 THIS_ 
372                 LPDIRECTINPUTDEVICE2,
373                 LPDIRECTINPUTEFFECT*,
374                 LPDWORD,
375                 PVOID,
376                 DWORD,
377                 LPVOID,
378                 LPDWORD,
379                 DWORD,
380                 LPDWORD) PURE;
381 };
382
383 //
384 // --- SideWinder specific 
385 //
386 #define DEFAULT_ROM_EFFECT_GAIN         100             // Set dwGain to this for Default
387                                                                                         // ROM Effect gain
388 #define DEFAULT_ROM_EFFECT_DURATION     1000    // Set dwDuration to this for Default
389                                                                                         // ROM Effect Duration
390 #define DEFAULT_ROM_EFFECT_OUTPUTRATE   1000    // Set dwSampleRate to this for 
391                                                                                                 // Default ROM Effect output rate
392
393 #define MIN_ANGLE                       0
394 #define MAX_ANGLE                       36000
395 #define MIN_FORCEOUTPUTRATE 1
396 #define MIN_GAIN                        1
397 #define MAX_GAIN                        10000
398 #define MAX_FORCE                       10000
399 #define MIN_FORCE                       -10000
400 #define MIN_TIME_PERIOD         1
401 #define MAX_TIME_PERIOD         4294967296L     // 4096 * 10^^6 usecs
402
403 #define SCALE_GAIN                      100             // DX is +/- 10000
404 #define SCALE_TIME                      1000    // DX is in microseconds
405 #define SCALE_POSITION          100             // DX is +/- 10000
406 #define SCALE_CONSTANTS         100             // DX is +/- 10000
407 #define SCALE_DIRECTION         100             // DX is 0 to 35900
408
409 // 
410 // --- Default Values
411 //
412 #define DEFAULT_OFFSET                  0
413 #define DEFAULT_ATTACK_LEVEL    0
414 #define DEFAULT_ATTACK_TIME             0
415 #define DEFAULT_SUSTAIN_LEVEL   10000
416 #define DEFAULT_FADE_LEVEL              0
417 #define DEFAULT_FADE_TIME               0
418
419
420 //
421 // The following are Type Specific parameters structures for SideWinder 
422 //
423
424 //
425 // --- WALL Effect
426 //
427 #define WALL_INNER                      0       // Wall material:from center to Wall Distance
428 #define WALL_OUTER                      1       // Wall material:greater than Wall Distance
429
430 typedef struct _BE_WALL_PARAM {
431         ULONG   m_Bytes;                        // Size of this structure
432         ULONG   m_WallType;                     // WALL_INNER or WALL_OUTER
433         LONG    m_WallConstant;         // in +/- 10000%
434         ULONG   m_WallAngle;            // 0, 9000, 18000, 27000
435         ULONG   m_WallDistance;         // Distance from Wall face normal to center. 0 to 10000
436 } BE_WALL_PARAM, *PBE_WALL_PARAM;
437
438 //
439 // ---  EF_VFX_EFFECT = { FRC file effects }
440 //
441 // Subtypes:  none
442
443 #define VFX_FILENAME    0L
444 #define VFX_BUFFER              1L
445
446 #define DEFAULT_VFX_EFFECT_GAIN                 10000   // set dwGain to this for default gain
447 #define DEFAULT_VFX_EFFECT_DIRECTION    0               // set polar direction to this for default direction
448 #define DEFAULT_VFX_EFFECT_DURATION             1000    // set dwDuration to this for default duration
449
450 typedef struct _VFX_PARAM
451 {
452         ULONG   m_Bytes;                                // Size of this structure
453         ULONG   m_PointerType;                  // VFX_FILENAME or VFX_BUFFER
454         ULONG   m_BufferSize;                   // number of bytes in buffer (if VFX_BUFFER)
455         PVOID   m_pFileNameOrBuffer;    // file name to open
456 } VFX_PARAM, *PVFX_PARAM;
457
458 typedef struct {
459         DIEFFECT DIEffectStruct;
460         DICONDITION DIConditionStruct[2];
461         LONG rglDirection[2];
462 } di_condition_effect_struct;
463
464 HRESULT SWFF_CreateConditionEffectStruct(
465         di_condition_effect_struct *ptr,
466         IN LPDIRECTINPUTDEVICE2 pDIDevice,
467         IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
468         IN DWORD dwType,
469         IN DWORD dwDuration,
470         IN LONG lXCoefficient,
471         IN LONG lXOffset,
472         IN LONG lYCoefficient,
473         IN LONG lYOffset,
474         IN LONG lButton);
475
476 #endif // of ifdef _SW_Force_SEEN
477