When including 'wine/port.h', include it first.
[wine] / dlls / ddraw / d3dmaterial.c
1 /* Direct3D Material
2    (c) 1998 Lionel ULMER
3    
4    This files contains the implementation of Direct3DMaterial2. */
5
6 #include "config.h"
7 #include "windef.h"
8 #include "winerror.h"
9 #include "wine/obj_base.h"
10 #include "ddraw.h"
11 #include "d3d.h"
12 #include "debugtools.h"
13
14 #include "mesa_private.h"
15
16 DEFAULT_DEBUG_CHANNEL(ddraw);
17
18 static ICOM_VTABLE(IDirect3DMaterial2) material2_vtable;
19 static ICOM_VTABLE(IDirect3DMaterial) material_vtable;
20
21 /*******************************************************************************
22  *                              Matrial2 static functions
23  */
24 static void activate(IDirect3DMaterial2Impl* This) {
25   TRACE("Activating material %p\n", This);
26   
27   ENTER_GL();
28   /* First, set the rendering context */
29   if (This->use_d3d2)
30     This->device.active_device2->set_context(This->device.active_device2);
31   else
32     This->device.active_device1->set_context(This->device.active_device1);
33
34   /* Set the current Material */
35   _dump_colorvalue("Diffuse", This->mat.u.diffuse);
36   glMaterialfv(GL_FRONT,
37                GL_DIFFUSE,
38                (float *) &(This->mat.u.diffuse));
39   _dump_colorvalue("Ambient", This->mat.u1.ambient);
40   glMaterialfv(GL_FRONT,
41                GL_AMBIENT,
42                (float *) &(This->mat.u1.ambient));
43   _dump_colorvalue("Specular", This->mat.u2.specular);
44   glMaterialfv(GL_FRONT,
45                GL_SPECULAR,
46                (float *) &(This->mat.u2.specular));
47   _dump_colorvalue("Emissive", This->mat.u3.emissive);
48   glMaterialfv(GL_FRONT,
49                GL_EMISSION,
50                (float *) &(This->mat.u3.emissive));
51   
52   TRACE("Size  : %ld\n", This->mat.dwSize);
53   TRACE("Power : %f\n", This->mat.u4.power);
54
55   TRACE("Texture handle : %08lx\n", (DWORD)This->mat.hTexture);
56   LEAVE_GL();
57   
58   return ;
59 }
60
61 /*******************************************************************************
62  *                              Matrial2 Creation functions
63  */
64 LPDIRECT3DMATERIAL2 d3dmaterial2_create(IDirect3D2Impl* d3d2)
65 {
66   IDirect3DMaterial2Impl* mat;
67   
68   mat = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DMaterial2Impl));
69   mat->ref = 1;
70   ICOM_VTBL(mat) = &material2_vtable;
71
72   mat->use_d3d2 = 1;
73   mat->d3d.d3d2 = d3d2;
74
75   mat->activate = activate;
76   
77   return (LPDIRECT3DMATERIAL2)mat;
78 }
79
80 LPDIRECT3DMATERIAL d3dmaterial_create(IDirect3DImpl* d3d1)
81 {
82   IDirect3DMaterial2Impl* mat;
83   
84   mat = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DMaterial2Impl));
85   mat->ref = 1;
86   ICOM_VTBL(mat) = (ICOM_VTABLE(IDirect3DMaterial2)*)&material_vtable;
87
88   mat->use_d3d2 = 0;
89   mat->d3d.d3d1 = d3d1;
90
91   mat->activate = activate;
92   
93   return (LPDIRECT3DMATERIAL) mat;
94 }
95
96 /*******************************************************************************
97  *                              IDirect3DMaterial2 methods
98  */
99
100 static HRESULT WINAPI IDirect3DMaterial2Impl_QueryInterface(LPDIRECT3DMATERIAL2 iface,
101                                                         REFIID riid,
102                                                         LPVOID* ppvObj)
103 {
104   ICOM_THIS(IDirect3DMaterial2Impl,iface);
105   
106   FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj);
107   
108   return S_OK;
109 }
110
111
112
113 static ULONG WINAPI IDirect3DMaterial2Impl_AddRef(LPDIRECT3DMATERIAL2 iface)
114 {
115   ICOM_THIS(IDirect3DMaterial2Impl,iface);
116   TRACE("(%p)->()incrementing from %lu.\n", This, This->ref );
117   
118   return ++(This->ref);
119 }
120
121
122
123 static ULONG WINAPI IDirect3DMaterial2Impl_Release(LPDIRECT3DMATERIAL2 iface)
124 {
125   ICOM_THIS(IDirect3DMaterial2Impl,iface);
126   FIXME("(%p)->() decrementing from %lu.\n", This, This->ref );
127   
128   if (!--(This->ref)) {
129     HeapFree(GetProcessHeap(),0,This);
130     return 0;
131   }
132   
133   return This->ref;
134 }
135
136 /*** IDirect3DMaterial2 methods ***/
137 static void dump_material(LPD3DMATERIAL mat)
138 {
139   DPRINTF("  dwSize : %ld\n", mat->dwSize);
140 }
141
142 static HRESULT WINAPI IDirect3DMaterial2Impl_GetMaterial(LPDIRECT3DMATERIAL2 iface,
143                                                      LPD3DMATERIAL lpMat)
144 {
145   ICOM_THIS(IDirect3DMaterial2Impl,iface);
146   TRACE("(%p)->(%p)\n", This, lpMat);
147   if (TRACE_ON(ddraw))
148     dump_material(lpMat);
149   
150   /* Copies the material structure */
151   *lpMat = This->mat;
152   
153   return DD_OK;
154 }
155
156 static HRESULT WINAPI IDirect3DMaterial2Impl_SetMaterial(LPDIRECT3DMATERIAL2 iface,
157                                                      LPD3DMATERIAL lpMat)
158 {
159   ICOM_THIS(IDirect3DMaterial2Impl,iface);
160   TRACE("(%p)->(%p)\n", This, lpMat);
161   if (TRACE_ON(ddraw))
162     dump_material(lpMat);
163   
164   /* Stores the material */
165   This->mat = *lpMat;
166   
167   return DD_OK;
168 }
169
170 static HRESULT WINAPI IDirect3DMaterial2Impl_GetHandle(LPDIRECT3DMATERIAL2 iface,
171                                                    LPDIRECT3DDEVICE2 lpD3DDevice2,
172                                                    LPD3DMATERIALHANDLE lpMatHandle)
173
174 {
175   ICOM_THIS(IDirect3DMaterial2Impl,iface);
176   FIXME("(%p)->(%p,%p): stub\n", This, lpD3DDevice2, lpMatHandle);
177
178   if (This->use_d3d2)
179     This->device.active_device2 = (IDirect3DDevice2Impl*)lpD3DDevice2;
180   else
181     This->device.active_device1 = (IDirect3DDeviceImpl*)lpD3DDevice2;
182   
183   *lpMatHandle = (DWORD) This; /* lpD3DDevice2->store_material(This); */
184   
185   return DD_OK;
186 }
187
188 static HRESULT WINAPI IDirect3DMaterialImpl_Reserve(LPDIRECT3DMATERIAL iface)
189 {
190   ICOM_THIS(IDirect3DMaterial2Impl,iface);
191   FIXME("(%p)->(): stub\n", This);
192
193   return DDERR_INVALIDPARAMS;
194 }
195                                                   
196 static HRESULT WINAPI IDirect3DMaterialImpl_Unreserve(LPDIRECT3DMATERIAL iface)
197 {
198   ICOM_THIS(IDirect3DMaterial2Impl,iface);
199   FIXME("(%p)->(): stub\n", This);
200
201   return DDERR_INVALIDPARAMS;
202 }
203
204 static HRESULT WINAPI IDirect3DMaterialImpl_Initialize(LPDIRECT3DMATERIAL iface,
205                                                    LPDIRECT3D lpDirect3D)
206
207 {
208   ICOM_THIS(IDirect3DMaterial2Impl,iface);
209   TRACE("(%p)->(%p)\n", This, lpDirect3D);
210   
211   return DDERR_ALREADYINITIALIZED;
212 }
213
214
215 /*******************************************************************************
216  *                              IDirect3DMaterial VTable
217  */
218 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
219 # define XCAST(fun)     (typeof(material_vtable.fun))
220 #else
221 # define XCAST(fun)     (void*)
222 #endif
223
224 static ICOM_VTABLE(IDirect3DMaterial) material_vtable = 
225 {
226   ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
227   /*** IUnknown methods ***/
228   XCAST(QueryInterface)IDirect3DMaterial2Impl_QueryInterface,
229   XCAST(AddRef)IDirect3DMaterial2Impl_AddRef,
230   XCAST(Release)IDirect3DMaterial2Impl_Release,
231   /*** IDirect3DMaterial methods ***/
232   IDirect3DMaterialImpl_Initialize,
233   XCAST(SetMaterial)IDirect3DMaterial2Impl_SetMaterial,
234   XCAST(GetMaterial)IDirect3DMaterial2Impl_GetMaterial,
235   XCAST(GetHandle)IDirect3DMaterial2Impl_GetHandle,
236   IDirect3DMaterialImpl_Reserve,
237   IDirect3DMaterialImpl_Unreserve
238 };
239
240 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
241 #undef XCAST
242 #endif
243
244 /*******************************************************************************
245  *                              IDirect3DMaterial2 VTable
246  */
247 static ICOM_VTABLE(IDirect3DMaterial2) material2_vtable = 
248 {
249   ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
250   /*** IUnknown methods ***/
251   IDirect3DMaterial2Impl_QueryInterface,
252   IDirect3DMaterial2Impl_AddRef,
253   IDirect3DMaterial2Impl_Release,
254   /*** IDirect3DMaterial methods ***/
255   IDirect3DMaterial2Impl_SetMaterial,
256   IDirect3DMaterial2Impl_GetMaterial,
257   IDirect3DMaterial2Impl_GetHandle
258 };