You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
264 lines
8.2 KiB
264 lines
8.2 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1998 - 1999
|
|
//
|
|
// File: d3drmdevice3obj.cpp
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
// d3drmDeviceObj.cpp : Implementation of CDirectApp and DLL registration.
|
|
|
|
#include "stdafx.h"
|
|
#include "Direct.h"
|
|
#include "dms.h"
|
|
#include "d3drmDevice3Obj.h"
|
|
#include "d3drmViewportArrayObj.h"
|
|
|
|
|
|
C_dxj_Direct3dRMDevice3Object::C_dxj_Direct3dRMDevice3Object(){
|
|
m__dxj_Direct3dRMDevice3=NULL;
|
|
parent=NULL;
|
|
pinterface=NULL;
|
|
creationid = ++g_creationcount;
|
|
|
|
parent2 =NULL;
|
|
|
|
DPF1(1,"Constructor Creation Direct3dRMDevice3[%d] \n",g_creationcount);
|
|
|
|
nextobj = g_dxj_Direct3dRMDevice3;
|
|
g_dxj_Direct3dRMDevice3 = (void *)this;
|
|
}
|
|
|
|
|
|
C_dxj_Direct3dRMDevice3Object::~C_dxj_Direct3dRMDevice3Object(){
|
|
|
|
DPF1(1,"Destructor Direct3dRMDevice3 [%d] \n",creationid);
|
|
|
|
C_dxj_Direct3dRMDevice3Object *prev=NULL;
|
|
|
|
for(C_dxj_Direct3dRMDevice3Object *ptr=(C_dxj_Direct3dRMDevice3Object *)g_dxj_Direct3dRMDevice3;
|
|
ptr;
|
|
ptr=(C_dxj_Direct3dRMDevice3Object *)ptr->nextobj)
|
|
{
|
|
if(ptr == this)
|
|
{
|
|
if(prev)
|
|
prev->nextobj = ptr->nextobj;
|
|
else
|
|
g_dxj_Direct3dRMDevice3 = (void*)ptr->nextobj;
|
|
break;
|
|
}
|
|
prev = ptr;
|
|
}
|
|
if(m__dxj_Direct3dRMDevice3){
|
|
int count = IUNK(m__dxj_Direct3dRMDevice3)->Release();
|
|
DPF1(1,"DirectX real IDirect3dRMDevice3 Ref count %d \n",count);
|
|
if(count==0){
|
|
m__dxj_Direct3dRMDevice3 = NULL;
|
|
}
|
|
}
|
|
if (parent)
|
|
IUNK(parent)->Release();
|
|
if (parent2)
|
|
IUNK(parent2)->Release();
|
|
}
|
|
|
|
|
|
DWORD C_dxj_Direct3dRMDevice3Object::InternalAddRef(){
|
|
DWORD i;
|
|
i=CComObjectRoot::InternalAddRef();
|
|
DPF2(1,"Direct3dRMDevice3[%d] AddRef %d \n",creationid,i);
|
|
return i;
|
|
}
|
|
|
|
DWORD C_dxj_Direct3dRMDevice3Object::InternalRelease(){
|
|
DWORD i;
|
|
i=CComObjectRoot::InternalRelease();
|
|
DPF2(1,"Direct3dRMDevice3 [%d] Release %d \n",creationid,i);
|
|
return i;
|
|
}
|
|
|
|
|
|
|
|
GETSET_OBJECT(_dxj_Direct3dRMDevice3);
|
|
|
|
CLONE_R(_dxj_Direct3dRMDevice3,Direct3DRMDevice3);
|
|
SETNAME_R(_dxj_Direct3dRMDevice3);
|
|
GETNAME_R(_dxj_Direct3dRMDevice3);
|
|
GETCLASSNAME_R(_dxj_Direct3dRMDevice3);
|
|
ADDDESTROYCALLBACK_R(_dxj_Direct3dRMDevice3);
|
|
DELETEDESTROYCALLBACK_R(_dxj_Direct3dRMDevice3);
|
|
|
|
//CLONETO_RX(_dxj_Direct3dRMDevice3, WinDevice, IID_IDirect3DRMWinDevice);
|
|
|
|
PASS_THROUGH_R(_dxj_Direct3dRMDevice3, update, Update)
|
|
PASS_THROUGH1_R(_dxj_Direct3dRMDevice3, setDither, SetDither, long)
|
|
PASS_THROUGH1_R(_dxj_Direct3dRMDevice3, setShades, SetShades, int)
|
|
PASS_THROUGH_CAST_1_R(_dxj_Direct3dRMDevice3, setAppData, SetAppData, long,(DWORD));
|
|
PASS_THROUGH_CAST_1_R(_dxj_Direct3dRMDevice3, setBufferCount, SetBufferCount,long,(DWORD));
|
|
//PASS_THROUGH_CAST_2_R(_dxj_Direct3dRMDevice3, init, Init, long,(DWORD),long,(DWORD));
|
|
PASS_THROUGH_CAST_1_R(_dxj_Direct3dRMDevice3, setQuality, SetQuality, d3drmRenderQuality, (enum D3DRMRENDERQUALITY));
|
|
PASS_THROUGH_CAST_1_R(_dxj_Direct3dRMDevice3, setTextureQuality, SetTextureQuality, d3drmTextureQuality, (enum _D3DRMTEXTUREQUALITY));
|
|
PASS_THROUGH_CAST_1_R(_dxj_Direct3dRMDevice3, setRenderMode, SetRenderMode,long,(DWORD));
|
|
|
|
GET_DIRECT_R(_dxj_Direct3dRMDevice3, getHeight, GetHeight, int)
|
|
GET_DIRECT_R(_dxj_Direct3dRMDevice3, getWidth, GetWidth, int)
|
|
GET_DIRECT_R(_dxj_Direct3dRMDevice3, getDither, GetDither, long);
|
|
GET_DIRECT_R(_dxj_Direct3dRMDevice3, getShades, GetShades, long);
|
|
GET_DIRECT_R(_dxj_Direct3dRMDevice3, getQuality, GetQuality,long);
|
|
GET_DIRECT_R(_dxj_Direct3dRMDevice3, getAppData, GetAppData,long);
|
|
GET_DIRECT_R(_dxj_Direct3dRMDevice3, getColorModel, GetColorModel, d3dColorModel);
|
|
GET_DIRECT_R(_dxj_Direct3dRMDevice3, getBufferCount, GetBufferCount, long);
|
|
GET_DIRECT_R(_dxj_Direct3dRMDevice3, getTextureQuality, GetTextureQuality, d3drmTextureQuality);
|
|
GET_DIRECT_R(_dxj_Direct3dRMDevice3, getTrianglesDrawn, GetTrianglesDrawn, long);
|
|
GET_DIRECT_R(_dxj_Direct3dRMDevice3, getWireframeOptions, GetWireframeOptions, long);
|
|
GET_DIRECT_R(_dxj_Direct3dRMDevice3, getRenderMode, GetRenderMode, long);
|
|
|
|
|
|
RETURN_NEW_ITEM_R(_dxj_Direct3dRMDevice3, getViewports, GetViewports, _dxj_Direct3dRMViewportArray);
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMDevice3Object::addUpdateCallback( I_dxj_Direct3dRMDeviceUpdateCallback3 *devC, IUnknown *args)
|
|
{
|
|
// killed by companion DeleteUpdate
|
|
DeviceUpdateCallback3 *ucb;
|
|
|
|
ucb = (DeviceUpdateCallback3*)AddCallbackLink(
|
|
(void**)&DeviceUpdateCallbacks3, (I_dxj_Direct3dRMCallback*)devC, (void*) args);
|
|
if( !ucb ) {
|
|
DPF(1,"AddUpdateCallback failed!\r\n");
|
|
return E_FAIL;
|
|
}
|
|
if( FAILED(m__dxj_Direct3dRMDevice3->AddUpdateCallback((D3DRMDEVICE3UPDATECALLBACK)myAddUpdateCallback3, ucb)) )
|
|
return E_FAIL;
|
|
|
|
devC->AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMDevice3Object::deleteUpdateCallback( I_dxj_Direct3dRMDeviceUpdateCallback3 *devC, IUnknown *args)
|
|
{
|
|
DeviceUpdateCallback3 *ucb = DeviceUpdateCallbacks3;
|
|
|
|
// look for our own specific entry
|
|
for ( ; ucb; ucb = ucb->next ) {
|
|
|
|
if( (ucb->c == devC) && (ucb->pUser == args) ) {
|
|
|
|
//note: assume the callback is not called: only removed from a list.
|
|
m__dxj_Direct3dRMDevice3->DeleteUpdateCallback(
|
|
(D3DRMDEVICE3UPDATECALLBACK)myAddUpdateCallback3, ucb);
|
|
|
|
// Remove ourselves in a thread-safe manner.
|
|
UndoCallbackLink((GeneralCallback*)ucb,
|
|
(GeneralCallback**)&DeviceUpdateCallbacks3);
|
|
devC->Release();
|
|
return S_OK;
|
|
}
|
|
}
|
|
return E_FAIL;
|
|
}
|
|
|
|
#if 0
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMDevice3Object::getDirect3dRMWinDevice( I_dxj_Direct3dRMWinDevice __RPC_FAR *__RPC_FAR *retv)
|
|
{
|
|
HRESULT hr;
|
|
LPDIRECT3DRMWINDEVICE pWinDev=NULL;
|
|
hr=m__dxj_Direct3dRMDevice3->QueryInterface(IID_IDirect3DRMWinDevice,(void**)&pWinDev);
|
|
if FAILED(hr) return hr;
|
|
INTERNAL_CREATE(_dxj_Direct3dRMWinDevice,pWinDev,retv);
|
|
return hr;
|
|
}
|
|
|
|
#endif
|
|
|
|
#if 0
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMDevice3Object::getDirect3DDevice3( I_dxj_Direct3dDevice3 __RPC_FAR *__RPC_FAR *retv)
|
|
{
|
|
HRESULT hr;
|
|
LPDIRECT3DDEVICE2 pDev2=NULL;
|
|
LPDIRECT3DDEVICE3 pDev3=NULL;
|
|
hr=m__dxj_Direct3dRMDevice3->GetDirect3DDevice2(&pDev2);
|
|
|
|
if FAILED(hr) return hr;
|
|
if (!retv) return E_INVALIDARG;
|
|
*retv=NULL;
|
|
|
|
if (!pDev2) return S_OK;
|
|
|
|
hr=pDev2->QueryInterface(IID_IDirect3DDevice3,(void**)&pDev3);
|
|
pDev2->Release();
|
|
if FAILED(hr) return hr;
|
|
|
|
INTERNAL_CREATE(_dxj_Direct3dDevice3,pDev3,retv);
|
|
return hr;
|
|
}
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMDevice3Object::findPreferredTextureFormat(
|
|
/* [in] */ long bitDepth,
|
|
/* [in] */ long flags,
|
|
/* [out][in] */ DDPixelFormat __RPC_FAR *ddpf)
|
|
{
|
|
HRESULT hr;
|
|
|
|
DDPIXELFORMAT realDDPF;
|
|
realDDPF.dwSize=sizeof(DDPIXELFORMAT);
|
|
|
|
hr=m__dxj_Direct3dRMDevice3->FindPreferredTextureFormat((DWORD)bitDepth,(DWORD) flags,&realDDPF);
|
|
if FAILED(hr) return hr;
|
|
|
|
hr=CopyOutDDPixelFormat(ddpf,&realDDPF);
|
|
if FAILED(hr) return hr;
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//PASS_THROUGH_CAST_1_R(C_dxj_Direct3dRMDevice3Object, handleActivate, HandleActivate, int, (unsigned short))
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
|
|
|
|
STDMETHODIMP C_dxj_Direct3dRMDevice3Object::handlePaint(long hdcThing)
|
|
{
|
|
LPDIRECT3DRMWINDEVICE pWinDevice=NULL;
|
|
HRESULT hr;
|
|
|
|
hr=m__dxj_Direct3dRMDevice3->QueryInterface(IID_IDirect3DRMWinDevice,(void**)&pWinDevice);
|
|
if FAILED(hr) return hr;
|
|
|
|
hr=pWinDevice->HandlePaint((HDC)hdcThing);
|
|
|
|
pWinDevice->Release();
|
|
return hr;
|
|
|
|
|
|
}
|
|
|
|
STDMETHODIMP C_dxj_Direct3dRMDevice3Object::handleActivate(long wParam)
|
|
{
|
|
LPDIRECT3DRMWINDEVICE pWinDevice=NULL;
|
|
HRESULT hr;
|
|
|
|
hr=m__dxj_Direct3dRMDevice3->QueryInterface(IID_IDirect3DRMWinDevice,(void**)&pWinDevice);
|
|
if FAILED(hr) return hr;
|
|
|
|
hr=pWinDevice->HandleActivate((WORD)wParam);
|
|
|
|
pWinDevice->Release();
|
|
return hr;
|
|
|
|
|
|
}
|