867 lines
24 KiB
C++
867 lines
24 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1998 - 1999
|
||
|
//
|
||
|
// File: d3ddevice7obj.cpp
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
// d3dDeviceObj.cpp : Implementation of CDirectApp and DLL registration.
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "Direct.h"
|
||
|
#include "dms.h"
|
||
|
#include "d3d7Obj.h"
|
||
|
#include "d3dDevice7Obj.h"
|
||
|
#include "ddSurface7Obj.h"
|
||
|
#include "d3dEnumPixelFormats7Obj.h"
|
||
|
|
||
|
extern BSTR D3DGUIDtoBSTR(LPGUID);
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// C_dxj_Direct3dDevice7Object
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
C_dxj_Direct3dDevice7Object::C_dxj_Direct3dDevice7Object(){
|
||
|
m__dxj_Direct3dDevice7=NULL;
|
||
|
parent=NULL;
|
||
|
pinterface=NULL;
|
||
|
creationid = ++g_creationcount;
|
||
|
DPF1(1,"Constructor Creation Direct3dDevice7[%d] \n",g_creationcount);
|
||
|
|
||
|
|
||
|
nextobj = g_dxj_Direct3dDevice7;
|
||
|
g_dxj_Direct3dDevice7 = (void *)this;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// ~C_dxj_Direct3dDevice7Object
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
C_dxj_Direct3dDevice7Object::~C_dxj_Direct3dDevice7Object()
|
||
|
{
|
||
|
C_dxj_Direct3dDevice7Object *prev=NULL;
|
||
|
for(C_dxj_Direct3dDevice7Object *ptr=(C_dxj_Direct3dDevice7Object *)g_dxj_Direct3dDevice7; ptr; ptr=(C_dxj_Direct3dDevice7Object *)ptr->nextobj)
|
||
|
{
|
||
|
if(ptr == this)
|
||
|
{
|
||
|
if(prev)
|
||
|
prev->nextobj = ptr->nextobj;
|
||
|
else
|
||
|
g_dxj_Direct3dDevice7 = (void*)ptr->nextobj;
|
||
|
break;
|
||
|
}
|
||
|
prev = ptr;
|
||
|
}
|
||
|
if(m__dxj_Direct3dDevice7){
|
||
|
int count = IUNK(m__dxj_Direct3dDevice7)->Release();
|
||
|
|
||
|
DPF1(1, "DirectX IDirect3dDevice7 Ref count [%d] \n",count);
|
||
|
|
||
|
if(count==0) m__dxj_Direct3dDevice7 = NULL;
|
||
|
}
|
||
|
if(parent) IUNK(parent)->Release();
|
||
|
if(parent2) IUNK(parent2)->Release();
|
||
|
|
||
|
parent=NULL;
|
||
|
parent2=NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////// /////////////////////////////////////////////////
|
||
|
// InternalAddRef
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
DWORD C_dxj_Direct3dDevice7Object::InternalAddRef(){
|
||
|
DWORD i;
|
||
|
i=CComObjectRoot::InternalAddRef();
|
||
|
DPF2(1,"Direct3dDevice7[%d] AddRef %d \n",creationid,i);
|
||
|
|
||
|
return i;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// InternalRelease
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
DWORD C_dxj_Direct3dDevice7Object::InternalRelease(){
|
||
|
DWORD i;
|
||
|
i=CComObjectRoot::InternalRelease();
|
||
|
DPF2(szBuf,"Direct3dDevice7 [%d] Release %d \n",creationid,i);
|
||
|
|
||
|
return i;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// InternalGetObject
|
||
|
// InternalSetObject
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
GETSET_OBJECT(_dxj_Direct3dDevice7);
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// beginScene
|
||
|
// endScene
|
||
|
// setClipStatus
|
||
|
// setLightState
|
||
|
// setRenderState
|
||
|
// getClipStatus
|
||
|
// getLightState
|
||
|
// getRenderState
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
PASS_THROUGH_R(_dxj_Direct3dDevice7, beginScene, BeginScene);
|
||
|
PASS_THROUGH_CAST_1_R(_dxj_Direct3dDevice7, setClipStatus, SetClipStatus, D3dClipStatus*,(D3DCLIPSTATUS*));
|
||
|
PASS_THROUGH_CAST_2_R(_dxj_Direct3dDevice7, setRenderState, SetRenderState, long,(D3DRENDERSTATETYPE), long ,(DWORD));
|
||
|
PASS_THROUGH_CAST_1_R(_dxj_Direct3dDevice7, getClipStatus, GetClipStatus, D3dClipStatus*, (D3DCLIPSTATUS *));
|
||
|
PASS_THROUGH_CAST_2_R(_dxj_Direct3dDevice7, getRenderState, GetRenderState, long ,(D3DRENDERSTATETYPE), long*,(DWORD*));
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// endScene
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::endScene()
|
||
|
{
|
||
|
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_Direct3dDevice7->EndScene();
|
||
|
|
||
|
|
||
|
#ifdef _X86_
|
||
|
_asm FINIT
|
||
|
#endif
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// getRenderTarget
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::getRenderTarget(I_dxj_DirectDrawSurface7 **ppsurf)
|
||
|
{
|
||
|
|
||
|
LPDIRECTDRAWSURFACE7 lpSurf=NULL;
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_Direct3dDevice7->GetRenderTarget(&lpSurf);
|
||
|
|
||
|
INTERNAL_CREATE(_dxj_DirectDrawSurface7, lpSurf, ppsurf);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// getTransform
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::getTransform(long transtype,
|
||
|
D3dMatrix *m){
|
||
|
return m__dxj_Direct3dDevice7->GetTransform(
|
||
|
(D3DTRANSFORMSTATETYPE) transtype,
|
||
|
(LPD3DMATRIX)m);
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// multiplyTransform
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::multiplyTransform(long transtype,
|
||
|
D3dMatrix *m){
|
||
|
return m__dxj_Direct3dDevice7->MultiplyTransform(
|
||
|
(D3DTRANSFORMSTATETYPE) transtype,
|
||
|
(LPD3DMATRIX) m);
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// setTransform
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::setTransform(long transtype,
|
||
|
D3dMatrix *m){
|
||
|
return m__dxj_Direct3dDevice7->SetTransform(
|
||
|
(D3DTRANSFORMSTATETYPE) transtype,
|
||
|
(LPD3DMATRIX) m);
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// setRenderTarget
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::setRenderTarget(I_dxj_DirectDrawSurface7 *surf)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
if (!surf) return E_INVALIDARG;
|
||
|
DO_GETOBJECT_NOTNULL(LPDIRECTDRAWSURFACE7, lpref, surf);
|
||
|
hr= m__dxj_Direct3dDevice7->SetRenderTarget(lpref,0);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// getTextureFormatsEnum
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::getTextureFormatsEnum(I_dxj_Direct3DEnumPixelFormats **ppRet)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
hr=C_dxj_Direct3DEnumPixelFormats7Object::create1(m__dxj_Direct3dDevice7,ppRet);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// validateDevice
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::validateDevice(
|
||
|
/* [retval][out] */ long __RPC_FAR *passes)
|
||
|
{
|
||
|
HRESULT hr=m__dxj_Direct3dDevice7->ValidateDevice((DWORD*)passes);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// getTexture
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::getTexture(
|
||
|
/* [in] */ long stage,
|
||
|
/* [retval][out] */ I_dxj_DirectDrawSurface7 __RPC_FAR *__RPC_FAR *retv)
|
||
|
{
|
||
|
LPDIRECTDRAWSURFACE7 lpNew=NULL;
|
||
|
HRESULT hr;
|
||
|
|
||
|
*retv=NULL;
|
||
|
hr=m__dxj_Direct3dDevice7->GetTexture((DWORD)stage,&lpNew);
|
||
|
|
||
|
//null is valid
|
||
|
if (lpNew==NULL) return S_OK;
|
||
|
|
||
|
INTERNAL_CREATE(_dxj_DirectDrawSurface7, lpNew, retv);
|
||
|
if (*retv==NULL) return E_OUTOFMEMORY;
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// getTextureStageState
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::getTextureStageState(
|
||
|
/* [in] */ long stage,
|
||
|
/* [in] */ long state,
|
||
|
/* [retval][out] */ long __RPC_FAR *retv)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_Direct3dDevice7->GetTextureStageState((DWORD)stage,(D3DTEXTURESTAGESTATETYPE) state, (DWORD*)retv);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// setTexture
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::setTexture(
|
||
|
long stage,
|
||
|
I_dxj_DirectDrawSurface7 *tex)
|
||
|
{
|
||
|
|
||
|
HRESULT hr;
|
||
|
DO_GETOBJECT_NOTNULL(LPDIRECTDRAWSURFACE7, lpTex, tex);
|
||
|
hr=m__dxj_Direct3dDevice7->SetTexture((DWORD)stage,lpTex);
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// setTextureStageState
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::setTextureStageState(
|
||
|
/* [in] */ long stage,
|
||
|
/* [in] */ long state,
|
||
|
/* [in] */ long val)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_Direct3dDevice7->SetTextureStageState((DWORD)stage,(D3DTEXTURESTAGESTATETYPE) state, (DWORD)val);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// getCaps
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::getCaps(
|
||
|
D3dDeviceDesc7 *a)
|
||
|
{
|
||
|
//if (a) a->lSize=sizeof(D3DDEVICEDESC7);
|
||
|
|
||
|
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_Direct3dDevice7->GetCaps((D3DDEVICEDESC7*)a);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// getDirect3D
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::getDirect3D( I_dxj_Direct3d7 **ret)
|
||
|
{
|
||
|
|
||
|
HRESULT hr;
|
||
|
LPDIRECT3D7 lpD3D=NULL;
|
||
|
hr=m__dxj_Direct3dDevice7->GetDirect3D(&lpD3D);
|
||
|
if FAILED(hr) return hr;
|
||
|
if (!lpD3D) return E_FAIL;
|
||
|
INTERNAL_CREATE(_dxj_Direct3d7,lpD3D,ret);
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// setViewport
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::setViewport( D3dViewport7 *viewport)
|
||
|
{
|
||
|
|
||
|
HRESULT hr;
|
||
|
if(!viewport) return E_INVALIDARG;
|
||
|
hr=m__dxj_Direct3dDevice7->SetViewport((D3DVIEWPORT7*)viewport);
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// getViewport
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::getViewport( D3dViewport7 *viewport)
|
||
|
{
|
||
|
|
||
|
HRESULT hr;
|
||
|
if(!viewport) return E_INVALIDARG;
|
||
|
hr=m__dxj_Direct3dDevice7->GetViewport((D3DVIEWPORT7*)viewport);
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// setMaterial
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::setMaterial( D3dMaterial7 *mat)
|
||
|
{
|
||
|
|
||
|
HRESULT hr;
|
||
|
if(!mat) return E_INVALIDARG;
|
||
|
hr=m__dxj_Direct3dDevice7->SetMaterial((D3DMATERIAL7*)mat);
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// getMaterial
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::getMaterial( D3dMaterial7 *mat)
|
||
|
{
|
||
|
|
||
|
HRESULT hr;
|
||
|
if(!mat) return E_INVALIDARG;
|
||
|
hr=m__dxj_Direct3dDevice7->GetMaterial((D3DMATERIAL7*)mat);
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// setLight
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::setLight( long i,D3dLight7 *lgt)
|
||
|
{
|
||
|
|
||
|
HRESULT hr;
|
||
|
if(!lgt) return E_INVALIDARG;
|
||
|
hr=m__dxj_Direct3dDevice7->SetLight((DWORD)i,(D3DLIGHT7*)lgt);
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// getLight
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::getLight( long i,D3dLight7 *lgt)
|
||
|
{
|
||
|
|
||
|
HRESULT hr;
|
||
|
if(!lgt) return E_INVALIDARG;
|
||
|
hr=m__dxj_Direct3dDevice7->GetLight((DWORD)i,(D3DLIGHT7*)lgt);
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// beginStateBlock
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::beginStateBlock()
|
||
|
{
|
||
|
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_Direct3dDevice7->BeginStateBlock();
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// endStateBlock
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::endStateBlock( long *retv)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_Direct3dDevice7->EndStateBlock((DWORD*)retv);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// deleteStateBlock
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::deleteStateBlock(long m)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_Direct3dDevice7->DeleteStateBlock((DWORD)m);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// ApplyStateBlock
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::applyStateBlock(long m)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_Direct3dDevice7->ApplyStateBlock((DWORD)m);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// createStateBlock
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::createStateBlock(long type, long *retval)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_Direct3dDevice7->CreateStateBlock((D3DSTATEBLOCKTYPE)type,(DWORD*)retval);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// captureStateBlock
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::captureStateBlock(long m)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_Direct3dDevice7->CaptureStateBlock((DWORD)m);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// lightEnable
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::lightEnable( long index, VARIANT_BOOL b){
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_Direct3dDevice7->LightEnable((DWORD)index,(b!=VARIANT_FALSE));
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// lightEnable
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::getLightEnable( long index, VARIANT_BOOL *bOut){
|
||
|
HRESULT hr;
|
||
|
BOOL b;
|
||
|
hr=m__dxj_Direct3dDevice7->GetLightEnable((DWORD)index,&b);
|
||
|
if (b){
|
||
|
*bOut=VARIANT_TRUE;
|
||
|
}
|
||
|
else {
|
||
|
*bOut=VARIANT_FALSE;
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// drawIndexedPrimitive
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::drawIndexedPrimitive(
|
||
|
d3dPrimitiveType d3dpt,
|
||
|
long d3dvt,
|
||
|
void *Verts,
|
||
|
long vertexCount,
|
||
|
SAFEARRAY **ppsaIndex,
|
||
|
long indexArraySize,
|
||
|
long flags){
|
||
|
|
||
|
HRESULT hr;
|
||
|
|
||
|
__try {
|
||
|
hr=m__dxj_Direct3dDevice7->DrawIndexedPrimitive(
|
||
|
(D3DPRIMITIVETYPE) d3dpt,
|
||
|
(DWORD) d3dvt,
|
||
|
(void*) Verts,
|
||
|
(DWORD)vertexCount,
|
||
|
(unsigned short*) ((SAFEARRAY*)*ppsaIndex)->pvData,
|
||
|
(DWORD)indexArraySize,
|
||
|
(DWORD) flags);
|
||
|
}
|
||
|
__except(1, 1){
|
||
|
return DDERR_EXCEPTION;
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// drawPrimitive
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::drawPrimitive(
|
||
|
d3dPrimitiveType d3dpt,
|
||
|
long d3dvt,
|
||
|
void* Verts,
|
||
|
long vertexCount,
|
||
|
long flags){
|
||
|
HRESULT hr;
|
||
|
__try {
|
||
|
hr= m__dxj_Direct3dDevice7->DrawPrimitive(
|
||
|
(D3DPRIMITIVETYPE) d3dpt,
|
||
|
(DWORD) d3dvt,
|
||
|
(void*) Verts,
|
||
|
(DWORD)vertexCount,
|
||
|
(DWORD) flags);
|
||
|
}
|
||
|
__except(1, 1){
|
||
|
return DDERR_EXCEPTION;
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// clear
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::clear(long count,SAFEARRAY **psa, long flags, long color, float z, long stencil )
|
||
|
{
|
||
|
if (!ISSAFEARRAY1D(psa,(DWORD)count)) return E_INVALIDARG;
|
||
|
return m__dxj_Direct3dDevice7->Clear( (DWORD)count,(D3DRECT*)((SAFEARRAY*)*psa)->pvData, flags ,color,z,stencil);
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// computeSphereVisibility
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::computeSphereVisibility(
|
||
|
D3dVector __RPC_FAR *center,
|
||
|
float __RPC_FAR *radi,
|
||
|
/* [retval][out] */ long __RPC_FAR *returnVal)
|
||
|
{
|
||
|
HRESULT hr=m__dxj_Direct3dDevice7->ComputeSphereVisibility((LPD3DVECTOR)center,radi,1,0,(DWORD*)returnVal);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// drawIndexedPrimitiveVB
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::drawIndexedPrimitiveVB(
|
||
|
/* [in] */ d3dPrimitiveType d3dpt,
|
||
|
/* [in] */ I_dxj_Direct3dVertexBuffer7 __RPC_FAR *vertexBuffer,
|
||
|
long startIndex,
|
||
|
long numIndex,
|
||
|
/* [in] */ SAFEARRAY __RPC_FAR * __RPC_FAR *indexArray,
|
||
|
/* [in] */ long indexcount,
|
||
|
/* [in] */ long flags)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
if (!indexArray) return E_FAIL;
|
||
|
|
||
|
DO_GETOBJECT_NOTNULL( LPDIRECT3DVERTEXBUFFER7 , lpVB, vertexBuffer);
|
||
|
__try{
|
||
|
|
||
|
hr=m__dxj_Direct3dDevice7->DrawIndexedPrimitiveVB
|
||
|
((D3DPRIMITIVETYPE)d3dpt,
|
||
|
lpVB,
|
||
|
(DWORD) startIndex,
|
||
|
(DWORD) numIndex,
|
||
|
(WORD*) ((SAFEARRAY*)*indexArray)->pvData,
|
||
|
(DWORD)indexcount,
|
||
|
(DWORD)flags);
|
||
|
|
||
|
}
|
||
|
__except(1,1){
|
||
|
return DDERR_EXCEPTION;
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// drawPrimitiveVB
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::drawPrimitiveVB(
|
||
|
/* [in] */ d3dPrimitiveType d3dpt,
|
||
|
/* [in] */ I_dxj_Direct3dVertexBuffer7 __RPC_FAR *vertexBuffer,
|
||
|
/* [in] */ long startVertex,
|
||
|
/* [in] */ long numVertices,
|
||
|
/* [in] */ long flags)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
|
||
|
DO_GETOBJECT_NOTNULL( LPDIRECT3DVERTEXBUFFER7 , lpVB, vertexBuffer);
|
||
|
__try{
|
||
|
|
||
|
hr=m__dxj_Direct3dDevice7->DrawPrimitiveVB
|
||
|
((D3DPRIMITIVETYPE)d3dpt,
|
||
|
lpVB,
|
||
|
(DWORD) startVertex,
|
||
|
(DWORD) numVertices,
|
||
|
(DWORD)flags);
|
||
|
|
||
|
}
|
||
|
__except(1,1){
|
||
|
|
||
|
return DDERR_EXCEPTION;
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::preLoad( I_dxj_DirectDrawSurface7 *surf)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
DO_GETOBJECT_NOTNULL( LPDIRECTDRAWSURFACE7 , lpSurf, surf);
|
||
|
hr= m__dxj_Direct3dDevice7->PreLoad(lpSurf);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// load
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::load(
|
||
|
/* [in] */ I_dxj_DirectDrawSurface7 __RPC_FAR *tex1,
|
||
|
/* [in] */ long x,
|
||
|
/* [in] */ long y,
|
||
|
/* [in] */ I_dxj_DirectDrawSurface7 __RPC_FAR *tex2,
|
||
|
/* [in] */ Rect __RPC_FAR *rc,
|
||
|
/* [in] */ long flags)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
if (!tex1) return E_INVALIDARG;
|
||
|
if (!tex2) return E_INVALIDARG;
|
||
|
if (!rc) return E_INVALIDARG;
|
||
|
|
||
|
DO_GETOBJECT_NOTNULL(LPDIRECTDRAWSURFACE7,lpTex1,tex1);
|
||
|
DO_GETOBJECT_NOTNULL(LPDIRECTDRAWSURFACE7,lpTex2,tex2);
|
||
|
|
||
|
//dont allow this as it gpfs some drivers and is invalid anyway
|
||
|
if (lpTex1==lpTex2) return E_INVALIDARG;
|
||
|
|
||
|
POINT p;
|
||
|
p.x=x;
|
||
|
p.y=y;
|
||
|
|
||
|
hr=m__dxj_Direct3dDevice7->Load(lpTex1,&p,lpTex2,(LPRECT)rc,(DWORD)flags);
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
//PASS_THROUGH_CAST_2_R(_dxj_Direct3dDevice7, setRenderState, SetRenderState, long,(D3DRENDERSTATETYPE), long ,(DWORD));
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// setRenderStateSingle
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::setRenderStateSingle(
|
||
|
/* [in] */ long renderstate,
|
||
|
/* [in] */ float val)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_Direct3dDevice7->SetRenderState((D3DRENDERSTATETYPE) renderstate, *((DWORD*)&val));
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// getRenderStateSingle
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::getRenderStateSingle(
|
||
|
/* [in] */ long renderstate,
|
||
|
/* [in] */ float *val)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_Direct3dDevice7->GetRenderState((D3DRENDERSTATETYPE) renderstate, (DWORD*)val);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// setTextureStageStateSingle
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::setTextureStageStateSingle(
|
||
|
/* [in] */ long stage,
|
||
|
/* [in] */ long state,
|
||
|
/* [in] */ float val)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
hr=m__dxj_Direct3dDevice7->SetTextureStageState((DWORD)stage,(D3DTEXTURESTAGESTATETYPE) state, *((DWORD*)&val));
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// getTextureStageState
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::getTextureStageStateSingle(
|
||
|
/* [in] */ long stage,
|
||
|
/* [in] */ long state,
|
||
|
/* [in] */ float *val)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
hr=m__dxj_Direct3dDevice7->GetTextureStageState((DWORD)stage,(D3DTEXTURESTAGESTATETYPE) state, (DWORD*)val);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// getInfo
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::getInfo(
|
||
|
/* [in] */ long lDevInfoID,
|
||
|
/* [out][in] */ void __RPC_FAR *DevInfoType,
|
||
|
/* [in] */ long lSize)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
__try
|
||
|
{
|
||
|
hr=m__dxj_Direct3dDevice7->GetInfo((DWORD)lDevInfoID,DevInfoType, (DWORD)lSize);
|
||
|
}
|
||
|
__except(1,1)
|
||
|
{
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// getDeviceGuid
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::getDeviceGuid( BSTR *ret)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
D3DDEVICEDESC7 desc;
|
||
|
|
||
|
if (!ret) return E_INVALIDARG;
|
||
|
|
||
|
//desc.dwSize=sizeof(D3DDEVICEDESC7);
|
||
|
|
||
|
hr=m__dxj_Direct3dDevice7->GetCaps(&desc);
|
||
|
if FAILED(hr) return hr;
|
||
|
|
||
|
|
||
|
*ret=D3DGUIDtoBSTR(&desc.deviceGUID);
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// setClipPlane
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::setClipPlane(long index,float A, float B, float C, float D)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
float floats[4];
|
||
|
|
||
|
floats[0]=A;
|
||
|
floats[1]=B;
|
||
|
floats[2]=C;
|
||
|
floats[3]=D;
|
||
|
|
||
|
hr=m__dxj_Direct3dDevice7->SetClipPlane((DWORD)index, floats);
|
||
|
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// setClipPlane
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::getClipPlane(long index,float *A, float *B, float *C, float *D)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
float floats[4];
|
||
|
|
||
|
hr=m__dxj_Direct3dDevice7->GetClipPlane((DWORD)index, floats);
|
||
|
if FAILED(hr) return hr;
|
||
|
|
||
|
*A=floats[0];
|
||
|
*B=floats[1];
|
||
|
*C=floats[2];
|
||
|
*D=floats[3];
|
||
|
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
#if 0
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// clear
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::clear(
|
||
|
/* [in] */ long l1,
|
||
|
/* [in] */ D3dRect __RPC_FAR *rc,
|
||
|
/* [in] */ long l2,
|
||
|
/* [in] */ long color,
|
||
|
/* [in] */ float z,
|
||
|
/* [in] */ long l3)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
if (!rc) return E_INVALIDARG;
|
||
|
__try{
|
||
|
hr=m__dxj_Direct3dDevice7->Clear((DWORD)l1,(D3DRECT*)rc,(DWORD)l2,(DWORD)color,(float)z,(DWORD)l3);
|
||
|
}
|
||
|
__except(1,1){
|
||
|
return E_INVALIDARG;
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
// setVertexComponent
|
||
|
//////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP C_dxj_Direct3dDevice7Object::setVertexComponent(
|
||
|
/* [in] */ long __RPC_FAR component,
|
||
|
/* [in] */ I_dxj_Direct3dVertexBuffer7 __RPC_FAR *vb,
|
||
|
/* [in] */ long l1,
|
||
|
/* [in] */ long l2)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
if (!vb) return E_INVALIDARG;
|
||
|
DO_GETOBJECT_NOTNULL(LPDIRECT3DVERTEXBUFFER7,pVB,vb);
|
||
|
|
||
|
hr=m__dxj_Direct3dDevice7->SetVertexComponent((D3DVERTEXCOMPONENT)component, pVB,(DWORD)l1,(DWORD)l2);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
#endif
|