1 /****************************************************************************
6 Copyright 1995, 1996, Microsoft Corporation, All Rights Reserved.
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.
14 PURPOSE: Header for SideWinder Force Feedback Joystick
15 and interface to DirectInput Force Feedback API
19 ---------- ----------------
24 Version Date Author Comments
25 1.0 24-Mar-97 MEA original
27 ****************************************************************************/
28 #ifndef _SW_Force_SEEN
29 #define _SW_Force_SEEN
40 #include "sw_guid.hpp"
42 #include "sw_error.hpp"
52 // --- Defines and macros for making DirectInput FF a little easier to work
60 #define TRIANGLE_DOWN 6
62 #define SAWTOOTH_DOWN 8
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)))
82 //---------------------------------------------------------------------------
83 // Function prototype declarations C-callable
84 //---------------------------------------------------------------------------
89 HRESULT SWFF_OpenDefaultFFJoystick(
91 OUT LPDIRECTINPUT* ppDI,
92 OUT LPDIRECTINPUTDEVICE2* ppDIDevice2);
94 HRESULT SWFF_OpenDefaultFFJoystickEx(
96 IN HINSTANCE hInstance,
97 OUT LPDIRECTINPUT* ppDI,
98 OUT LPDIRECTINPUTDEVICE2* ppDIDevice,
101 HRESULT SWFF_DestroyEffect(
102 IN LPDIRECTINPUTDEVICE2 pDIDevice,
103 IN LPDIRECTINPUTEFFECT pDIEffect);
105 HRESULT SWFF_DestroyAllEffects(
106 IN LPDIRECTINPUTDEVICE2 pDIDevice);
108 HRESULT SWFF_SetGain(
109 IN LPDIRECTINPUTEFFECT pDIEffect,
112 HRESULT SWFF_SetDirection(
113 IN LPDIRECTINPUTEFFECT pDIEffect,
116 HRESULT SWFF_SetDuration(
117 IN LPDIRECTINPUTEFFECT pDIEffect,
118 IN DWORD dwDuration);
120 HRESULT SWFF_SetDirectionGain(
121 IN LPDIRECTINPUTEFFECT pDIEffect,
125 HRESULT SWFF_PutRawForce(
126 IN LPDIRECTINPUTEFFECT pDIEffect,
128 IN DWORD dwDirection);
130 HRESULT SWFF_PutRawAxisForce(
131 IN LPDIRECTINPUTEFFECT pDIEffect,
134 HRESULT SWFF_CreateRawForceEffect(
135 IN LPDIRECTINPUTDEVICE2 pDIDevice,
136 IN OUT LPDIRECTINPUTEFFECT * ppDIEffect,
138 IN DWORD dwDirection);
140 HRESULT SWFF_CreateRawAxisForceEffect(
141 IN LPDIRECTINPUTDEVICE2 pDIDevice,
142 IN OUT LPDIRECTINPUTEFFECT * ppDIEffect,
146 HRESULT SWFF_CreateROMEffect(
147 IN LPDIRECTINPUTDEVICE2 pDIDevice,
148 IN OUT LPDIRECTINPUTEFFECT * ppDIEffect,
152 IN DWORD dwDirection,
155 HRESULT SWFF_CreatePeriodicEffect(
156 IN LPDIRECTINPUTDEVICE2 pDIDevice,
157 IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
161 IN DWORD dwDirection,
162 IN DWORD dwMagnitude,
164 IN DWORD dwAttackTime,
165 IN DWORD dwAttackLevel,
167 IN DWORD dwFadeLevel,
170 HRESULT SWFF_CreateSpringEffect(
171 IN LPDIRECTINPUTDEVICE2 pDIDevice,
172 IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
180 HRESULT SWFF_CreateDamperEffect(
181 IN LPDIRECTINPUTDEVICE2 pDIDevice,
182 IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
190 HRESULT SWFF_CreateInertiaEffect(
191 IN LPDIRECTINPUTDEVICE2 pDIDevice,
192 IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
200 HRESULT SWFF_CreateFrictionEffect(
201 IN LPDIRECTINPUTDEVICE2 pDIDevice,
202 IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
208 HRESULT SWFF_CreateConditionEffect(
209 IN LPDIRECTINPUTDEVICE2 pDIDevice,
210 IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
213 IN LONG lXCoefficient,
215 IN LONG lYCoefficient,
219 HRESULT SWFF_CreateRampEffect(
220 IN LPDIRECTINPUTDEVICE2 pDIDevice,
221 IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
223 IN DWORD dwDirection,
226 IN DWORD dwAttackTime,
227 IN DWORD dwAttackLevel,
229 IN DWORD dwFadeLevel,
230 IN LONG lButtonMask);
232 HRESULT SWFF_CreateConstantForceEffect(
233 IN LPDIRECTINPUTDEVICE2 pDIDevice,
234 IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
236 IN DWORD dwDirection,
238 IN DWORD dwAttackTime,
239 IN DWORD dwAttackLevel,
241 IN DWORD dwFadeLevel,
244 HRESULT SWFF_CreateWallEffect(
245 IN LPDIRECTINPUTDEVICE2 pDIDevice,
246 IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
248 IN DWORD dwDirection,
251 IN LONG lWallCoefficient,
254 HRESULT SWFF_CreateVFXEffectFromFile(
255 IN LPDIRECTINPUTDEVICE2 pDIDevice,
256 IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
257 IN const TCHAR *pszFileName);
259 HRESULT SWFF_CreateVFXEffectFromFileEx(
260 IN LPDIRECTINPUTDEVICE2 pDIDevice,
261 IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
262 IN const TCHAR *pszFileName,
265 IN DWORD dwDirection);
267 HRESULT SWFF_CreateVFXEffectFromBuffer(
268 IN LPDIRECTINPUTDEVICE2 pDIDevice,
269 IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
270 IN const LPVOID pBuffer,
271 IN DWORD dwBufferSize);
273 HRESULT SWFF_CreateVFXEffectFromBufferEx(
274 IN LPDIRECTINPUTDEVICE2 pDIDevice,
275 IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
276 IN const LPVOID pBuffer,
277 IN DWORD dwBufferSize,
280 IN DWORD dwDirection);
282 HRESULT SWFF_CreateDIEffectFromFile(
283 IN LPDIRECTINPUTDEVICE2 pDIDevice,
284 IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
285 IN const TCHAR *pszFileName);
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);
295 HRESULT SWFF_CreateDIEffectFromBuffer(
296 IN LPDIRECTINPUTDEVICE2 pDIDevice,
297 IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
298 IN const LPVOID pBuffer,
299 IN DWORD dwBufferSize);
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);
310 BOOL SWFF_RegisterVFXObject(LPCTSTR pszVFXPath);
312 BOOL SWFF_GetJoyData(
314 IN OUT JOYINFOEX * pjix,
317 HRESULT SWFF_GetJoyData2(
318 IN LPDIRECTINPUTDEVICE2 pDIDevice,
319 IN OUT LPDIJOYSTATE pjs);
321 void SWFF_ErrorCodeToString(
323 OUT TCHAR * pszCodeString);
331 // --- IVFX Interface prototypes
334 typedef LPVOID * PPVOID;
337 typedef struct IVFX *PVFX;
338 typedef struct IVFX **PPVFX;
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
349 #define INTERFACE IVFX
350 DECLARE_INTERFACE_(IVFX, IUnknown)
353 STDMETHOD(QueryInterface) (THIS_ REFIID, PPVOID) PURE;
354 STDMETHOD_(ULONG,AddRef) (THIS) PURE;
355 STDMETHOD_(ULONG,Release) (THIS) PURE;
357 //IVFX Interface members
359 STDMETHOD_(HRESULT, CreateEffectFromFile) (
361 LPDIRECTINPUTDEVICE2,
362 LPDIRECTINPUTEFFECT*,
370 STDMETHOD_(HRESULT, CreateEffectFromBuffer) (
372 LPDIRECTINPUTDEVICE2,
373 LPDIRECTINPUTEFFECT*,
384 // --- SideWinder specific
386 #define DEFAULT_ROM_EFFECT_GAIN 100 // Set dwGain to this for Default
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
394 #define MAX_ANGLE 36000
395 #define MIN_FORCEOUTPUTRATE 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
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
410 // --- Default Values
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
421 // The following are Type Specific parameters structures for SideWinder
427 #define WALL_INNER 0 // Wall material:from center to Wall Distance
428 #define WALL_OUTER 1 // Wall material:greater than Wall Distance
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;
439 // --- EF_VFX_EFFECT = { FRC file effects }
443 #define VFX_FILENAME 0L
444 #define VFX_BUFFER 1L
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
450 typedef struct _VFX_PARAM
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;
459 DIEFFECT DIEffectStruct;
460 DICONDITION DIConditionStruct[2];
461 LONG rglDirection[2];
462 } di_condition_effect_struct;
464 HRESULT SWFF_CreateConditionEffectStruct(
465 di_condition_effect_struct *ptr,
466 IN LPDIRECTINPUTDEVICE2 pDIDevice,
467 IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
470 IN LONG lXCoefficient,
472 IN LONG lYCoefficient,
476 #endif // of ifdef _SW_Force_SEEN