4 This files contains the implementation of Direct3DMaterial2. */
9 #include "wine/obj_base.h"
15 #include "d3d_private.h"
19 static ICOM_VTABLE(IDirect3DMaterial2
) material2_vtable
;
20 static ICOM_VTABLE(IDirect3DMaterial
) material_vtable
;
22 /*******************************************************************************
23 * Matrial2 static functions
25 static void activate(IDirect3DMaterial2Impl
* This
) {
26 TRACE(ddraw
, "Activating material %p\n", This
);
28 /* First, set the rendering context */
30 This
->device
.active_device2
->set_context(This
->device
.active_device2
);
32 This
->device
.active_device1
->set_context(This
->device
.active_device1
);
34 /* Set the current Material */
35 _dump_colorvalue("Diffuse", This
->mat
.a
.diffuse
);
36 glMaterialfv(GL_FRONT
,
38 (float *) &(This
->mat
.a
.diffuse
));
39 _dump_colorvalue("Ambient", This
->mat
.b
.ambient
);
40 glMaterialfv(GL_FRONT
,
42 (float *) &(This
->mat
.b
.ambient
));
43 _dump_colorvalue("Specular", This
->mat
.c
.specular
);
44 glMaterialfv(GL_FRONT
,
46 (float *) &(This
->mat
.c
.specular
));
47 _dump_colorvalue("Emissive", This
->mat
.d
.emissive
);
48 glMaterialfv(GL_FRONT
,
50 (float *) &(This
->mat
.d
.emissive
));
52 TRACE(ddraw
, "Size : %ld\n", This
->mat
.dwSize
);
53 TRACE(ddraw
, "Power : %f\n", This
->mat
.e
.power
);
55 TRACE(ddraw
, "Texture handle : %08lx\n", (DWORD
)This
->mat
.hTexture
);
60 /*******************************************************************************
61 * Matrial2 Creation functions
63 LPDIRECT3DMATERIAL2
d3dmaterial2_create(IDirect3D2Impl
* d3d2
)
65 IDirect3DMaterial2Impl
* mat
;
67 mat
= HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(IDirect3DMaterial2Impl
));
69 mat
->lpvtbl
= &material2_vtable
;
74 mat
->activate
= activate
;
76 return (LPDIRECT3DMATERIAL2
)mat
;
79 LPDIRECT3DMATERIAL
d3dmaterial_create(IDirect3DImpl
* d3d1
)
81 IDirect3DMaterial2Impl
* mat
;
83 mat
= HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(IDirect3DMaterial2Impl
));
85 mat
->lpvtbl
= (ICOM_VTABLE(IDirect3DMaterial2
)*)&material_vtable
;
90 mat
->activate
= activate
;
92 return (LPDIRECT3DMATERIAL
) mat
;
95 /*******************************************************************************
96 * IDirect3DMaterial2 methods
99 static HRESULT WINAPI
IDirect3DMaterial2Impl_QueryInterface(LPDIRECT3DMATERIAL2 iface
,
103 ICOM_THIS(IDirect3DMaterial2Impl
,iface
);
106 WINE_StringFromCLSID((LPCLSID
)riid
,xrefiid
);
107 FIXME(ddraw
, "(%p)->(%s,%p): stub\n", This
, xrefiid
,ppvObj
);
114 static ULONG WINAPI
IDirect3DMaterial2Impl_AddRef(LPDIRECT3DMATERIAL2 iface
)
116 ICOM_THIS(IDirect3DMaterial2Impl
,iface
);
117 TRACE(ddraw
, "(%p)->()incrementing from %lu.\n", This
, This
->ref
);
119 return ++(This
->ref
);
124 static ULONG WINAPI
IDirect3DMaterial2Impl_Release(LPDIRECT3DMATERIAL2 iface
)
126 ICOM_THIS(IDirect3DMaterial2Impl
,iface
);
127 FIXME( ddraw
, "(%p)->() decrementing from %lu.\n", This
, This
->ref
);
129 if (!--(This
->ref
)) {
130 HeapFree(GetProcessHeap(),0,This
);
137 /*** IDirect3DMaterial2 methods ***/
138 static void dump_material(LPD3DMATERIAL mat
)
140 fprintf(stderr
, " dwSize : %ld\n", mat
->dwSize
);
143 static HRESULT WINAPI
IDirect3DMaterial2Impl_GetMaterial(LPDIRECT3DMATERIAL2 iface
,
146 ICOM_THIS(IDirect3DMaterial2Impl
,iface
);
147 TRACE(ddraw
, "(%p)->(%p)\n", This
, lpMat
);
149 dump_material(lpMat
);
151 /* Copies the material structure */
157 static HRESULT WINAPI
IDirect3DMaterial2Impl_SetMaterial(LPDIRECT3DMATERIAL2 iface
,
160 ICOM_THIS(IDirect3DMaterial2Impl
,iface
);
161 TRACE(ddraw
, "(%p)->(%p)\n", This
, lpMat
);
163 dump_material(lpMat
);
165 /* Stores the material */
171 static HRESULT WINAPI
IDirect3DMaterial2Impl_GetHandle(LPDIRECT3DMATERIAL2 iface
,
172 LPDIRECT3DDEVICE2 lpD3DDevice2
,
173 LPD3DMATERIALHANDLE lpMatHandle
)
176 ICOM_THIS(IDirect3DMaterial2Impl
,iface
);
177 FIXME(ddraw
, "(%p)->(%p,%p): stub\n", This
, lpD3DDevice2
, lpMatHandle
);
180 This
->device
.active_device2
= (IDirect3DDevice2Impl
*)lpD3DDevice2
;
182 This
->device
.active_device1
= (IDirect3DDeviceImpl
*)lpD3DDevice2
;
184 *lpMatHandle
= (DWORD
) This
; /* lpD3DDevice2->store_material(This); */
189 static HRESULT WINAPI
IDirect3DMaterialImpl_Reserve(LPDIRECT3DMATERIAL iface
)
191 ICOM_THIS(IDirect3DMaterial2Impl
,iface
);
192 FIXME(ddraw
, "(%p)->(): stub\n", This
);
194 return DDERR_INVALIDPARAMS
;
197 static HRESULT WINAPI
IDirect3DMaterialImpl_Unreserve(LPDIRECT3DMATERIAL iface
)
199 ICOM_THIS(IDirect3DMaterial2Impl
,iface
);
200 FIXME(ddraw
, "(%p)->(): stub\n", This
);
202 return DDERR_INVALIDPARAMS
;
205 static HRESULT WINAPI
IDirect3DMaterialImpl_Initialize(LPDIRECT3DMATERIAL iface
,
206 LPDIRECT3D lpDirect3D
)
209 ICOM_THIS(IDirect3DMaterial2Impl
,iface
);
210 TRACE(ddraw
, "(%p)->(%p)\n", This
, lpDirect3D
);
212 return DDERR_ALREADYINITIALIZED
;
216 /*******************************************************************************
217 * IDirect3DMaterial VTable
219 static ICOM_VTABLE(IDirect3DMaterial
) material_vtable
= {
220 /*** IUnknown methods ***/
221 IDirect3DMaterial2Impl_QueryInterface
,
222 IDirect3DMaterial2Impl_AddRef
,
223 IDirect3DMaterial2Impl_Release
,
224 /*** IDirect3DMaterial methods ***/
225 IDirect3DMaterialImpl_Initialize
,
226 IDirect3DMaterial2Impl_SetMaterial
,
227 IDirect3DMaterial2Impl_GetMaterial
,
228 IDirect3DMaterial2Impl_GetHandle
,
229 IDirect3DMaterialImpl_Reserve
,
230 IDirect3DMaterialImpl_Unreserve
234 /*******************************************************************************
235 * IDirect3DMaterial2 VTable
237 static ICOM_VTABLE(IDirect3DMaterial2
) material2_vtable
= {
238 /*** IUnknown methods ***/
239 IDirect3DMaterial2Impl_QueryInterface
,
240 IDirect3DMaterial2Impl_AddRef
,
241 IDirect3DMaterial2Impl_Release
,
242 /*** IDirect3DMaterial methods ***/
243 IDirect3DMaterial2Impl_SetMaterial
,
244 IDirect3DMaterial2Impl_GetMaterial
,
245 IDirect3DMaterial2Impl_GetHandle
248 #else /* HAVE_MESAGL */
250 LPDIRECT3DMATERIAL
d3dmaterial_create(IDirect3DImpl
* d3d1
) {
251 ERR(ddraw
, "Should not be called...\n");
255 LPDIRECT3DMATERIAL2
d3dmaterial2_create(IDirect3D2Impl
* d3d2
) {
256 ERR(ddraw
, "Should not be called...\n");
261 #endif /* HAVE_MESAGL */