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