Leaked source code of windows server 2003
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.

798 lines
24 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. //
  5. // Copyright (C) Microsoft Corporation, 1998 - 1999
  6. //
  7. // File: d3drm3obj.cpp
  8. //
  9. //--------------------------------------------------------------------------
  10. // d3drmObj.cpp : Implementation of CDirectApp and DLL registration.
  11. #include "stdafx.h"
  12. #include "Direct.h"
  13. #include "dms.h"
  14. #include "d3drm3Obj.h"
  15. #include "d3drmDeviceArrayObj.h"
  16. #include "d3drmLightObj.h"
  17. #include "d3drmMeshObj.h"
  18. #include "d3drmWrapObj.h"
  19. #include "d3drmVisualObj.h"
  20. #include "d3drmUserVisualObj.h"
  21. #include "d3drmClippedVisualObj.h"
  22. #include "d3drmDevice3Obj.h"
  23. #include "d3drmFrame3Obj.h"
  24. #include "d3drmMeshBuilder3Obj.h"
  25. #include "d3drmMaterial2Obj.h"
  26. #include "d3drmTexture3Obj.h"
  27. #include "d3drmViewport2Obj.h"
  28. #include "d3drmAnimationSet2Obj.h"
  29. #include "d3drmFace2Obj.h"
  30. #include "d3drmAnimation2Obj.h"
  31. #include "d3drmShadow2Obj.h"
  32. #include "d3drmProgressiveMeshObj.h"
  33. #include "d3drmFrameInterObj.h"
  34. #include "d3drmLightInterObj.h"
  35. #include "d3drmViewportInterObj.h"
  36. #include "d3drmTextureInterObj.h"
  37. #include "d3drmMaterialInterObj.h"
  38. #include "d3drmMeshInterObj.h"
  39. #include "ddSurface7Obj.h"
  40. extern void *g_dxj_Direct3dRMMeshInterpolator;
  41. extern void *g_dxj_Direct3dRMViewportInterpolator;
  42. extern void *g_dxj_Direct3dRMLightInterpolator;
  43. extern void *g_dxj_Direct3dRMFrameInterpolator;
  44. extern void *g_dxj_Direct3dRMMaterialInterpolator;
  45. extern void *g_dxj_Direct3dRMTextureInterpolator;
  46. extern HRESULT BSTRtoGUID(LPGUID,BSTR);
  47. #define DO_GETOBJECT_NOTNULL_VISUAL_ADDREF(v,i) LPDIRECT3DRMVISUAL v=NULL; \
  48. { IUnknown *pIUnk=NULL; \
  49. if(i) i->InternalGetObject((IUnknown **)&pIUnk); \
  50. if (pIUnk) pIUnk->QueryInterface(IID_IDirect3DRMVisual,(void**)&v); \
  51. }
  52. extern BOOL is4Bit;
  53. extern HRESULT BSTRtoPPGUID(LPGUID*,BSTR);
  54. extern HRESULT BSTRtoGUID(LPGUID,BSTR);
  55. extern HRESULT D3DBSTRtoGUID(LPGUID,BSTR);
  56. C_dxj_Direct3dRM3Object::C_dxj_Direct3dRM3Object(){
  57. m__dxj_Direct3dRM3=NULL;
  58. parent=NULL;
  59. pinterface=NULL;
  60. creationid = ++g_creationcount;
  61. DPF1(1,"Constructor Creation Direct3dRM2[%d] \n ",g_creationcount);
  62. nextobj = g_dxj_Direct3dRM3;
  63. g_dxj_Direct3dRM3 = (void *)this;
  64. }
  65. C_dxj_Direct3dRM3Object::~C_dxj_Direct3dRM3Object(){
  66. DPF1(1,"Destructor Direct3dRM2 [%d] \n",creationid);
  67. C_dxj_Direct3dRM3Object *prev=NULL;
  68. for(C_dxj_Direct3dRM3Object *ptr=(C_dxj_Direct3dRM3Object *)g_dxj_Direct3dRM3;
  69. ptr;
  70. ptr=(C_dxj_Direct3dRM3Object *)ptr->nextobj)
  71. {
  72. if(ptr == this)
  73. {
  74. if(prev)
  75. prev->nextobj = ptr->nextobj;
  76. else
  77. g_dxj_Direct3dRM3 = (void*)ptr->nextobj;
  78. break;
  79. }
  80. prev = ptr;
  81. }
  82. if(m__dxj_Direct3dRM3){
  83. int count = IUNK(m__dxj_Direct3dRM3)->Release();
  84. DPF1(1,"DirectX real IDirect3dRM2 Ref count [%d] \n",count);
  85. if(count==0){
  86. m__dxj_Direct3dRM3 = NULL;
  87. }
  88. }
  89. if (parent)
  90. IUNK(parent)->Release();
  91. }
  92. #if 0
  93. DWORD C_dxj_Direct3dRM3Object::InternalAddRef(){
  94. DWORD i;
  95. i=CComObjectRoot::InternalAddRef();
  96. DPF1(1,"D3DRM3 [%d] AddRef %d \n",creationid,i);
  97. return i;
  98. }
  99. DWORD C_dxj_Direct3dRM3Object::InternalRelease(){
  100. DWORD i;
  101. i=CComObjectRoot::InternalRelease();
  102. DPF1(1,"D3DRM2 [%d] Release %d \n",creationid,i);
  103. return i;
  104. }
  105. #endif
  106. GETSET_OBJECT(_dxj_Direct3dRM3);
  107. PASS_THROUGH1_R(_dxj_Direct3dRM3, setDefaultTextureColors, SetDefaultTextureColors, long)
  108. PASS_THROUGH1_R(_dxj_Direct3dRM3, setDefaultTextureShades, SetDefaultTextureShades, long)
  109. PASS_THROUGH1_R(_dxj_Direct3dRM3, tick, Tick, d3dvalue);
  110. RETURN_NEW_ITEM_R(_dxj_Direct3dRM3, createAnimationSet, CreateAnimationSet, _dxj_Direct3dRMAnimationSet2) ;
  111. RETURN_NEW_ITEM_R(_dxj_Direct3dRM3, createMesh, CreateMesh, _dxj_Direct3dRMMesh);
  112. RETURN_NEW_ITEM_R(_dxj_Direct3dRM3, createFace, CreateFace, _dxj_Direct3dRMFace2);
  113. //TODO - do we need a new type of device array
  114. RETURN_NEW_ITEM_R(_dxj_Direct3dRM3, createAnimation, CreateAnimation, _dxj_Direct3dRMAnimation2);
  115. RETURN_NEW_ITEM_R(_dxj_Direct3dRM3, createMeshBuilder, CreateMeshBuilder, _dxj_Direct3dRMMeshBuilder3);
  116. RETURN_NEW_ITEM1_R(_dxj_Direct3dRM3,createMaterial,CreateMaterial,_dxj_Direct3dRMMaterial2,d3dvalue);
  117. RETURN_NEW_ITEM_CAST_2_R(_dxj_Direct3dRM3, createLight,CreateLight,_dxj_Direct3dRMLight, d3drmLightType, (enum _D3DRMLIGHTTYPE), d3dcolor, (d3dcolor));
  118. //TOEXPAND
  119. RETURN_NEW_ITEM_R(_dxj_Direct3dRM3, getDevices, GetDevices, _dxj_Direct3dRMDeviceArray);
  120. STDMETHODIMP C_dxj_Direct3dRM3Object::createTextureFromSurface(I_dxj_DirectDrawSurface4 *dds, I_dxj_Direct3dRMTexture3 **retval)
  121. {
  122. HRESULT hretval;
  123. LPDIRECT3DRMTEXTURE3 lpTex;
  124. LPDIRECTDRAWSURFACE lpDDS=NULL;
  125. if ( is4Bit )
  126. return E_FAIL;
  127. if ( dds == NULL )
  128. return E_FAIL;
  129. DO_GETOBJECT_NOTNULL(LPDIRECTDRAWSURFACE4, lpDDS4, dds);
  130. hretval= lpDDS4->QueryInterface(IID_IDirectDrawSurface,(void**)&lpDDS);
  131. if FAILED(hretval) return hretval;
  132. hretval = m__dxj_Direct3dRM3->CreateTextureFromSurface(lpDDS, &lpTex);
  133. if (lpDDS) lpDDS->Release();
  134. if FAILED(hretval) return hretval;
  135. INTERNAL_CREATE(_dxj_Direct3dRMTexture3, lpTex, retval);
  136. return S_OK;
  137. }
  138. #if 0
  139. /////////////////////////////////////////////////////////////////////////////
  140. STDMETHODIMP C_dxj_Direct3dRM3Object::createDeviceFromD3D(I_dxj_Direct3d3 *d3d, I_dxj_Direct3dDevice3* d3dDev, I_dxj_Direct3dRMDevice3 **retval)
  141. {
  142. HRESULT hretval;
  143. LPDIRECT3DRMDEVICE3 lpDev;
  144. LPDIRECT3D2 lpD3D2;
  145. LPDIRECT3DDEVICE2 lpD3DDev2;
  146. if ( is4Bit )
  147. return E_FAIL;
  148. if ( d3d == NULL || d3dDev == NULL )
  149. return E_FAIL;
  150. DO_GETOBJECT_NOTNULL(LPDIRECT3D3, lpD3D3, d3d);
  151. DO_GETOBJECT_NOTNULL(LPDIRECT3DDEVICE3, lpD3DDev3, d3dDev);
  152. hretval=lpD3D3->QueryInterface(IID_IDirect3D2,(void**)&lpD3D2);
  153. if FAILED(hretval) return hretval;
  154. hretval=lpD3DDev3->QueryInterface(IID_IDirect3DDevice2,(void**)&lpD3DDev2);
  155. if FAILED(hretval) return hretval;
  156. hretval = m__dxj_Direct3dRM3->CreateDeviceFromD3D(lpD3D2, lpD3DDev2, &lpDev);
  157. lpD3DDev2->Release();
  158. lpD3D2->Release();
  159. if FAILED(hretval) return hretval;
  160. //we need to parent the dev to the d3ddevice object.
  161. //INTERNAL_CREATE(_dxj_Direct3dRMDevice3, lpDev, retval);
  162. INTERNAL_CREATE_1REFS(_dxj_Direct3dRMDevice3, _dxj_Direct3dDevice3, d3dDev,lpDev, retval);
  163. return S_OK;
  164. }
  165. #endif
  166. /////////////////////////////////////////////////////////////////////////////
  167. STDMETHODIMP C_dxj_Direct3dRM3Object::createDeviceFromSurface(BSTR guid, I_dxj_DirectDraw4 *dd, I_dxj_DirectDrawSurface4 *dds,long flags,I_dxj_Direct3dRMDevice3 **retval)
  168. {
  169. HRESULT hretval;
  170. LPDIRECT3DRMDEVICE3 lpDev=NULL;
  171. LPDIRECTDRAW lpDD=NULL;
  172. LPDIRECTDRAWSURFACE lpDDS=NULL;
  173. GUID g;
  174. LPGUID pg=&g;
  175. #pragma message ("need new device to be parented to the surface?")
  176. ZeroMemory(&g,sizeof(GUID));
  177. if ((!guid)||(guid[0]==0)){
  178. pg=NULL;
  179. }
  180. else {
  181. hretval=D3DBSTRtoGUID(&g,guid);
  182. if FAILED(hretval) return E_INVALIDARG;
  183. }
  184. if ( dd == NULL || dds == NULL )
  185. return E_FAIL;
  186. DO_GETOBJECT_NOTNULL(LPDIRECTDRAW4, lpDD4, dd);
  187. DO_GETOBJECT_NOTNULL(LPDIRECTDRAWSURFACE4, lpDDS4, dds);
  188. if (!lpDD4) return E_INVALIDARG;
  189. if (!lpDDS4) return E_INVALIDARG;
  190. hretval = lpDD4->QueryInterface(IID_IDirectDraw,(void**)&lpDD);
  191. if FAILED(hretval) return hretval;
  192. hretval = lpDDS4->QueryInterface(IID_IDirectDrawSurface,(void**)&lpDDS);
  193. if FAILED(hretval) return hretval;
  194. hretval = m__dxj_Direct3dRM3->CreateDeviceFromSurface( pg, lpDD, lpDDS, (DWORD) flags, &lpDev);
  195. lpDD->Release();
  196. lpDDS->Release();
  197. if FAILED(hretval) return hretval;
  198. INTERNAL_CREATE(_dxj_Direct3dRMDevice3, lpDev, retval);
  199. return S_OK;
  200. }
  201. //////////////////////////////////////////////////////////////////////////
  202. // A call to EnumerateObjects envokes the user's callback for each
  203. // d3drmObject object in the list. In addition all enumerate calls will
  204. // generate their full complement of enumerations. Hence there are 2
  205. // lists: a) the list of objects, b) the list of enumeration calls.
  206. STDMETHODIMP C_dxj_Direct3dRM3Object::enumerateObjects(
  207. I_dxj_Direct3dRMEnumerateObjectsCallback *enumC, IUnknown *args)
  208. {
  209. EnumerateObjectsCallback *enumcb;
  210. if ( is4Bit )
  211. return E_FAIL;
  212. enumcb = (EnumerateObjectsCallback*)AddCallbackLink((void**)&EnumCallbacks,
  213. (I_dxj_Direct3dRMCallback*)enumC, (void*) args);
  214. if( !enumcb ) {
  215. DPF(1,"Callback EnumerateObjects creation failed!\r\n");
  216. return E_FAIL;
  217. }
  218. m__dxj_Direct3dRM3->EnumerateObjects(myEnumerateObjectsCallback, enumcb);
  219. // Remove ourselves in a thread-safe manner.
  220. UndoCallbackLink((GeneralCallback*)enumcb,
  221. (GeneralCallback**)&EnumCallbacks);
  222. return S_OK;
  223. }
  224. //////////////////////////////////////////////////////////////////////////////
  225. STDMETHODIMP C_dxj_Direct3dRM3Object::loadFromFile(BSTR filename, VARIANT id,
  226. SAFEARRAY **psa, long cnt, d3drmLoadFlags options, I_dxj_Direct3dRMLoadCallback *fn1,
  227. IUnknown *arg1, I_dxj_Direct3dRMLoadTextureCallback3 *fn2, IUnknown *arg2, I_dxj_Direct3dRMFrame3 *f)
  228. {
  229. HRESULT hr;
  230. GUID aGuids[100];
  231. int i=0;
  232. ZeroMemory(&(aGuids[0]),sizeof(GUID)*100);
  233. //check args
  234. if (cnt>100) return E_INVALIDARG;
  235. if (cnt<0) return E_INVALIDARG;
  236. if (!ISSAFEARRAY1D(psa,(DWORD)cnt)) return E_FAIL;
  237. for (i =0;i<cnt;i++)
  238. {
  239. hr=BSTRtoGUID(&(aGuids[i]),((BSTR*)((SAFEARRAY *)*psa)->pvData)[i]);
  240. if FAILED(hr) return hr;
  241. }
  242. TextureCallback3 *tcb = NULL;
  243. LoadCallback *lcb = NULL;
  244. if ( is4Bit )
  245. return E_FAIL;
  246. D3DRMLOADTEXTURE3CALLBACK d3dtcb = NULL;
  247. D3DRMLOADCALLBACK d3dlcb = NULL;
  248. LPVOID pArgs1 = NULL;
  249. LPVOID pArgs2 = NULL;
  250. if (arg1) arg1->AddRef();
  251. if (arg2) arg2->AddRef();
  252. if( fn2 ) {
  253. if ((tcb = (TextureCallback3*)AddCallbackLink((void**)&TextureCallbacks3,
  254. (I_dxj_Direct3dRMCallback*)fn2, (void*) arg2)) == NULL) {
  255. DPF(1,"Callback object creation failed!\r\n");
  256. if (arg1) arg1->Release();
  257. if (arg2) arg2->Release();
  258. return E_FAIL;
  259. }
  260. d3dtcb = myLoadTextureCallback3;
  261. pArgs1 = (void *)tcb;
  262. }
  263. if( fn1 ) {
  264. if ((lcb = (LoadCallback*)AddCallbackLink((void**)&LoadCallbacks,
  265. (I_dxj_Direct3dRMCallback*)fn1, (void*) arg1)) == NULL) {
  266. DPF(1,"Callback object creation failed!\r\n");
  267. if (arg1) arg1->Release();
  268. if (arg2) arg2->Release();
  269. return E_FAIL;
  270. }
  271. d3dlcb = myd3drmLoadCallback;
  272. pArgs2 = (void *)lcb;
  273. }
  274. USES_CONVERSION;
  275. LPSTR pszNam = NULL;
  276. __try { pszNam = W2T(filename); /* Now convert to ANSI */ } __except(EXCEPTION_EXECUTE_HANDLER) { return E_FAIL; }
  277. LPDIRECT3DRMFRAME3 lpff = NULL;
  278. if(f)
  279. {
  280. DO_GETOBJECT_NOTNULL(LPDIRECT3DRMFRAME3, lpF, f);
  281. lpff = lpF;
  282. }
  283. void *args=NULL;
  284. DWORD pos=0;
  285. GUID loadGuid;
  286. VARIANT var;
  287. VariantInit(&var);
  288. if ((options & D3DRMLOAD_BYNAME)||(D3DRMLOAD_FROMURL & options)) {
  289. hr=VariantChangeType(&var,&id,0,VT_BSTR);
  290. if FAILED(hr) return E_INVALIDARG;
  291. __try { args=(void*)W2T(V_BSTR(&id)); } __except(EXCEPTION_EXECUTE_HANDLER) { return E_FAIL; }
  292. }
  293. else if(options & D3DRMLOAD_BYPOSITION){
  294. hr=VariantChangeType(&var,&id,0,VT_I4);
  295. if FAILED(hr) return E_INVALIDARG;
  296. pos=V_I4(&id);
  297. args=&pos;
  298. }
  299. else if(options & D3DRMLOAD_BYGUID){
  300. hr=VariantChangeType(&var,&id,0,VT_BSTR);
  301. if FAILED(hr) return E_INVALIDARG;
  302. hr=BSTRtoGUID(&loadGuid,V_BSTR(&id));
  303. if FAILED(hr) return E_INVALIDARG;
  304. args=&loadGuid;
  305. }
  306. VariantClear(&var);
  307. if (options &D3DRMLOAD_FROMRESOURCE){
  308. D3DRMLOADRESOURCE res;
  309. ZeroMemory(&res,sizeof(D3DRMLOADRESOURCE));
  310. res.lpName=pszNam;
  311. res.lpType="XFILE";
  312. hr = m__dxj_Direct3dRM3->Load(&res,(void*) args, (LPGUID*)aGuids, (DWORD)cnt, (DWORD)options,
  313. d3dlcb, pArgs2, d3dtcb, pArgs1, lpff);
  314. }
  315. else {
  316. hr = m__dxj_Direct3dRM3->Load(pszNam,(void*) args, (LPGUID*)aGuids, (DWORD)cnt, (DWORD)options,
  317. d3dlcb, pArgs2, d3dtcb, pArgs1, lpff);
  318. }
  319. // Remove ourselves in a thread-safe manner.
  320. if (tcb) UndoCallbackLink((GeneralCallback*)tcb, (GeneralCallback**)&TextureCallbacks3);
  321. if (lcb) UndoCallbackLink((GeneralCallback*)lcb, (GeneralCallback**)&LoadCallbacks);
  322. if (arg1) arg1->Release();
  323. if (arg2) arg2->Release();
  324. return hr;
  325. }
  326. /////////////////////////////////////////////////////////////////////////////
  327. STDMETHODIMP C_dxj_Direct3dRM3Object::getSearchPath(BSTR *Name)
  328. {
  329. DWORD cnt = 0;
  330. if ( is4Bit )
  331. return E_FAIL;
  332. if((m__dxj_Direct3dRM3->GetSearchPath(&cnt,(char*)NULL)) != D3DRM_OK) // size
  333. return E_FAIL;
  334. LPSTR str = NULL;
  335. __try { str = (LPSTR)alloca(cnt); /* Now convert to ANSI */ } __except(EXCEPTION_EXECUTE_HANDLER) { return E_FAIL; }
  336. if((m__dxj_Direct3dRM3->GetSearchPath(&cnt, str)) != D3DRM_OK) return E_FAIL;
  337. PassBackUnicode(str, Name, cnt);
  338. return D3DRM_OK;
  339. }
  340. /////////////////////////////////////////////////////////////////////////////
  341. STDMETHODIMP C_dxj_Direct3dRM3Object::getNamedObject(BSTR Name, I_dxj_Direct3dRMObject **f)
  342. {
  343. LPDIRECT3DRMOBJECT lp; // DirectX object pointer
  344. HRESULT hr;
  345. if (!f) return E_INVALIDARG;
  346. *f=NULL;
  347. USES_CONVERSION;
  348. LPSTR pszName = NULL;
  349. __try { pszName = W2T(Name); /* Now convert to ANSI */ } __except(EXCEPTION_EXECUTE_HANDLER) { return E_FAIL; }
  350. hr=m__dxj_Direct3dRM3->GetNamedObject(pszName,&lp);
  351. if FAILED(hr) return hr;
  352. if (lp==NULL) return S_OK;
  353. hr=CreateCoverObject(lp,f);
  354. return hr;
  355. }
  356. /////////////////////////////////////////////////////////////////////////////
  357. STDMETHODIMP C_dxj_Direct3dRM3Object::setSearchPath(BSTR Name)
  358. {
  359. USES_CONVERSION;
  360. LPSTR pszName = NULL;
  361. __try { pszName = W2T(Name); /* Now convert to ANSI */ } __except(EXCEPTION_EXECUTE_HANDLER) { return E_FAIL; }
  362. if((m__dxj_Direct3dRM3->SetSearchPath(pszName)) != D3DRM_OK) return E_FAIL;
  363. return D3DRM_OK;
  364. }
  365. /////////////////////////////////////////////////////////////////////////////
  366. STDMETHODIMP C_dxj_Direct3dRM3Object::addSearchPath(BSTR Name)
  367. {
  368. USES_CONVERSION;
  369. LPSTR pszName = NULL;
  370. __try { pszName = W2T(Name); /* Now convert to ANSI */ } __except(EXCEPTION_EXECUTE_HANDLER) { return E_FAIL; }
  371. if((m__dxj_Direct3dRM3->AddSearchPath(pszName)) != D3DRM_OK) return E_FAIL;
  372. return D3DRM_OK;
  373. }
  374. /////////////////////////////////////////////////////////////////////////////
  375. STDMETHODIMP C_dxj_Direct3dRM3Object::createWrap(d3drmWrapType type, I_dxj_Direct3dRMFrame3 *fr,
  376. d3dvalue ox, d3dvalue oy, d3dvalue oz,
  377. d3dvalue dx, d3dvalue dy, d3dvalue dz,
  378. d3dvalue ux, d3dvalue uy, d3dvalue uz,
  379. d3dvalue ou, d3dvalue ov,
  380. d3dvalue su, d3dvalue sv,I_dxj_Direct3dRMWrap **retv)
  381. {
  382. LPDIRECT3DRMWRAP lp;
  383. if ( is4Bit )
  384. return E_FAIL;
  385. DO_GETOBJECT_NOTNULL(LPDIRECT3DRMFRAME3, lpF, fr);
  386. if ((m__dxj_Direct3dRM3->CreateWrap((enum _D3DRMWRAPTYPE)type, lpF, ox, oy, oz,
  387. dx, dy, dz, ux, uy, uz,ou, ov, su, sv, &lp)) != S_OK)
  388. {
  389. *retv = NULL;
  390. return E_FAIL;
  391. }
  392. INTERNAL_CREATE(_dxj_Direct3dRMWrap, lp, retv);
  393. return S_OK;
  394. }
  395. /////////////////////////////////////////////////////////////////////////////
  396. STDMETHODIMP C_dxj_Direct3dRM3Object::createShadow(I_dxj_Direct3dRMVisual *visual,
  397. I_dxj_Direct3dRMLight *light,
  398. d3dvalue px, d3dvalue py, d3dvalue pz,
  399. d3dvalue nx, d3dvalue ny, d3dvalue nz,
  400. I_dxj_Direct3dRMShadow2 **retv)
  401. {
  402. LPDIRECT3DRMSHADOW2 lp;
  403. HRESULT hr;
  404. DO_GETOBJECT_NOTNULL_VISUAL_ADDREF(lpV, visual);
  405. DO_GETOBJECT_NOTNULL(LPDIRECT3DRMLIGHT, lpL, light);
  406. hr=m__dxj_Direct3dRM3->CreateShadow(lpV, lpL,
  407. px, py, pz, nx, ny, nz,&lp);
  408. if (lpV) IUNK(lpV)->Release();
  409. if (FAILED(hr))
  410. {
  411. *retv = NULL;
  412. return hr;
  413. }
  414. INTERNAL_CREATE(_dxj_Direct3dRMShadow2, lp, retv);
  415. return hr;
  416. }
  417. /////////////////////////////////////////////////////////////////////////////
  418. STDMETHODIMP C_dxj_Direct3dRM3Object::createViewport(I_dxj_Direct3dRMDevice3 *dev, I_dxj_Direct3dRMFrame3 *fr,
  419. long l,long t,long w,long h,I_dxj_Direct3dRMViewport2 **retval)
  420. {
  421. LPDIRECT3DRMVIEWPORT2 lp;
  422. HRESULT hr;
  423. DO_GETOBJECT_NOTNULL(LPDIRECT3DRMDEVICE3, lpD, dev);
  424. DO_GETOBJECT_NOTNULL(LPDIRECT3DRMFRAME3, lpF, fr);
  425. hr = m__dxj_Direct3dRM3->CreateViewport(lpD, lpF, l, t, w, h, &lp);
  426. if( hr != S_OK )
  427. return hr;
  428. //INTERNAL_CREATE(_dxj_Direct3dRMViewport2, lp, retval);
  429. C_dxj_Direct3dRMViewport2Object *c=new CComObject<C_dxj_Direct3dRMViewport2Object>;
  430. if( c == NULL )
  431. {
  432. lp->Release();
  433. return E_FAIL;
  434. }
  435. c->parent = dev;
  436. dev->AddRef();
  437. c->InternalSetObject(lp);
  438. if (FAILED(IUNK(c)->QueryInterface(IID_I_dxj_Direct3dRMViewport2, (void **)retval)))
  439. return E_FAIL;
  440. c->pinterface = *retval;
  441. return S_OK;
  442. }
  443. /////////////////////////////////////////////////////////////////////////////
  444. // real important that the return value is set correctly regardless, callbacks
  445. // use this!
  446. //
  447. STDMETHODIMP C_dxj_Direct3dRM3Object::loadTexture(BSTR name, I_dxj_Direct3dRMTexture3 **retval)
  448. {
  449. LPDIRECT3DRMTEXTURE3 lpT;
  450. USES_CONVERSION;
  451. LPSTR pszName = NULL;
  452. __try { pszName = W2T(name); /* Now convert to ANSI */ } __except(EXCEPTION_EXECUTE_HANDLER) { return E_FAIL; }
  453. if( m__dxj_Direct3dRM3->LoadTexture(pszName, &lpT ) != S_OK )
  454. {
  455. *retval = NULL;
  456. return S_OK; // Reture ok so that we don't thro execeptionn if it fails
  457. }
  458. INTERNAL_CREATE(_dxj_Direct3dRMTexture3, lpT, retval);
  459. return S_OK;
  460. }
  461. /////////////////////////////////////////////////////////////////////////////
  462. STDMETHODIMP C_dxj_Direct3dRM3Object::createDeviceFromClipper(I_dxj_DirectDrawClipper *lpDDClipper, BSTR strGuid, int width, int height, I_dxj_Direct3dRMDevice3 **retv)
  463. {
  464. LPDIRECT3DRMDEVICE3 lpd3drmDev;
  465. GUID g;
  466. LPGUID pguid=NULL;
  467. HRESULT hr;
  468. //hr =BSTRtoPPGUID(&pguid,strGuid);
  469. if ((strGuid) && (strGuid[0]!=0)){
  470. hr=D3DBSTRtoGUID(&g,strGuid);
  471. if FAILED(hr) return hr;
  472. pguid=&g;
  473. }
  474. if ( is4Bit )
  475. return E_FAIL;
  476. DO_GETOBJECT_NOTNULL(LPDIRECTDRAWCLIPPER, lpddc, lpDDClipper);
  477. if( m__dxj_Direct3dRM3->CreateDeviceFromClipper(lpddc, (LPGUID)pguid, width, height, &lpd3drmDev) != DD_OK)
  478. return E_FAIL;
  479. INTERNAL_CREATE_2REFS(_dxj_Direct3dRMDevice3, _dxj_DirectDrawClipper, lpDDClipper, lpd3drmDev, retv);
  480. return S_OK;
  481. }
  482. /////////////////////////////////////////////////////////////////////////////
  483. STDMETHODIMP C_dxj_Direct3dRM3Object::createFrame(I_dxj_Direct3dRMFrame3 *parent,I_dxj_Direct3dRMFrame3 **retv)
  484. {
  485. LPDIRECT3DRMFRAME3 lpFrame;
  486. DO_GETOBJECT_NOTNULL(LPDIRECT3DRMFRAME3, lpFrameParent, parent)
  487. if( m__dxj_Direct3dRM3->CreateFrame(lpFrameParent, &lpFrame) != DD_OK )
  488. return E_FAIL;
  489. INTERNAL_CREATE(_dxj_Direct3dRMFrame3, lpFrame, retv);
  490. return S_OK;
  491. }
  492. /////////////////////////////////////////////////////////////////////////////
  493. STDMETHODIMP C_dxj_Direct3dRM3Object::createLightRGB(d3drmLightType lt, d3dvalue vred,
  494. d3dvalue vgreen,d3dvalue vblue,I_dxj_Direct3dRMLight **retv)
  495. {
  496. LPDIRECT3DRMLIGHT lpNew;
  497. if ( is4Bit )
  498. return E_FAIL;
  499. if( m__dxj_Direct3dRM3->CreateLightRGB((enum _D3DRMLIGHTTYPE)lt, vred, vgreen, vblue, &lpNew) != DD_OK )
  500. return E_FAIL;
  501. INTERNAL_CREATE(_dxj_Direct3dRMLight, lpNew, retv);
  502. return S_OK;
  503. }
  504. /////////////////////////////////////////////////////////////////////////////
  505. STDMETHODIMP C_dxj_Direct3dRM3Object::setOptions(long opt){
  506. return m__dxj_Direct3dRM3->SetOptions((DWORD)opt);
  507. }
  508. /////////////////////////////////////////////////////////////////////////////
  509. STDMETHODIMP C_dxj_Direct3dRM3Object::getOptions(long *opt){
  510. return m__dxj_Direct3dRM3->GetOptions((DWORD*)opt);
  511. }
  512. /////////////////////////////////////////////////////////////////////////////
  513. STDMETHODIMP C_dxj_Direct3dRM3Object::createClippedVisual(I_dxj_Direct3dRMVisual *vis, I_dxj_Direct3dRMClippedVisual**clipvis)
  514. {
  515. //LPDIRECT3DRMVISUAL lpVisual=NULL;
  516. LPDIRECT3DRMCLIPPEDVISUAL lpClippedVisual=NULL;
  517. HRESULT hr;
  518. DO_GETOBJECT_NOTNULL(LPDIRECT3DRMVISUAL, lpVisual, vis)
  519. hr=m__dxj_Direct3dRM3->CreateClippedVisual(lpVisual,&lpClippedVisual);
  520. if FAILED(hr) return hr;
  521. INTERNAL_CREATE(_dxj_Direct3dRMClippedVisual, lpClippedVisual, clipvis);
  522. return hr;
  523. }
  524. /////////////////////////////////////////////////////////////////////////////
  525. STDMETHODIMP C_dxj_Direct3dRM3Object::createProgressiveMesh( I_dxj_Direct3dRMProgressiveMesh **retv)
  526. {
  527. LPDIRECT3DRMPROGRESSIVEMESH lpPMesh=NULL;
  528. if( m__dxj_Direct3dRM3->CreateProgressiveMesh(&lpPMesh) != DD_OK )
  529. return E_FAIL;
  530. INTERNAL_CREATE(_dxj_Direct3dRMProgressiveMesh, lpPMesh, retv);
  531. return S_OK;
  532. }
  533. /////////////////////////////////////////////////////////////////////////////
  534. //STDMETHODIMP C_dxj_Direct3dRM3Object::createInterpolator(
  535. // /* [retval][out] */ I_dxj_Direct3dRMInterpolator __RPC_FAR *__RPC_FAR *retv)
  536. //{
  537. // return E_NOTIMPL;
  538. //}
  539. STDMETHODIMP C_dxj_Direct3dRM3Object::createInterpolatorMesh(
  540. /* [retval][out] */ I_dxj_Direct3dRMMeshInterpolator __RPC_FAR *__RPC_FAR *retv)
  541. {
  542. HRESULT hr;
  543. LPDIRECT3DRMINTERPOLATOR lpInterpolator=NULL;
  544. hr=m__dxj_Direct3dRM3->CreateObject(CLSID_CDirect3DRMMeshInterpolator, 0, IID_IDirect3DRMInterpolator,(void**) &lpInterpolator);
  545. if FAILED(hr) return hr;
  546. INTERNAL_CREATE(_dxj_Direct3dRMMeshInterpolator, lpInterpolator, retv);
  547. return hr;
  548. }
  549. STDMETHODIMP C_dxj_Direct3dRM3Object::createInterpolatorTexture(
  550. /* [retval][out] */ I_dxj_Direct3dRMTextureInterpolator __RPC_FAR *__RPC_FAR *retv)
  551. {
  552. HRESULT hr;
  553. LPDIRECT3DRMINTERPOLATOR lpInterpolator=NULL;
  554. hr=m__dxj_Direct3dRM3->CreateObject(CLSID_CDirect3DRMTextureInterpolator, 0, IID_IDirect3DRMInterpolator, (void**)&lpInterpolator);
  555. if FAILED(hr) return hr;
  556. INTERNAL_CREATE(_dxj_Direct3dRMTextureInterpolator, lpInterpolator, retv);
  557. return hr;
  558. }
  559. STDMETHODIMP C_dxj_Direct3dRM3Object::createInterpolatorMaterial(
  560. /* [retval][out] */ I_dxj_Direct3dRMMaterialInterpolator __RPC_FAR *__RPC_FAR *retv)
  561. {
  562. HRESULT hr;
  563. LPDIRECT3DRMINTERPOLATOR lpInterpolator=NULL;
  564. hr=m__dxj_Direct3dRM3->CreateObject(CLSID_CDirect3DRMMaterialInterpolator, 0, IID_IDirect3DRMInterpolator, (void**)&lpInterpolator);
  565. if FAILED(hr) return hr;
  566. INTERNAL_CREATE(_dxj_Direct3dRMMaterialInterpolator, lpInterpolator, retv);
  567. return hr;
  568. }
  569. STDMETHODIMP C_dxj_Direct3dRM3Object::createInterpolatorFrame(
  570. /* [retval][out] */ I_dxj_Direct3dRMFrameInterpolator __RPC_FAR *__RPC_FAR *retv)
  571. {
  572. HRESULT hr;
  573. LPDIRECT3DRMINTERPOLATOR lpInterpolator=NULL;
  574. hr=m__dxj_Direct3dRM3->CreateObject(CLSID_CDirect3DRMFrameInterpolator, 0, IID_IDirect3DRMInterpolator, (void**)&lpInterpolator);
  575. if FAILED(hr) return hr;
  576. INTERNAL_CREATE(_dxj_Direct3dRMFrameInterpolator, lpInterpolator, retv);
  577. return hr;
  578. }
  579. STDMETHODIMP C_dxj_Direct3dRM3Object::createInterpolatorViewport(
  580. /* [retval][out] */ I_dxj_Direct3dRMViewportInterpolator __RPC_FAR *__RPC_FAR *retv)
  581. {
  582. HRESULT hr;
  583. LPDIRECT3DRMINTERPOLATOR lpInterpolator=NULL;
  584. hr=m__dxj_Direct3dRM3->CreateObject(CLSID_CDirect3DRMViewportInterpolator, 0, IID_IDirect3DRMInterpolator,(void**) &lpInterpolator);
  585. if FAILED(hr) return hr;
  586. INTERNAL_CREATE(_dxj_Direct3dRMViewportInterpolator, lpInterpolator, retv);
  587. return hr;
  588. }
  589. STDMETHODIMP C_dxj_Direct3dRM3Object::createInterpolatorLight(
  590. /* [retval][out] */ I_dxj_Direct3dRMLightInterpolator __RPC_FAR *__RPC_FAR *retv)
  591. {
  592. HRESULT hr;
  593. LPDIRECT3DRMINTERPOLATOR lpInterpolator=NULL;
  594. hr=m__dxj_Direct3dRM3->CreateObject(CLSID_CDirect3DRMLightInterpolator, 0, IID_IDirect3DRMInterpolator, (void**)&lpInterpolator);
  595. if FAILED(hr) return hr;
  596. INTERNAL_CREATE(_dxj_Direct3dRMLightInterpolator, lpInterpolator, retv);
  597. return hr;
  598. }
  599. /////////////////////////////////////////////////////////////////////////////