📄 dtbase.cpp
字号:
}
}
else
{
bImage = !(m_dwOptionFlags & DXBOF_INPUTS_MESHBUILDER);
if (ulIndex < m_ulMaxInputs)
{
hr = S_OK;
if (ulIndex >= m_ulNumInRequired)
{
dwFlags = DXINOUTF_OPTIONAL;
}
}
}
if( hr == S_OK )
{
if( pdwFlags && !DXIsBadWritePtr( pdwFlags, sizeof( *pdwFlags ) ) )
{
*pdwFlags = dwFlags;
}
if( pIDs )
{
if( DXIsBadWritePtr( pcIDs, sizeof( *pcIDs ) ) ||
DXIsBadWritePtr( pIDs, *pcIDs * sizeof( *pIDs ) ) )
{
hr = E_INVALIDARG;
}
else
{
if (bImage)
{
if (*pcIDs > 0)
{
pIDs[0] = IID_IDXSurface;
}
if (*pcIDs > 1)
{
pIDs[1] = IID_IDXDupDDrawSurface;
}
else
{
hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
}
*pcIDs = 2;
}
else
{
if (*pcIDs > 0)
{
pIDs[0] = IID_IDXDupDirect3DRMMeshBuilder3;
}
else
{
hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
}
*pcIDs = 1;
}
}
}
else if( pcIDs )
{
if( DXIsBadWritePtr( pcIDs, sizeof( *pcIDs ) ) )
{
hr = E_POINTER;
}
else
{
*pcIDs = bImage ? 2 : 1;
}
}
if (hr == S_OK && ppUnkCurObj)
{
if (DXIsBadWritePtr(ppUnkCurObj, sizeof(*ppUnkCurObj)))
{
hr = E_POINTER;
}
else
{
if (bOutput)
{
*ppUnkCurObj = m_Output.m_pNativeInterface;
}
else
{
*ppUnkCurObj = NULL;
if (ulIndex < GetNumInputs())
{
*ppUnkCurObj = m_aInputs[ulIndex].m_pUnkOriginalObject;
}
}
if (*ppUnkCurObj)
{
(*ppUnkCurObj)->AddRef();
}
}
}
}
return hr;
} /* CDXBaseNTo1::GetInOutInfo */
/*****************************************************************************
* CDXBaseNTo1::OnUpdateGenerationId *
*-----------------------------------*
* Description:
*-----------------------------------------------------------------------------
* Created By: RAL Date: 12/10/97
*-----------------------------------------------------------------------------
* Parameters:
*****************************************************************************/
void CDXBaseNTo1::OnUpdateGenerationId(void)
{
DXTDBG_FUNC( "CDXBaseNTo1::OnUpdateGenerationId" );
if( (m_dwMiscFlags & DXTMF_INPLACE_OPERATION) &&
m_Output.UpdateGenerationId())
{
m_dwGenerationId++;
}
for (ULONG i = 0; i < m_ulNumInputs; i++)
{
if (m_aInputs[i].UpdateGenerationId())
{
m_dwGenerationId++;
}
}
} /* CDXBaseNTo1::OnUpdateGenerationId */
/*****************************************************************************
* CDXBaseNTo1::OnGetObjectSize *
*------------------------------*
* Description:
*-----------------------------------------------------------------------------
* Created By: RAL Date: 12/10/97
*****************************************************************************/
ULONG CDXBaseNTo1::OnGetObjectSize(void)
{
return sizeof(*this);
}
//
// Effect interface
//
/*****************************************************************************
* CDXBaseNTo1::get_Progress *
*---------------------------*
* Description:
*-----------------------------------------------------------------------------
* Created By: RAL Date: 12/10/97
*****************************************************************************/
STDMETHODIMP CDXBaseNTo1::get_Progress(float *pVal)
{
DXTDBG_FUNC( "CDXBaseNTo1::get_Progress" );
HRESULT hr = S_OK;
if( DXIsBadWritePtr(pVal, sizeof(*pVal)) )
{
hr = E_POINTER;
}
else
{
*pVal = m_Progress;
}
return hr;
}
/*****************************************************************************
* CDXBaseNTo1::put_Progress *
*---------------------------*
* Description:
*-----------------------------------------------------------------------------
* Created By: RAL Date: 12/10/97
*****************************************************************************/
STDMETHODIMP CDXBaseNTo1::put_Progress(float newVal)
{
DXTDBG_FUNC( "CDXBaseNTo1::put_Progress" );
HRESULT hr = S_OK;
if (newVal < 0.0 || newVal > 1.0f)
{
hr = E_INVALIDARG;
}
else
{
Lock();
m_Progress = newVal;
m_dwCleanGenId++; // This should not make the transform "dirty" internally
m_dwGenerationId++;
Unlock();
}
return hr;
}
/*****************************************************************************
* CDXBaseNTo1::get_StepResolution *
*---------------------------------*
* Description:
*-----------------------------------------------------------------------------
* Created By: RAL Date: 12/10/97
*****************************************************************************/
STDMETHODIMP CDXBaseNTo1::get_StepResolution(float *pVal)
{
DXTDBG_FUNC( "CDXBaseNTo1::get_StepResolution" );
HRESULT hr = S_OK;
if( DXIsBadWritePtr(pVal, sizeof(*pVal)) )
{
hr = E_POINTER;
}
else
{
*pVal = m_StepResolution;
}
return hr;
}
/*****************************************************************************
* CDXBaseNTo1::get_Duration *
*---------------------------*
* Description:
*-----------------------------------------------------------------------------
* Created By: RAL Date: 12/10/97
*****************************************************************************/
STDMETHODIMP CDXBaseNTo1::get_Duration(float *pVal)
{
DXTDBG_FUNC( "CDXBaseNTo1::get_Duration" );
if( DXIsBadWritePtr(pVal, sizeof(*pVal)) )
{
return E_POINTER;
}
else
{
*pVal = m_Duration;
}
return S_OK;
}
/*****************************************************************************
* CDXBaseNTo1::put_Duration *
*---------------------------*
* Description:
*-----------------------------------------------------------------------------
* Created By: RAL Date: 12/10/97
*****************************************************************************/
STDMETHODIMP CDXBaseNTo1::put_Duration(float newVal)
{
DXTDBG_FUNC( "CDXBaseNTo1::put_Duration" );
if (newVal <= 0.)
{
return E_INVALIDARG;
}
if(newVal != m_Duration)
{
Lock();
m_dwGenerationId++;
m_dwCleanGenId++; // This should not make the transform "dirty" internally
m_Duration = newVal;
Unlock();
}
return S_OK;
}
/*****************************************************************************
* CDXBaseNTo1::PointPick *
*------------------------*
* Description:
*-----------------------------------------------------------------------------
* Created By: RAL Date: 5/5/98
*****************************************************************************/
STDMETHODIMP CDXBaseNTo1::PointPick(const DXVEC *pPoint,
ULONG * pulInputSurfaceIndex,
DXVEC *pInputPoint)
{
HRESULT hr = S_OK;
BOOL bFoundIt = FALSE;
if (DXIsBadReadPtr(pPoint, sizeof(*pPoint)) || pPoint->eType != DXBT_DISCRETE)
{
hr = E_INVALIDARG;
}
else
{
if (DXIsBadWritePtr(pulInputSurfaceIndex, sizeof(*pulInputSurfaceIndex)) ||
DXIsBadWritePtr(pInputPoint, sizeof(*pInputPoint)))
{
hr = E_POINTER;
}
else
{
CDXDBnds OutBndsPoint(*((CDXDVec *)pPoint));
CDXDVec & InVec = *(new(pInputPoint) CDXDVec(*((CDXDVec *)pPoint)));
HRESULT hr2 = OnSurfacePick(OutBndsPoint, *pulInputSurfaceIndex, InVec);
if (hr2 != E_NOTIMPL)
{
hr = hr2;
}
else
{
//--- The derived class does not implement so we will do
// the hit test against the input for them.
ULONG * aulInIndex = (ULONG *)_alloca(sizeof(ULONG) * m_ulMaxInputs);
BYTE * aWeights = (BYTE *)_alloca(sizeof(BYTE) * m_ulMaxInputs);
ULONG ulNumToTest;
OnGetSurfacePickOrder(OutBndsPoint, ulNumToTest, aulInIndex, aWeights);
if( m_bPickDoneByBase && ( m_ulNumInputs > 1 ) )
{
//--- We don't know how to do multi-input picking from the base.
hr = E_NOTIMPL;
}
for (ULONG i = 0; SUCCEEDED(hr) && i < ulNumToTest; i++)
{
ULONG ulInput = aulInIndex[i];
if (HaveInput(ulInput) && aWeights[i])
{
CDXDBnds Out2InBnds(false);
hr = MapBoundsOut2In(0, &OutBndsPoint, ulInput, &Out2InBnds);
if (SUCCEEDED(hr))
{
CDXDBnds InSurfBnds(InputSurface(ulInput), hr);
if (SUCCEEDED(hr) && InSurfBnds.IntersectBounds(Out2InBnds))
{
IDXARGBReadPtr * pPtr;
hr = InputSurface(ulInput)->LockSurface(&InSurfBnds, m_ulLockTimeOut, DXLOCKF_READ,
IID_IDXARGBReadPtr, (void **)&pPtr, NULL);
if( SUCCEEDED(hr) )
{
DXPMSAMPLE val;
pPtr->UnpackPremult(&val, 1, FALSE);
pPtr->Release();
if (val.Alpha * aWeights[i] / 255)
{
InSurfBnds.GetMinVector(InVec);
bFoundIt = TRUE;
*pulInputSurfaceIndex = ulInput;
break;
}
}
}
}
}
}
if (SUCCEEDED(hr) & (!bFoundIt))
{
hr = S_FALSE;
}
}
}
}
return hr;
} /* CDXBaseNTo1::PointPick */
/*****************************************************************************
* RegisterTansform (STATIC member function)
*-----------------------------------------------------------------------------
* Description:
*-----------------------------------------------------------------------------
* Created By: RAL Date: 12/10/97
*-----------------------------------------------------------------------------
* Parameters:
*****************************************************************************/
HRESULT CDXBaseNTo1::
RegisterTransform(REFCLSID rcid, int ResourceId, ULONG cCatImpl, const CATID * pCatImpl,
ULONG cCatReq, const CATID * pCatReq, BOOL bRegister)
{
DXTDBG_FUNC( "CDXBaseNTo1::RegisterTransform" );
HRESULT hr = bRegister ? _Module.UpdateRegistryFromResource(ResourceId, bRegister) : S_OK;
if (SUCCEEDED(hr))
{
CComPtr<ICatRegister> pCatRegister;
HRESULT hr = ::CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC, IID_ICatRegister, (void **)&pCatRegister);
if (SUCCEEDED(hr))
{
if (bRegister)
{
hr = pCatRegister->RegisterClassImplCategories(rcid, cCatImpl, (CATID *)pCatImpl);
if (SUCCEEDED(hr) && cCatReq && pCatReq) {
hr = pCatRegister->RegisterClassReqCategories(rcid, cCatReq, (CATID *)pCatReq);
}
}
else
{
pCatRegister->UnRegisterClassImplCategories(rcid, cCatImpl, (CATID *)pCatImpl);
if (cCatReq && pCatReq)
{
pCatRegister->UnRegisterClassReqCategories(rcid, cCatReq, (CATID *)pCatReq);
}
}
}
}
if ((!bRegister) && SUCCEEDED(hr))
{
_Module.UpdateRegistryFromResource(ResourceId, bRegister);
}
return hr;
}
//
// BUGBUG -- try/except around this !
//
void CDXBaseNTo1::_TaskProc(void* pTaskInfo, BOOL* pbContinue )
{
_ASSERT( pTaskInfo );
CDXTWorkInfoNTo1& WI = *((CDXTWorkInfoNTo1 *)pTaskInfo);
CDXBaseNTo1& This = *((CDXBaseNTo1 *)WI.pvThis);
WI.hr = This.WorkProc(WI, pbContinue);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -