169 lines
4.3 KiB
C++
169 lines
4.3 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1999 - 1999
|
||
|
//
|
||
|
// File: dinputeffectobj.cpp
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "Direct.h"
|
||
|
#include "dms.h"
|
||
|
#include "dInputEffectObj.h"
|
||
|
|
||
|
extern HRESULT FixUpCoverEffect(GUID g, DIEFFECT_CDESC *cover,DIEFFECT *realEffect);
|
||
|
extern HRESULT FixUpRealEffect(GUID g,DIEFFECT *realEffect,DIEFFECT_CDESC *cover);
|
||
|
extern BSTR DINPUTGUIDtoBSTR(LPGUID g);
|
||
|
|
||
|
CONSTRUCTOR(_dxj_DirectInputEffect, {});
|
||
|
DESTRUCTOR(_dxj_DirectInputEffect, {});
|
||
|
GETSET_OBJECT(_dxj_DirectInputEffect);
|
||
|
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectInputEffectObject::download()
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_DirectInputEffect->Download();
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectInputEffectObject::getEffectGuid(BSTR *guid)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
GUID g;
|
||
|
if (!guid) return E_INVALIDARG;
|
||
|
hr=m__dxj_DirectInputEffect->GetEffectGuid(&g);
|
||
|
*guid=DINPUTGUIDtoBSTR(&g);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectInputEffectObject::getEffectStatus(long *ret)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
if (!ret) return E_INVALIDARG;
|
||
|
hr=m__dxj_DirectInputEffect->GetEffectStatus((DWORD*)ret);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectInputEffectObject::start(
|
||
|
/* [in] */ long iterations,
|
||
|
/* [in] */ long flags)
|
||
|
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_DirectInputEffect->Start((DWORD)iterations,(DWORD)flags);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectInputEffectObject::stop()
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_DirectInputEffect->Stop();
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectInputEffectObject::unload()
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_DirectInputEffect->Unload();
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectInputEffectObject::setParameters(
|
||
|
/* [in] */ DIEFFECT_CDESC __RPC_FAR *effectInfo, long flags)
|
||
|
{
|
||
|
DIEFFECT realEffect;
|
||
|
HRESULT hr;
|
||
|
GUID g;
|
||
|
m__dxj_DirectInputEffect->GetEffectGuid(&g);
|
||
|
|
||
|
hr=FixUpRealEffect(g,&realEffect,effectInfo);
|
||
|
if FAILED(hr) return hr;
|
||
|
|
||
|
hr=m__dxj_DirectInputEffect->SetParameters(&realEffect,(DWORD) flags);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
#define DICONDITION_USE_BOTH_AXIS 1
|
||
|
#define DICONDITION_USE_DIRECTION 2
|
||
|
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectInputEffectObject::getParameters(
|
||
|
/* [in] */ DIEFFECT_CDESC __RPC_FAR *effectInfo)
|
||
|
{
|
||
|
|
||
|
HRESULT hr;
|
||
|
GUID g;
|
||
|
DIEFFECT *pRealEffect=(DIEFFECT*)effectInfo;
|
||
|
DWORD dwFlags= DIEP_ALLPARAMS;
|
||
|
|
||
|
|
||
|
if (!effectInfo) return E_INVALIDARG;
|
||
|
|
||
|
|
||
|
|
||
|
ZeroMemory(pRealEffect,sizeof(DIEFFECT_CDESC));
|
||
|
if (!pRealEffect->dwFlags) pRealEffect->dwFlags = DIEFF_OBJECTOFFSETS | DIEFF_POLAR;
|
||
|
pRealEffect->dwSize =sizeof(DIEFFECT);
|
||
|
pRealEffect->lpEnvelope =(DIENVELOPE*)&(effectInfo->envelope);
|
||
|
pRealEffect->lpEnvelope->dwSize=sizeof(DIENVELOPE);
|
||
|
pRealEffect->cAxes = 2;
|
||
|
pRealEffect->rglDirection =(long*)&(effectInfo->x);
|
||
|
|
||
|
hr=m__dxj_DirectInputEffect->GetEffectGuid(&g);
|
||
|
if FAILED(hr) return hr;
|
||
|
|
||
|
if (g==GUID_ConstantForce)
|
||
|
{
|
||
|
pRealEffect->lpvTypeSpecificParams =&(effectInfo->constantForce);
|
||
|
pRealEffect->cbTypeSpecificParams =sizeof(DICONSTANTFORCE);
|
||
|
}
|
||
|
else if ((g==GUID_Square)||(g==GUID_Triangle)||(g==GUID_SawtoothUp)||(g==GUID_SawtoothDown)||(g==GUID_Sine))
|
||
|
{
|
||
|
pRealEffect->lpvTypeSpecificParams =&(effectInfo->periodicForce);
|
||
|
pRealEffect->cbTypeSpecificParams =sizeof(DIPERIODIC);
|
||
|
}
|
||
|
else if ((g==GUID_Spring)|| (g==GUID_Damper)|| (g==GUID_Inertia)|| (g==GUID_Friction)){
|
||
|
pRealEffect->cbTypeSpecificParams =sizeof(DICONDITION)*2;
|
||
|
pRealEffect->lpvTypeSpecificParams =&(effectInfo->conditionX);
|
||
|
}
|
||
|
else if (g==GUID_RampForce){
|
||
|
pRealEffect->lpvTypeSpecificParams =&(effectInfo->rampForce);
|
||
|
pRealEffect->cbTypeSpecificParams =sizeof(DIRAMPFORCE);
|
||
|
}
|
||
|
else {
|
||
|
pRealEffect->lpvTypeSpecificParams =NULL;
|
||
|
pRealEffect->cbTypeSpecificParams =0;
|
||
|
dwFlags= dwFlags -DIEP_TYPESPECIFICPARAMS;
|
||
|
}
|
||
|
|
||
|
|
||
|
effectInfo->axisOffsets.x=DIJOFS_X;
|
||
|
effectInfo->axisOffsets.y=DIJOFS_Y;
|
||
|
pRealEffect->rgdwAxes=(DWORD*)&(effectInfo->axisOffsets);
|
||
|
|
||
|
hr=m__dxj_DirectInputEffect->GetParameters(pRealEffect, dwFlags);
|
||
|
|
||
|
if FAILED(hr) return hr;
|
||
|
|
||
|
if (pRealEffect->cbTypeSpecificParams =sizeof(DICONDITION)*2)
|
||
|
effectInfo->conditionFlags=DICONDITION_USE_BOTH_AXIS;
|
||
|
else
|
||
|
effectInfo->conditionFlags=DICONDITION_USE_DIRECTION;
|
||
|
|
||
|
if (pRealEffect->lpEnvelope){
|
||
|
effectInfo->bUseEnvelope=VARIANT_TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|