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.
1000 lines
32 KiB
1000 lines
32 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1998 - 1999
|
|
//
|
|
// File: d3drmframe3obj.cpp
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
// d3drmFrameObj.cpp : Implementation of CDirectApp and DLL registration.
|
|
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "Direct.h"
|
|
#include "dms.h"
|
|
#include "d3drmArrayObj.h"
|
|
#include "d3drmFrame3Obj.h"
|
|
#include "d3drmFrameArrayObj.h"
|
|
#include "d3drmLightObj.h"
|
|
#include "d3drmLightArrayObj.h"
|
|
#include "d3drmTexture3Obj.h"
|
|
#include "d3drmVisualObj.h"
|
|
#include "d3drmVisualArrayObj.h"
|
|
#include "d3drmMeshObj.h"
|
|
#include "d3drmMeshBuilder3Obj.h"
|
|
#include "d3drmMaterial2Obj.h"
|
|
#include "ddSurface7Obj.h"
|
|
#include "d3drmShadow2Obj.h"
|
|
#include "d3drmUserVisualObj.h"
|
|
#include "d3drmObjectObj.h"
|
|
|
|
|
|
extern HRESULT FrameToXFile(LPDIRECT3DRMFRAME3 pFrame,
|
|
LPCSTR filename,
|
|
D3DRMXOFFORMAT d3dFormat,
|
|
D3DRMSAVEOPTIONS d3dSaveFlags);
|
|
extern HRESULT BSTRtoGUID(LPGUID pGuid,BSTR bstr);
|
|
|
|
C_dxj_Direct3dRMFrame3Object::C_dxj_Direct3dRMFrame3Object(){
|
|
m__dxj_Direct3dRMFrame3=NULL;
|
|
parent=NULL;
|
|
pinterface=NULL;
|
|
creationid = ++g_creationcount;
|
|
|
|
DPF1(1,"Constructor Creation Direct3dRMFrame3[%d] \n ",g_creationcount);
|
|
|
|
nextobj = g_dxj_Direct3dRMFrame3;
|
|
g_dxj_Direct3dRMFrame3 = (void *)this;
|
|
}
|
|
|
|
|
|
C_dxj_Direct3dRMFrame3Object::~C_dxj_Direct3dRMFrame3Object()
|
|
{
|
|
C_dxj_Direct3dRMFrame3Object *prev=NULL;
|
|
for(C_dxj_Direct3dRMFrame3Object *ptr=(C_dxj_Direct3dRMFrame3Object *)g_dxj_Direct3dRMFrame3; ptr; ptr=(C_dxj_Direct3dRMFrame3Object *)ptr->nextobj)
|
|
{
|
|
if(ptr == this)
|
|
{
|
|
if(prev)
|
|
prev->nextobj = ptr->nextobj;
|
|
else
|
|
g_dxj_Direct3dRMFrame3 = (void*)ptr->nextobj;
|
|
break;
|
|
}
|
|
prev = ptr;
|
|
}
|
|
if(m__dxj_Direct3dRMFrame3){
|
|
int count = IUNK(m__dxj_Direct3dRMFrame3)->Release();
|
|
|
|
#ifdef DEBUG
|
|
char buffer[256];
|
|
wsprintf(buffer,"DirectX IDirect3DRMFrame3 Ref count %d \n",count);
|
|
#endif
|
|
|
|
if(count==0) m__dxj_Direct3dRMFrame3 = NULL;
|
|
}
|
|
if(parent) IUNK(parent)->Release();
|
|
}
|
|
|
|
|
|
GETSET_OBJECT(_dxj_Direct3dRMFrame3);
|
|
|
|
CLONE_R(_dxj_Direct3dRMFrame3, Direct3DRMFrame3);
|
|
GETNAME_R(_dxj_Direct3dRMFrame3);
|
|
SETNAME_R(_dxj_Direct3dRMFrame3);
|
|
GETCLASSNAME_R(_dxj_Direct3dRMFrame3);
|
|
ADDDESTROYCALLBACK_R(_dxj_Direct3dRMFrame3);
|
|
DELETEDESTROYCALLBACK_R(_dxj_Direct3dRMFrame3);
|
|
|
|
|
|
|
|
RETURN_NEW_ITEM_R(_dxj_Direct3dRMFrame3, getChildren, GetChildren, _dxj_Direct3dRMFrameArray);
|
|
RETURN_NEW_ITEM_R(_dxj_Direct3dRMFrame3, getLights,GetLights,_dxj_Direct3dRMLightArray);
|
|
|
|
|
|
GET_DIRECT_R(_dxj_Direct3dRMFrame3, getColor, GetColor, d3dcolor);
|
|
GET_DIRECT_R(_dxj_Direct3dRMFrame3, getAppData, GetAppData, long);
|
|
GET_DIRECT_R(_dxj_Direct3dRMFrame3, getMaterialMode, GetMaterialMode, d3drmMaterialMode);
|
|
GET_DIRECT_R(_dxj_Direct3dRMFrame3, getSortMode, GetSortMode, d3drmSortMode);
|
|
GET_DIRECT_R(_dxj_Direct3dRMFrame3, getSceneBackground, GetSceneBackground, d3dcolor);
|
|
GET_DIRECT_R(_dxj_Direct3dRMFrame3, getSceneFogColor, GetSceneFogColor, d3dcolor);
|
|
GET_DIRECT_R(_dxj_Direct3dRMFrame3, getSceneFogEnable, GetSceneFogEnable, long); //BOOL
|
|
GET_DIRECT_R(_dxj_Direct3dRMFrame3, getSceneFogMode, GetSceneFogMode, d3drmFogMode);
|
|
GET_DIRECT_R(_dxj_Direct3dRMFrame3, getZBufferMode, GetZbufferMode, d3drmZbufferMode);
|
|
DO_GETOBJECT_ANDUSEIT_R(_dxj_Direct3dRMFrame3, addLight, AddLight, _dxj_Direct3dRMLight);
|
|
DO_GETOBJECT_ANDUSEIT_R(_dxj_Direct3dRMFrame3, deleteLight, DeleteLight, _dxj_Direct3dRMLight);
|
|
|
|
|
|
PASS_THROUGH1_R(_dxj_Direct3dRMFrame3, setSceneBackground, SetSceneBackground, d3dcolor);
|
|
PASS_THROUGH1_R(_dxj_Direct3dRMFrame3, setSceneFogEnable, SetSceneFogEnable, long); //BOOL
|
|
PASS_THROUGH1_R(_dxj_Direct3dRMFrame3, setSceneFogColor, SetSceneFogColor, d3dcolor);
|
|
PASS_THROUGH1_R(_dxj_Direct3dRMFrame3, setColor, SetColor, d3dcolor);
|
|
PASS_THROUGH_CAST_1_R(_dxj_Direct3dRMFrame3, setAppData, SetAppData, long,(DWORD));
|
|
PASS_THROUGH1_R(_dxj_Direct3dRMFrame3, move, Move, d3dvalue);
|
|
//PASS_THROUGH2_R(_dxj_Direct3dRMFrame3, getTextureTopology, GetTextureTopology, int*, int*);
|
|
//PASS_THROUGH2_R(_dxj_Direct3dRMFrame3, setTextureTopology, SetTextureTopology, int, int);
|
|
PASS_THROUGH3_R(_dxj_Direct3dRMFrame3, getSceneFogParams, GetSceneFogParams, d3dvalue*, d3dvalue*, d3dvalue*);
|
|
PASS_THROUGH3_R(_dxj_Direct3dRMFrame3, setSceneBackgroundRGB, SetSceneBackgroundRGB, d3dvalue, d3dvalue, d3dvalue);
|
|
PASS_THROUGH3_R(_dxj_Direct3dRMFrame3, setSceneFogParams, SetSceneFogParams, d3dvalue,d3dvalue,d3dvalue);
|
|
PASS_THROUGH3_R(_dxj_Direct3dRMFrame3, setColorRGB, SetColorRGB, d3dvalue,d3dvalue,d3dvalue);
|
|
|
|
PASS_THROUGH_CAST_1_R(_dxj_Direct3dRMFrame3, setSceneFogMode, SetSceneFogMode, d3drmFogMode, (D3DRMFOGMODE));
|
|
PASS_THROUGH_CAST_1_R(_dxj_Direct3dRMFrame3, setMaterialMode, SetMaterialMode, d3drmMaterialMode, (enum _D3DRMMATERIALMODE));
|
|
PASS_THROUGH_CAST_1_R(_dxj_Direct3dRMFrame3, setSortMode, SetSortMode, d3drmSortMode,(enum _D3DRMSORTMODE));
|
|
PASS_THROUGH_CAST_1_R(_dxj_Direct3dRMFrame3, setZbufferMode, SetZbufferMode, d3drmZbufferMode, (enum _D3DRMZBUFFERMODE) );
|
|
PASS_THROUGH_CAST_4_R(_dxj_Direct3dRMFrame3, addScale, AddScale, d3drmCombineType, (enum _D3DRMCOMBINETYPE), d3dvalue, (d3dvalue), d3dvalue, (d3dvalue), d3dvalue, (d3dvalue));
|
|
PASS_THROUGH_CAST_4_R(_dxj_Direct3dRMFrame3, addTranslation, AddTranslation, d3drmCombineType, (enum _D3DRMCOMBINETYPE), d3dvalue, (d3dvalue), d3dvalue, (d3dvalue), d3dvalue, (d3dvalue));
|
|
PASS_THROUGH_CAST_5_R(_dxj_Direct3dRMFrame3, addRotation, AddRotation, d3drmCombineType, (enum _D3DRMCOMBINETYPE), d3dvalue, (d3dvalue), d3dvalue, (d3dvalue), d3dvalue, (d3dvalue), d3dvalue, (d3dvalue));
|
|
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::addVisual(I_dxj_Direct3dRMVisual *f){
|
|
IDirect3DRMVisual *vis=NULL;
|
|
IUnknown *unk=NULL;
|
|
HRESULT hr;
|
|
|
|
if (f==NULL) return E_INVALIDARG;
|
|
|
|
((I_dxj_Direct3dRMVisual*)f)->InternalGetObject(&unk);
|
|
if FAILED(unk->QueryInterface(IID_IDirect3DRMVisual,(void**)&vis))
|
|
return E_INVALIDARG;
|
|
|
|
hr= m__dxj_Direct3dRMFrame3->AddVisual(vis);
|
|
|
|
if (vis) vis->Release();
|
|
|
|
return hr;
|
|
|
|
}
|
|
|
|
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::deleteVisual(I_dxj_Direct3dRMVisual *f){
|
|
IDirect3DRMVisual *vis=NULL;
|
|
IUnknown *unk=NULL;
|
|
HRESULT hr;
|
|
|
|
if (f==NULL) return E_INVALIDARG;
|
|
f->InternalGetObject(&unk);
|
|
if FAILED(unk->QueryInterface(IID_IDirect3DRMVisual,(void**)&vis))
|
|
return E_INVALIDARG;
|
|
|
|
hr= m__dxj_Direct3dRMFrame3->DeleteVisual(vis);
|
|
|
|
if (vis) vis->Release ();
|
|
return hr;
|
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getVisuals(I_dxj_Direct3dRMVisualArray **retv)
|
|
{
|
|
LPDIRECT3DRMVISUALARRAY lpv;
|
|
HRESULT hr;
|
|
LPDIRECT3DRMFRAME2 frame2;
|
|
hr=m__dxj_Direct3dRMFrame3->QueryInterface(IID_IDirect3DRMFrame2,(void**)&frame2);
|
|
if FAILED(hr) return hr;
|
|
frame2->GetVisuals(&lpv);
|
|
frame2->Release();
|
|
INTERNAL_CREATE(_dxj_Direct3dRMVisualArray, lpv, retv);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getVelocity(I_dxj_Direct3dRMFrame3 *ref, D3dVector *vel, long flags)
|
|
{
|
|
DO_GETOBJECT_NOTNULL( LPDIRECT3DRMFRAME3, lpf, ref);
|
|
return m__dxj_Direct3dRMFrame3->GetVelocity((LPDIRECT3DRMFRAME3)lpf, (_D3DVECTOR*)vel, (DWORD)flags);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getRotation(I_dxj_Direct3dRMFrame3 *ref,
|
|
D3dVector *axis, d3dvalue *theta)
|
|
{
|
|
DO_GETOBJECT_NOTNULL( LPDIRECT3DRMFRAME3, lpf, ref);
|
|
return m__dxj_Direct3dRMFrame3->GetRotation((LPDIRECT3DRMFRAME3)lpf, (_D3DVECTOR*)axis, (D3DVALUE*)theta);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getPosition(I_dxj_Direct3dRMFrame3 *ref, D3dVector *position)
|
|
{
|
|
|
|
DO_GETOBJECT_NOTNULL( LPDIRECT3DRMFRAME3, lpf, ref);
|
|
return m__dxj_Direct3dRMFrame3->GetPosition((LPDIRECT3DRMFRAME3)lpf, (_D3DVECTOR*)position);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// PASS_THROUGH_CAST_3(_dxj_Direct3dRMFrame, LookAt, I_dxj_Direct3dRMFrame*, (LPDIRECT3DRMFRAME3),
|
|
// I_dxj_Direct3dRMFrame*, (LPDIRECT3DRMFRAME3), d3drmFrameConstraint, (_D3DRMFRAMECONSTRAINT));
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::lookAt(I_dxj_Direct3dRMFrame3 *tgt,
|
|
I_dxj_Direct3dRMFrame3 *ref,d3drmFrameConstraint axis)
|
|
{
|
|
// if(! (tgt && ref) )
|
|
// return E_POINTER;
|
|
|
|
DO_GETOBJECT_NOTNULL( LPDIRECT3DRMFRAME3, lpr, ref);
|
|
DO_GETOBJECT_NOTNULL( LPDIRECT3DRMFRAME3, lpt, tgt);
|
|
|
|
return m__dxj_Direct3dRMFrame3->LookAt((LPDIRECT3DRMFRAME3)lpt,(LPDIRECT3DRMFRAME3) lpr, (enum _D3DRMFRAMECONSTRAINT)axis);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::addTransform(d3drmCombineType typ, SAFEARRAY **ppmat)
|
|
{
|
|
|
|
D3DVALUE rmMatrix[4][4];
|
|
CopyFloats((d3dvalue*)rmMatrix, (float*)((SAFEARRAY*)*ppmat)->pvData, 16 );
|
|
|
|
m__dxj_Direct3dRMFrame3->AddTransform((enum _D3DRMCOMBINETYPE)typ, rmMatrix );
|
|
return S_OK;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getTransform(I_dxj_Direct3dRMFrame3 *ref,SAFEARRAY **ppmat)
|
|
{
|
|
D3DVALUE rmMatrix[4][4]; // Get info to here
|
|
HRESULT hr;
|
|
DO_GETOBJECT_NOTNULL(LPDIRECT3DRMFRAME3,f3,ref);
|
|
hr=m__dxj_Direct3dRMFrame3->GetTransform(f3,rmMatrix);
|
|
if FAILED(hr) return hr;
|
|
|
|
CopyFloats((float*)((SAFEARRAY*)*ppmat)->pvData, (d3dvalue*)rmMatrix, 16 );
|
|
return(S_OK);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::addMoveCallback( I_dxj_Direct3dRMFrameMoveCallback3 *fmC, IUnknown *args, long flags)
|
|
{
|
|
// killed by companion DeleteMove
|
|
FrameMoveCallback3 *fmcb;
|
|
if (!fmC) return E_INVALIDARG;
|
|
|
|
fmcb = (FrameMoveCallback3*)AddCallbackLink(
|
|
(void**)&FrameMoveCallbacks3, (I_dxj_Direct3dRMCallback*)fmC, (void*) args);
|
|
if( !fmcb )
|
|
{
|
|
DPF(1,"Callback AddMove creation failed!\r\n");
|
|
return E_FAIL;
|
|
}
|
|
|
|
fmC->AddRef();
|
|
|
|
return m__dxj_Direct3dRMFrame3->AddMoveCallback(myFrameMoveCallback3, fmcb, (DWORD) flags);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::deleteMoveCallback(I_dxj_Direct3dRMFrameMoveCallback3 *fmC, IUnknown *args)
|
|
{
|
|
DPF(1,"DeleteMoveCallback entered!\r\n");
|
|
|
|
|
|
FrameMoveCallback3 *fmcb = FrameMoveCallbacks3;
|
|
|
|
// look for our own specific entry
|
|
for ( ; fmcb; fmcb = fmcb->next ) {
|
|
|
|
if( (fmcb->c == fmC) && (fmcb->pUser == args) ) {
|
|
|
|
//note: assume the callback is not called: only removed from a list.
|
|
m__dxj_Direct3dRMFrame3->DeleteMoveCallback(myFrameMoveCallback3, fmcb);
|
|
|
|
// Remove ourselves in a thread-safe manner.
|
|
UndoCallbackLink((GeneralCallback*)fmcb,
|
|
(GeneralCallback**)&FrameMoveCallbacks3);
|
|
return S_OK;
|
|
}
|
|
}
|
|
return E_FAIL;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setVelocity( I_dxj_Direct3dRMFrame3 *reference, d3dvalue x, d3dvalue y,
|
|
d3dvalue z, long with_rotation)
|
|
{
|
|
DO_GETOBJECT_NOTNULL( LPDIRECT3DRMFRAME3, lpf, reference);
|
|
|
|
m__dxj_Direct3dRMFrame3->SetVelocity((LPDIRECT3DRMFRAME3)lpf, x, y, z, with_rotation);
|
|
return S_OK;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getOrientation( I_dxj_Direct3dRMFrame3 *reference, D3dVector *dir, D3dVector *up)
|
|
{
|
|
DO_GETOBJECT_NOTNULL( LPDIRECT3DRMFRAME3, lpf, reference);
|
|
|
|
m__dxj_Direct3dRMFrame3->GetOrientation(lpf, (struct _D3DVECTOR *)dir, (struct _D3DVECTOR *)up);
|
|
return S_OK;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::loadFromFile(BSTR filename, VARIANT id,long flags, I_dxj_Direct3dRMLoadTextureCallback3 *callme, IUnknown *useMe)
|
|
{
|
|
D3DRMLOADTEXTURE3CALLBACK d3dtcb = NULL;
|
|
LPVOID pArgs = NULL;
|
|
TextureCallback3 *tcb = NULL;
|
|
HRESULT hr;
|
|
|
|
if( callme )
|
|
{
|
|
tcb = new TextureCallback3;
|
|
|
|
if( tcb )
|
|
{
|
|
tcb->c = callme;
|
|
tcb->pUser = useMe;
|
|
tcb->next = NULL; // TextureCallbacks3;
|
|
tcb->prev = NULL; //(TextureCallback3*)NULL;
|
|
TextureCallbacks3 = tcb;
|
|
|
|
d3dtcb = myLoadTextureCallback3;
|
|
pArgs = (void *)tcb;
|
|
}
|
|
else
|
|
{
|
|
|
|
DPF(1,"Callback object creation failed!\r\n");
|
|
|
|
return E_FAIL;
|
|
}
|
|
}
|
|
|
|
USES_CONVERSION;
|
|
LPSTR pszName = NULL;
|
|
__try { pszName = W2T(filename); /* Now convert to ANSI */ } __except(EXCEPTION_EXECUTE_HANDLER) { return E_FAIL; }
|
|
|
|
|
|
void *args=NULL;
|
|
DWORD pos=0;
|
|
GUID loadGuid;
|
|
VARIANT var;
|
|
VariantInit(&var);
|
|
if ((flags & D3DRMLOAD_BYNAME)||(D3DRMLOAD_FROMURL & flags)) {
|
|
hr=VariantChangeType(&var,&id,0,VT_BSTR);
|
|
if FAILED(hr) return E_INVALIDARG;
|
|
__try { args=(void*)W2T(V_BSTR(&id)); } __except(EXCEPTION_EXECUTE_HANDLER) { return E_FAIL; }
|
|
}
|
|
else if(flags & D3DRMLOAD_BYPOSITION){
|
|
hr=VariantChangeType(&var,&id,0,VT_I4);
|
|
if FAILED(hr) return E_INVALIDARG;
|
|
pos=V_I4(&id);
|
|
args=&pos;
|
|
}
|
|
else if(flags & D3DRMLOAD_BYGUID){
|
|
hr=VariantChangeType(&var,&id,0,VT_BSTR);
|
|
if FAILED(hr) return E_INVALIDARG;
|
|
hr=BSTRtoGUID(&loadGuid,V_BSTR(&id));
|
|
if FAILED(hr) return E_INVALIDARG;
|
|
args=&loadGuid;
|
|
}
|
|
VariantClear(&var);
|
|
|
|
if (flags &D3DRMLOAD_FROMRESOURCE){
|
|
D3DRMLOADRESOURCE res;
|
|
ZeroMemory(&res,sizeof(D3DRMLOADRESOURCE));
|
|
res.lpName=pszName;
|
|
res.lpType="XFILE";
|
|
hr = m__dxj_Direct3dRMFrame3->Load((void *)&res,(DWORD*) args,(DWORD) flags, d3dtcb, pArgs);
|
|
}
|
|
else {
|
|
hr = m__dxj_Direct3dRMFrame3->Load((void *)pszName,(DWORD*) args,(DWORD) flags, d3dtcb, pArgs);
|
|
}
|
|
|
|
|
|
if (tcb)
|
|
{
|
|
delete tcb;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setOrientation( I_dxj_Direct3dRMFrame3 *reference, d3dvalue dx,d3dvalue dy,d3dvalue dz, d3dvalue ux,d3dvalue uy,d3dvalue uz)
|
|
{
|
|
DO_GETOBJECT_NOTNULL( LPDIRECT3DRMFRAME3, f, reference);
|
|
return m__dxj_Direct3dRMFrame3->SetOrientation((LPDIRECT3DRMFRAME3)f, dx, dy, dz, ux, uy, uz);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setPosition(I_dxj_Direct3dRMFrame3 *reference,d3dvalue x,d3dvalue y,d3dvalue z)
|
|
{
|
|
DO_GETOBJECT_NOTNULL( LPDIRECT3DRMFRAME3, f, reference);
|
|
return m__dxj_Direct3dRMFrame3->SetPosition((LPDIRECT3DRMFRAME3)f, x, y, z);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setRotation(I_dxj_Direct3dRMFrame3 *reference,d3dvalue x,d3dvalue y,
|
|
d3dvalue z,d3dvalue theta)
|
|
{
|
|
DO_GETOBJECT_NOTNULL( LPDIRECT3DRMFRAME3, f, reference);
|
|
return m__dxj_Direct3dRMFrame3->SetRotation((LPDIRECT3DRMFRAME3)f, x, y, z, theta);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// remove this frame from the callback list. (After debugging, put this into
|
|
// the destructor macro at the tof).
|
|
//
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::transform(D3dVector* dst, D3dVector* src)
|
|
{
|
|
if(! (dst && src) )
|
|
return E_POINTER;
|
|
|
|
return m__dxj_Direct3dRMFrame3->Transform( (D3DVECTOR *)dst, (D3DVECTOR *)src );
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::inverseTransform(D3dVector* dst, D3dVector* src)
|
|
{
|
|
if(! (dst && src) )
|
|
return E_POINTER;
|
|
|
|
return m__dxj_Direct3dRMFrame3->InverseTransform( (D3DVECTOR *)dst, (D3DVECTOR *)src );
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getParent(I_dxj_Direct3dRMFrame3 **ret)
|
|
{
|
|
HRESULT hr;
|
|
|
|
IDirect3DRMFrame3 *lpFrame3=NULL;
|
|
hr= m__dxj_Direct3dRMFrame3->GetParent(&lpFrame3);
|
|
|
|
*ret=NULL;
|
|
if FAILED(hr) return hr;
|
|
if (lpFrame3==NULL) return S_OK;
|
|
INTERNAL_CREATE(_dxj_Direct3dRMFrame3, lpFrame3, ret);
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getScene(I_dxj_Direct3dRMFrame3 **ret)
|
|
{
|
|
HRESULT hr;
|
|
IDirect3DRMFrame3 *lpFrame3=NULL;
|
|
hr= m__dxj_Direct3dRMFrame3->GetScene(&lpFrame3);
|
|
*ret=NULL;
|
|
if FAILED(hr) return hr;
|
|
if (lpFrame3==NULL) return S_OK;
|
|
|
|
|
|
INTERNAL_CREATE(_dxj_Direct3dRMFrame3, lpFrame3, ret);
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getTexture(I_dxj_Direct3dRMTexture3 **ret)
|
|
{
|
|
HRESULT hr;
|
|
IDirect3DRMTexture *tex=NULL;
|
|
IDirect3DRMTexture3 *lpTex3=NULL;
|
|
hr= m__dxj_Direct3dRMFrame3->GetTexture(&lpTex3);
|
|
*ret=NULL;
|
|
if FAILED(hr) return hr;
|
|
if (lpTex3==NULL) return S_OK;
|
|
|
|
INTERNAL_CREATE(_dxj_Direct3dRMTexture3, lpTex3, ret);
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getSceneBackgroundDepth(I_dxj_DirectDrawSurface7 **ret)
|
|
{
|
|
HRESULT hr;
|
|
IDirectDrawSurface7 *lpSurf7=NULL;
|
|
IDirectDrawSurface *lpSurf=NULL;
|
|
hr= m__dxj_Direct3dRMFrame3->GetSceneBackgroundDepth(&lpSurf);
|
|
*ret=NULL;
|
|
if FAILED(hr) return hr;
|
|
if (lpSurf==NULL) return S_OK;
|
|
|
|
if FAILED(lpSurf->QueryInterface(IID_IDirectDrawSurface7,(void**)&lpSurf7)){
|
|
lpSurf->Release();
|
|
return E_NOINTERFACE;
|
|
}
|
|
INTERNAL_CREATE(_dxj_DirectDrawSurface7, lpSurf7, ret);
|
|
lpSurf->Release();
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setSceneBackgroundDepth(I_dxj_DirectDrawSurface7 *surf)
|
|
{
|
|
HRESULT hr;
|
|
if (!surf) return E_INVALIDARG;
|
|
LPDIRECTDRAWSURFACE s=NULL;
|
|
|
|
//Get our real surface s7 becomes NULL if surf is NULL
|
|
DO_GETOBJECT_NOTNULL( LPDIRECTDRAWSURFACE7, s7, surf);
|
|
if (s7){
|
|
hr=s7->QueryInterface(IID_IDirectDrawSurface,(void**)&s);
|
|
if FAILED(hr) return hr;
|
|
}
|
|
hr= m__dxj_Direct3dRMFrame3->SetSceneBackgroundDepth(s);
|
|
return hr;
|
|
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setSceneBackgroundImage(I_dxj_Direct3dRMTexture3 *tex)
|
|
{
|
|
HRESULT hr;
|
|
DO_GETOBJECT_NOTNULL( LPDIRECT3DRMTEXTURE3, t, tex);
|
|
hr= m__dxj_Direct3dRMFrame3->SetSceneBackgroundImage(t);
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setTexture(I_dxj_Direct3dRMTexture3 *tex)
|
|
{
|
|
HRESULT hr;
|
|
DO_GETOBJECT_NOTNULL(IDirect3DRMTexture3*, t, tex);
|
|
hr= m__dxj_Direct3dRMFrame3->SetTexture(t);
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::addChild(I_dxj_Direct3dRMFrame3 *frame)
|
|
{
|
|
HRESULT hr;
|
|
DO_GETOBJECT_NOTNULL(IDirect3DRMFrame3*, f, frame);
|
|
hr= m__dxj_Direct3dRMFrame3->AddChild(f);
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::deleteChild(I_dxj_Direct3dRMFrame3 *frame)
|
|
{
|
|
HRESULT hr;
|
|
DO_GETOBJECT_NOTNULL(IDirect3DRMFrame3*, f, frame);
|
|
hr= m__dxj_Direct3dRMFrame3->DeleteChild(f);
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getAxes(D3dVector *dir,D3dVector *up)
|
|
{
|
|
HRESULT hr;
|
|
hr= m__dxj_Direct3dRMFrame3->GetAxes((D3DVECTOR*)dir,(D3DVECTOR*)up);
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getBox(D3dRMBox *box)
|
|
{
|
|
HRESULT hr;
|
|
hr= m__dxj_Direct3dRMFrame3->GetBox((D3DRMBOX*)box);
|
|
return S_OK;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getBoxEnable(long *box)
|
|
{
|
|
HRESULT hr=S_OK;
|
|
|
|
*box= m__dxj_Direct3dRMFrame3->GetBoxEnable();
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getHierarchyBox(D3dRMBox *box)
|
|
{
|
|
HRESULT hr;
|
|
hr= m__dxj_Direct3dRMFrame3->GetHierarchyBox((D3DRMBOX*)box);
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getInheritAxes(long *box)
|
|
{
|
|
HRESULT hr=S_OK;
|
|
|
|
*box= m__dxj_Direct3dRMFrame3->GetInheritAxes();
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setAxes(float dx,float dy,float dz, float ux,float uy,float uz)
|
|
{
|
|
HRESULT hr;
|
|
hr= m__dxj_Direct3dRMFrame3->SetAxes(dx,dy,dz,ux,uy,uz);
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setBox(D3dRMBox *box)
|
|
{
|
|
HRESULT hr;
|
|
hr= m__dxj_Direct3dRMFrame3->SetBox((D3DRMBOX*)box);
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setInheritAxes(long bl)
|
|
{
|
|
HRESULT hr;
|
|
hr= m__dxj_Direct3dRMFrame3->SetInheritAxes(bl);
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setBoxEnable(long bl)
|
|
{
|
|
HRESULT hr;
|
|
hr= m__dxj_Direct3dRMFrame3->SetBoxEnable(bl);
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setQuaternion(I_dxj_Direct3dRMFrame3 *refer,D3dRMQuaternion *quat)
|
|
{
|
|
DO_GETOBJECT_NOTNULL(IDirect3DRMFrame3*, f, refer);
|
|
HRESULT hr;
|
|
hr= m__dxj_Direct3dRMFrame3->SetQuaternion(f,(D3DRMQUATERNION*)quat);
|
|
return hr;
|
|
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::rayPick(I_dxj_Direct3dRMFrame3 *refer,D3dRMRay *ray,long flags,I_dxj_Direct3dRMPick2Array **retv)
|
|
{
|
|
DO_GETOBJECT_NOTNULL(IDirect3DRMFrame3*, f, refer);
|
|
LPDIRECT3DRMPICKED2ARRAY lpArray=NULL;
|
|
HRESULT hr;
|
|
hr= m__dxj_Direct3dRMFrame3->RayPick(f,(D3DRMRAY*)ray,(DWORD)flags,&lpArray);
|
|
INTERNAL_CREATE(_dxj_Direct3dRMPick2Array, lpArray, retv);
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::save(BSTR name,long format,long flags)
|
|
{
|
|
//RM FAILED TO IMPLEMENT FRAME SAVE SO
|
|
//IT ALWAYS RETURNS E_NOTIMPL
|
|
//CONGPA PROVIDED A LIBRARY FOR SAVING
|
|
//return E_NOTIMPL;
|
|
|
|
USES_CONVERSION;
|
|
LPSTR pszNam = NULL;
|
|
__try { pszNam = W2T(name); /* Now convert to ANSI */ } __except(EXCEPTION_EXECUTE_HANDLER) { return E_FAIL; }
|
|
HRESULT hr;
|
|
//hr= m__dxj_Direct3dRMFrame3->Save(pszNam,(D3DRMXOFFORMAT)format,(DWORD)flags);
|
|
|
|
hr=FrameToXFile(m__dxj_Direct3dRMFrame3,
|
|
pszNam,
|
|
(D3DRMXOFFORMAT)format,
|
|
(D3DRMSAVEOPTIONS) flags);
|
|
|
|
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setTraversalOptions(long flags)
|
|
{
|
|
HRESULT hr;
|
|
hr= m__dxj_Direct3dRMFrame3->SetTraversalOptions((DWORD)flags);
|
|
return hr;
|
|
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getTraversalOptions(long *flags)
|
|
{
|
|
HRESULT hr;
|
|
hr= m__dxj_Direct3dRMFrame3->GetTraversalOptions((DWORD*)flags);
|
|
return hr;
|
|
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::transformVectors(
|
|
/* [in] */ I_dxj_Direct3dRMFrame3 __RPC_FAR *reference,
|
|
/* [in] */ long num,
|
|
/* [out][in] */ SAFEARRAY __RPC_FAR * __RPC_FAR *DstVectors,
|
|
/* [out][in] */ SAFEARRAY __RPC_FAR * __RPC_FAR *SrcVectors)
|
|
{
|
|
HRESULT hr;
|
|
|
|
DO_GETOBJECT_NOTNULL(LPDIRECT3DRMFRAME3,ref,reference);
|
|
if (!reference) ref=NULL;
|
|
|
|
__try{
|
|
hr= m__dxj_Direct3dRMFrame3->TransformVectors(ref,(DWORD)num,
|
|
(D3DVECTOR*)((SAFEARRAY*)*DstVectors)->pvData,
|
|
(D3DVECTOR*)((SAFEARRAY*)*SrcVectors)->pvData);
|
|
}
|
|
__except(1,1){
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::inverseTransformVectors(
|
|
/* [in] */ I_dxj_Direct3dRMFrame3 __RPC_FAR *reference,
|
|
/* [in] */ long num,
|
|
/* [out][in] */ SAFEARRAY __RPC_FAR * __RPC_FAR *DstVectors,
|
|
/* [out][in] */ SAFEARRAY __RPC_FAR * __RPC_FAR *SrcVectors)
|
|
{
|
|
HRESULT hr;
|
|
|
|
DO_GETOBJECT_NOTNULL(LPDIRECT3DRMFRAME3,ref,reference);
|
|
|
|
__try{
|
|
hr= m__dxj_Direct3dRMFrame3->InverseTransformVectors(ref,(DWORD)num,
|
|
(D3DVECTOR*)((SAFEARRAY*)*DstVectors)->pvData,
|
|
(D3DVECTOR*)((SAFEARRAY*)*SrcVectors)->pvData);
|
|
}
|
|
__except(1,1){
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getMaterial(I_dxj_Direct3dRMMaterial2 **ret)
|
|
{
|
|
HRESULT hr;
|
|
|
|
IDirect3DRMMaterial2 *lpMat2=NULL;
|
|
hr= m__dxj_Direct3dRMFrame3->GetMaterial(&lpMat2);
|
|
*ret=NULL;
|
|
if FAILED(hr) return hr;
|
|
INTERNAL_CREATE(_dxj_Direct3dRMMaterial2, lpMat2, ret);
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setMaterial(I_dxj_Direct3dRMMaterial2 *mat)
|
|
{
|
|
HRESULT hr;
|
|
if (mat==NULL)
|
|
return m__dxj_Direct3dRMFrame3->SetMaterial(NULL);
|
|
|
|
DO_GETOBJECT_NOTNULL(LPDIRECT3DRMMATERIAL2,lpMat2,mat);
|
|
hr= m__dxj_Direct3dRMFrame3->SetMaterial(lpMat2);
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getMaterialOverride(D3dMaterialOverride *override)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (!override) return E_INVALIDARG;
|
|
override->lSize=sizeof(D3DRMMATERIALOVERRIDE);
|
|
|
|
hr= m__dxj_Direct3dRMFrame3->GetMaterialOverride((D3DRMMATERIALOVERRIDE*)override);
|
|
if FAILED(hr) return hr;
|
|
if (((D3DRMMATERIALOVERRIDE*)override)->lpD3DRMTex)
|
|
(((D3DRMMATERIALOVERRIDE*)override)->lpD3DRMTex)->Release();
|
|
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setMaterialOverride(D3dMaterialOverride *override)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (!override) return E_INVALIDARG;
|
|
D3DRMMATERIALOVERRIDE override2;
|
|
ZeroMemory(&override2,sizeof(D3DRMMATERIALOVERRIDE));
|
|
override->lSize=sizeof(D3DRMMATERIALOVERRIDE);
|
|
override2.dwSize=sizeof(D3DRMMATERIALOVERRIDE);
|
|
|
|
hr= m__dxj_Direct3dRMFrame3->GetMaterialOverride(&override2);
|
|
if FAILED(hr) return hr;
|
|
|
|
|
|
((D3DRMMATERIALOVERRIDE*)override)->lpD3DRMTex=override2.lpD3DRMTex;
|
|
hr= m__dxj_Direct3dRMFrame3->SetMaterialOverride((D3DRMMATERIALOVERRIDE*)override);
|
|
if (override2.lpD3DRMTex) override2.lpD3DRMTex->Release();
|
|
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setMaterialOverrideTexture(I_dxj_Direct3dRMTexture3 *tex)
|
|
{
|
|
HRESULT hr;
|
|
|
|
|
|
D3DRMMATERIALOVERRIDE override2;
|
|
ZeroMemory(&override2,sizeof(D3DRMMATERIALOVERRIDE));
|
|
override2.dwSize=sizeof(D3DRMMATERIALOVERRIDE);
|
|
|
|
|
|
hr= m__dxj_Direct3dRMFrame3->GetMaterialOverride(&override2);
|
|
if FAILED(hr) return hr;
|
|
|
|
if (override2.lpD3DRMTex) override2.lpD3DRMTex->Release();
|
|
override2.lpD3DRMTex=NULL;
|
|
|
|
DO_GETOBJECT_NOTNULL(LPDIRECT3DRMTEXTURE3,t,tex);
|
|
|
|
if (!tex) {
|
|
hr= m__dxj_Direct3dRMFrame3->SetMaterialOverride(&override2);
|
|
}
|
|
else {
|
|
|
|
override2.lpD3DRMTex=t;
|
|
override2.lpD3DRMTex->AddRef();
|
|
hr= m__dxj_Direct3dRMFrame3->SetMaterialOverride(&override2);
|
|
override2.lpD3DRMTex->Release();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getMaterialOverrideTexture(I_dxj_Direct3dRMTexture3 **tex)
|
|
{
|
|
HRESULT hr;
|
|
|
|
|
|
D3DRMMATERIALOVERRIDE override2;
|
|
ZeroMemory(&override2,sizeof(D3DRMMATERIALOVERRIDE));
|
|
override2.dwSize=sizeof(D3DRMMATERIALOVERRIDE);
|
|
|
|
|
|
hr= m__dxj_Direct3dRMFrame3->GetMaterialOverride(&override2);
|
|
if FAILED(hr) return hr;
|
|
|
|
if (override2.lpD3DRMTex){
|
|
INTERNAL_CREATE(_dxj_Direct3dRMTexture3,override2.lpD3DRMTex,tex);
|
|
return hr;
|
|
}
|
|
|
|
*tex=NULL;
|
|
return S_OK;;
|
|
}
|
|
|
|
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getVisual(long index,I_dxj_Direct3dRMVisual **ret)
|
|
{
|
|
HRESULT hr;
|
|
DWORD count=0;
|
|
IUnknown **ppUnk=NULL;
|
|
IDirect3DRMVisual *vis=NULL;
|
|
|
|
*ret=NULL;
|
|
|
|
hr=m__dxj_Direct3dRMFrame3->GetVisuals(&count,NULL);
|
|
if FAILED(hr) return hr;
|
|
|
|
if (count==0) return E_INVALIDARG;
|
|
|
|
ppUnk=(IUnknown**)malloc(sizeof(IUnknown*)*count);
|
|
if (!ppUnk) return E_OUTOFMEMORY;
|
|
|
|
hr=m__dxj_Direct3dRMFrame3->GetVisuals(&count,ppUnk);
|
|
if FAILED(hr) goto exitOut;
|
|
|
|
hr= ppUnk[index]->QueryInterface(IID_IDirect3DRMVisual,(void**)&vis);
|
|
if FAILED(hr) goto exitOut;
|
|
|
|
hr=CreateCoverVisual(vis,ret);
|
|
if FAILED(hr) goto exitOut;
|
|
|
|
|
|
exitOut:
|
|
|
|
for (DWORD i=0;i<count;i++){
|
|
if (ppUnk[index]) ppUnk[index]->Release();
|
|
}
|
|
|
|
free(ppUnk);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getVisualCount (long *count)
|
|
{
|
|
|
|
HRESULT hr=m__dxj_Direct3dRMFrame3->GetVisuals((DWORD*)count,NULL);
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::setSceneFogMethod (long meth)
|
|
{
|
|
|
|
HRESULT hr=m__dxj_Direct3dRMFrame3->SetSceneFogMethod(meth);
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP C_dxj_Direct3dRMFrame3Object::getSceneFogMethod (long *meth)
|
|
{
|
|
|
|
HRESULT hr=m__dxj_Direct3dRMFrame3->GetSceneFogMethod((DWORD*)meth);
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
extern "C" void __cdecl myFrameMoveCallback3( LPDIRECT3DRMFRAME3 lpf, void *lpArg, D3DVALUE delta)
|
|
{
|
|
|
|
DPF(1,"Entered myFrameMoveCallback3\r\n");
|
|
|
|
|
|
FrameMoveCallback3 *fmcb = (FrameMoveCallback3 *)lpArg;
|
|
|
|
// note: need to get OUR frame object from the direct frame object, if
|
|
// one exists. If not, we have a crisis!
|
|
for( C_dxj_Direct3dRMFrame3Object *that = (C_dxj_Direct3dRMFrame3Object *)g_dxj_Direct3dRMFrame3; that ; that = (C_dxj_Direct3dRMFrame3Object *)that->nextobj )
|
|
{
|
|
DO_GETOBJECT_NOTNULL(LPDIRECT3DRMFRAME3, f, that)
|
|
if( f == lpf )
|
|
{
|
|
if (fmcb->pUser) fmcb->pUser->AddRef();
|
|
|
|
IUNK(that)->AddRef();
|
|
|
|
fmcb->c->callbackRMFrameMove(that,fmcb->pUser, delta);
|
|
|
|
IUNK(that)->Release();
|
|
|
|
if (fmcb->pUser) fmcb->pUser->Release();
|
|
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
//
|
|
// I didn't create this frame, create a new one
|
|
//
|
|
C_dxj_Direct3dRMFrame3Object *c=new CComObject<C_dxj_Direct3dRMFrame3Object>;
|
|
I_dxj_Direct3dRMFrame3 *Iframe=NULL;
|
|
if( c == NULL )
|
|
{
|
|
lpf->Release();
|
|
return;
|
|
}
|
|
c->InternalSetObject((LPDIRECT3DRMFRAME3)lpf);
|
|
|
|
if ( fmcb->pParent )
|
|
{
|
|
c->parent = fmcb->pParent;
|
|
fmcb->pParent->AddRef();
|
|
}
|
|
if (FAILED(((I_dxj_Direct3dRMFrame3*)c)->QueryInterface(IID_I_dxj_Direct3dRMFrame3, (void **)&Iframe)))
|
|
{
|
|
delete c;
|
|
return;
|
|
}
|
|
|
|
c->pinterface = Iframe;
|
|
|
|
if (fmcb->pUser) fmcb->pUser->AddRef();
|
|
|
|
IUNK(Iframe)->AddRef();
|
|
|
|
fmcb->c->callbackRMFrameMove(Iframe, fmcb->pUser, delta);
|
|
|
|
IUNK(Iframe)->Release();
|
|
|
|
if (fmcb->pUser) fmcb->pUser->Release();
|
|
|
|
|
|
}
|