344 lines
8.5 KiB
C++
344 lines
8.5 KiB
C++
/**********************************************************************
|
|
Copyright (c) 1997 Immersion Corporation
|
|
|
|
Permission to use, copy, modify, distribute, and sell this
|
|
software and its documentation may be granted without fee;
|
|
interested parties are encouraged to request permission from
|
|
Immersion Corporation
|
|
2158 Paragon Drive
|
|
San Jose, CA 95131
|
|
408-467-1900
|
|
|
|
IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
|
|
IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
|
NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
FILE: FeelEffect.h
|
|
|
|
PURPOSE: Base Effect Class for Feelit API Foundation Classes
|
|
|
|
STARTED: 10/10/97
|
|
|
|
NOTES/REVISIONS:
|
|
3/2/99 jrm (Jeff Mallett): Force-->Feel renaming
|
|
3/2/99 jrm: Added GetIsCompatibleGUID and feel_to_DI_GUID
|
|
3/15/99 jrm: __declspec(dllimport/dllexport) the whole class
|
|
|
|
**********************************************************************/
|
|
|
|
|
|
#if !defined(AFX_FEELEFFECT_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_)
|
|
#define AFX_FEELEFFECT_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_
|
|
|
|
#if _MSC_VER >= 1000
|
|
#pragma once
|
|
#endif // _MSC_VER >= 1000
|
|
|
|
#ifndef _FFCDLL_
|
|
#define DLLFFC __declspec(dllimport)
|
|
#else
|
|
#define DLLFFC __declspec(dllexport)
|
|
#endif
|
|
|
|
#include "FeelBaseTypes.h"
|
|
#include "FeelDevice.h"
|
|
class CFeelProject;
|
|
|
|
|
|
//================================================================
|
|
// Constants
|
|
//================================================================
|
|
|
|
#define FEEL_EFFECT_AXIS_X 1
|
|
#define FEEL_EFFECT_AXIS_Y 2
|
|
#define FEEL_EFFECT_AXIS_BOTH 3
|
|
#define FEEL_EFFECT_AXIS_DIRECTIONAL 4
|
|
#define FEEL_EFFECT_DONT_CHANGE MINLONG
|
|
#define FEEL_EFFECT_DONT_CHANGE_PTR MAXDWORD
|
|
const POINT FEEL_EFFECT_DONT_CHANGE_POINT = { 0xFFFFFFFF, 0xFFFFFFFF };
|
|
const POINT FEEL_EFFECT_MOUSE_POS_AT_START = { MAXLONG, MAXLONG };
|
|
|
|
#define FEEL_EFFECT_DEFAULT_ENVELOPE NULL
|
|
#define FEEL_EFFECT_DEFAULT_DIRECTION_X 1
|
|
#define FEEL_EFFECT_DEFAULT_DIRECTION_Y 1
|
|
#define FEEL_EFFECT_DEFAULT_ANGLE 0
|
|
|
|
//
|
|
// FORCE --> FEEL Wrappers
|
|
//
|
|
#define FORCE_EFFECT_AXIS_X FEEL_EFFECT_AXIS_X
|
|
#define FORCE_EFFECT_AXIS_Y FEEL_EFFECT_AXIS_Y
|
|
#define FORCE_EFFECT_AXIS_BOTH FEEL_EFFECT_AXIS_BOTH
|
|
#define FORCE_EFFECT_AXIS_DIRECTIONAL FEEL_EFFECT_AXIS_DIRECTIONAL
|
|
#define FORCE_EFFECT_DONT_CHANGE FEEL_EFFECT_DONT_CHANGE
|
|
#define FORCE_EFFECT_DONT_CHANGE_PTR FEEL_EFFECT_DONT_CHANGE_PTR
|
|
#define FORCE_EFFECT_DONT_CHANGE_POINT FEEL_EFFECT_DONT_CHANGE_POINT
|
|
#define FORCE_EFFECT_MOUSE_POS_AT_START FEEL_EFFECT_MOUSE_POS_AT_START
|
|
|
|
#define FORCE_EFFECT_DEFAULT_ENVELOPE FEEL_EFFECT_DEFAULT_ENVELOPE
|
|
#define FORCE_EFFECT_DEFAULT_DIRECTION_X FEEL_EFFECT_DEFAULT_DIRECTION_X
|
|
#define FORCE_EFFECT_DEFAULT_DIRECTION_Y FEEL_EFFECT_DEFAULT_DIRECTION_Y
|
|
#define FORCE_EFFECT_DEFAULT_ANGLE FEEL_EFFECT_DEFAULT_ANGLE
|
|
|
|
|
|
|
|
// GENERIC_EFFECT_PTR
|
|
// This is really a pointer to a child of CFeelEffect.
|
|
typedef class CFeelEffect * GENERIC_EFFECT_PTR;
|
|
|
|
|
|
//================================================================
|
|
// CFeelEffect
|
|
//================================================================
|
|
|
|
//
|
|
// ------ PUBLIC INTERFACE ------
|
|
//
|
|
|
|
class DLLFFC CFeelEffect
|
|
{
|
|
//
|
|
// CONSTRUCTOR/DESTRUCTOR
|
|
//
|
|
|
|
public:
|
|
|
|
// Constructor
|
|
CFeelEffect(
|
|
const GUID& rguidEffect
|
|
);
|
|
|
|
// Destructor
|
|
virtual
|
|
~CFeelEffect();
|
|
|
|
//
|
|
// ATTRIBUTES
|
|
//
|
|
|
|
public:
|
|
|
|
LPIFEEL_EFFECT
|
|
GetEffect()
|
|
{ return m_piFeelitEffect; }
|
|
|
|
BOOL
|
|
GetStatus(
|
|
DWORD* pdwStatus
|
|
)
|
|
#if (FFC_VERSION >= 0x0110) || defined(FFC_EFFECT_CACHING)
|
|
const
|
|
#endif
|
|
;
|
|
|
|
GUID
|
|
GetGUID()
|
|
{ return m_guidEffect; }
|
|
|
|
virtual BOOL
|
|
GetIsCompatibleGUID(
|
|
GUID & /* guid */
|
|
)
|
|
{ return true; }
|
|
|
|
// Allocates an object of the correct FFC class from the given GUID
|
|
static GENERIC_EFFECT_PTR
|
|
NewObjectFromGUID(
|
|
GUID &guid
|
|
);
|
|
|
|
BOOL
|
|
ChangeBaseParams(
|
|
LONG lDirectionX,
|
|
LONG lDirectionY,
|
|
DWORD dwDuration = FEEL_EFFECT_DONT_CHANGE,
|
|
LPFEEL_ENVELOPE pEnvelope = (LPFEEL_ENVELOPE) FEEL_EFFECT_DONT_CHANGE_PTR,
|
|
DWORD dwSamplePeriod = FEEL_EFFECT_DONT_CHANGE,
|
|
DWORD dwGain = FEEL_EFFECT_DONT_CHANGE,
|
|
DWORD dwTriggerButton = FEEL_EFFECT_DONT_CHANGE,
|
|
DWORD dwTriggerRepeatInterval = FEEL_EFFECT_DONT_CHANGE
|
|
#ifdef FFC_START_DELAY
|
|
,DWORD dwStartDelay = FEEL_EFFECT_DONT_CHANGE
|
|
#endif
|
|
);
|
|
|
|
BOOL
|
|
ChangeBaseParamsPolar(
|
|
LONG lAngle,
|
|
DWORD dwDuration = FEEL_EFFECT_DONT_CHANGE,
|
|
LPFEEL_ENVELOPE pEnvelope = (LPFEEL_ENVELOPE) FEEL_EFFECT_DONT_CHANGE_PTR,
|
|
DWORD dwSamplePeriod = FEEL_EFFECT_DONT_CHANGE,
|
|
DWORD dwGain = FEEL_EFFECT_DONT_CHANGE,
|
|
DWORD dwTriggerButton = FEEL_EFFECT_DONT_CHANGE,
|
|
DWORD dwTriggerRepeatInterval = FEEL_EFFECT_DONT_CHANGE
|
|
#ifdef FFC_START_DELAY
|
|
,DWORD dwStartDelay = FEEL_EFFECT_DONT_CHANGE
|
|
#endif
|
|
);
|
|
|
|
BOOL
|
|
ChangeDirection(
|
|
LONG lDirectionX,
|
|
LONG lDirectionY
|
|
);
|
|
|
|
BOOL
|
|
ChangeDirection(
|
|
LONG lAngle
|
|
);
|
|
|
|
|
|
BOOL
|
|
SetEnvelope(
|
|
DWORD dwAttackLevel,
|
|
DWORD dwAttackTime,
|
|
DWORD dwFadeLevel,
|
|
DWORD dwFadeTime
|
|
);
|
|
|
|
BOOL
|
|
SetEnvelope(
|
|
LPFEEL_ENVELOPE pEnvelope
|
|
);
|
|
|
|
|
|
//
|
|
// OPERATIONS
|
|
//
|
|
|
|
public:
|
|
|
|
virtual BOOL
|
|
Initialize(
|
|
CFeelDevice* pDevice,
|
|
const FEEL_EFFECT &effect
|
|
);
|
|
|
|
virtual BOOL
|
|
InitializeFromProject(
|
|
CFeelProject &project,
|
|
LPCSTR lpszEffectName,
|
|
CFeelDevice* pDevice = NULL
|
|
);
|
|
|
|
virtual BOOL
|
|
Start(
|
|
DWORD dwIterations = 1,
|
|
DWORD dwFlags = 0
|
|
);
|
|
|
|
#ifdef FFC_START_DELAY
|
|
virtual BOOL
|
|
StartNow(
|
|
DWORD dwIterations = 1,
|
|
DWORD dwFlags = 0
|
|
);
|
|
#endif
|
|
|
|
virtual BOOL
|
|
Stop();
|
|
|
|
|
|
//
|
|
// ------ PRIVATE INTERFACE ------
|
|
//
|
|
|
|
//
|
|
// CACHING
|
|
//
|
|
|
|
#ifdef FFC_EFFECT_CACHING
|
|
|
|
public:
|
|
|
|
BOOL GetIsPlaying() const;
|
|
BOOL GetIsTriggered() const;
|
|
short GetPriority() const { return m_Priority; }
|
|
void SetPriority(short priority) { m_Priority = priority; }
|
|
HRESULT Unload();
|
|
void Reload();
|
|
|
|
public:
|
|
|
|
ECacheState m_CacheState; // effect's status in the cache
|
|
BOOL m_bInCurrentSuite; // is the effect in the currently loaded suite?
|
|
short m_Priority; // Priority within suite: higher number is higher priority
|
|
DWORD m_dwLastStarted; // when last started (0 = never) or when param change made on device
|
|
DWORD m_dwLastStopped; // when last stopped (0 = not since last start)
|
|
DWORD m_dwLastLoaded; // when last loaded with CFeelEffectSuite::Load or Create
|
|
|
|
protected:
|
|
|
|
CFeelDevice *m_pFeelDevice; // ### Use instead of m_piFeelitDevice
|
|
#endif
|
|
|
|
//
|
|
// HELPERS
|
|
//
|
|
protected:
|
|
|
|
#ifdef FFC_EFFECT_CACHING
|
|
public: // initalize needs to be called by CFeelDevice
|
|
#endif
|
|
BOOL
|
|
initialize(
|
|
CFeelDevice* pDevice
|
|
);
|
|
#ifdef FFC_EFFECT_CACHING
|
|
protected:
|
|
#endif
|
|
|
|
HRESULT
|
|
set_parameters_on_device(
|
|
DWORD dwFlags
|
|
);
|
|
|
|
void
|
|
feel_to_DI_GUID(
|
|
GUID &guid
|
|
);
|
|
|
|
void
|
|
reset();
|
|
|
|
void
|
|
reset_effect_struct();
|
|
|
|
|
|
//
|
|
// INTERNAL DATA
|
|
//
|
|
|
|
protected:
|
|
|
|
FEEL_EFFECT m_Effect;
|
|
DWORD m_dwaAxes[2];
|
|
LONG m_laDirections[2];
|
|
|
|
GUID m_guidEffect;
|
|
BOOL m_bIsPlaying;
|
|
DWORD m_dwDeviceType;
|
|
LPIFEEL_DEVICE m_piFeelitDevice; // Might also be holding LPDIRECTINPUTDEVICE2
|
|
LPIFEEL_EFFECT m_piFeelitEffect;
|
|
DWORD m_cAxes; // Number of axes
|
|
|
|
#ifdef FFC_START_DELAY
|
|
public:
|
|
// Prevents access to dangling pointer when this is deleted
|
|
// All relevent code may be removed when all hardware and drivers support start delay
|
|
CFeelEffect **m_ppTimerRef; // pointer to pointer to this.
|
|
#endif
|
|
};
|
|
|
|
|
|
#if (DIRECTINPUT_VERSION >= 0x0700)
|
|
#define DIRECT_INPUT_STARTDELAY_SUPPORTED TRUE
|
|
#else
|
|
#define DIRECT_INPUT_STARTDELAY_SUPPORTED FALSE
|
|
#endif /* DIRECTINPUT_VERSION >= 0x0700 */
|
|
|
|
#endif // !defined(AFX_FEELEFFECT_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_)
|