4 This files contains the implementation of Direct3DLight. */
10 #include "wine/obj_base.h"
13 #include "debugtools.h"
15 #include "mesa_private.h"
17 DEFAULT_DEBUG_CHANNEL(ddraw
);
19 #define D3DLPRIVATE(x) mesa_d3dl_private*dlpriv=((mesa_d3dl_private*)x->private)
21 static ICOM_VTABLE(IDirect3DLight
) light_vtable
;
28 /*******************************************************************************
29 * Light static functions
31 static const float zero_value
[] = {
35 static void update(IDirect3DLightImpl
* This
) {
37 switch (This
->light
.dltType
) {
38 case D3DLIGHT_POINT
: /* 1 */
39 TRACE("Activating POINT\n");
42 case D3DLIGHT_SPOT
: /* 2 */
43 TRACE("Activating SPOT\n");
46 case D3DLIGHT_DIRECTIONAL
: { /* 3 */
49 TRACE("Activating DIRECTIONAL\n");
50 TRACE(" direction : %f %f %f\n",
51 This
->light
.dvDirection
.u1
.x
,
52 This
->light
.dvDirection
.u2
.y
,
53 This
->light
.dvDirection
.u3
.z
);
54 _dump_colorvalue(" color ", This
->light
.dcvColor
);
56 glLightfv(dlpriv
->light_num
, GL_AMBIENT
, (float *) zero_value
);
57 glLightfv(dlpriv
->light_num
, GL_DIFFUSE
, (float *) &(This
->light
.dcvColor
));
59 direction
[0] = -This
->light
.dvDirection
.u1
.x
;
60 direction
[1] = -This
->light
.dvDirection
.u2
.y
;
61 direction
[2] = -This
->light
.dvDirection
.u3
.z
;
62 direction
[3] = 0.0; /* This is a directional light */
64 glLightfv(dlpriv
->light_num
, GL_POSITION
, (float *) direction
);
67 case D3DLIGHT_PARALLELPOINT
: /* 4 */
68 TRACE("Activating PARRALLEL-POINT\n");
72 TRACE("Not a known Light Type: %d\n",This
->light
.dltType
);
77 static void activate(IDirect3DLightImpl
* This
) {
82 /* If was not active, activate it */
83 if (This
->is_active
== 0) {
84 glEnable(dlpriv
->light_num
);
92 /*******************************************************************************
93 * Light Creation functions
95 LPDIRECT3DLIGHT
d3dlight_create(IDirect3D2Impl
* d3d2
)
97 IDirect3DLightImpl
* light
;
99 light
= HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(IDirect3DLightImpl
));
101 ICOM_VTBL(light
) = &light_vtable
;
102 light
->d3d
.d3d2
= d3d2
;
107 light
->activate
= activate
;
108 light
->is_active
= 0;
110 return (LPDIRECT3DLIGHT
)light
;
113 LPDIRECT3DLIGHT
d3dlight_create_dx3(IDirect3DImpl
* d3d1
)
115 IDirect3DLightImpl
* light
;
117 light
= HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(IDirect3DLightImpl
));
119 ICOM_VTBL(light
) = &light_vtable
;
121 light
->d3d
.d3d1
= d3d1
;
126 light
->activate
= activate
;
127 light
->is_active
= 0;
129 return (LPDIRECT3DLIGHT
)light
;
132 /*******************************************************************************
133 * IDirect3DLight methods
136 static HRESULT WINAPI
IDirect3DLightImpl_QueryInterface(LPDIRECT3DLIGHT iface
,
140 ICOM_THIS(IDirect3DLightImpl
,iface
);
142 FIXME("(%p)->(%s,%p): stub\n", This
, debugstr_guid(riid
),ppvObj
);
149 static ULONG WINAPI
IDirect3DLightImpl_AddRef(LPDIRECT3DLIGHT iface
)
151 ICOM_THIS(IDirect3DLightImpl
,iface
);
152 TRACE("(%p)->()incrementing from %lu.\n", This
, This
->ref
);
154 return ++(This
->ref
);
159 static ULONG WINAPI
IDirect3DLightImpl_Release(LPDIRECT3DLIGHT iface
)
161 ICOM_THIS(IDirect3DLightImpl
,iface
);
162 FIXME("(%p)->() decrementing from %lu.\n", This
, This
->ref
);
164 if (!--(This
->ref
)) {
165 HeapFree(GetProcessHeap(),0,This
);
172 /*** IDirect3DLight methods ***/
173 static void dump_light(LPD3DLIGHT light
)
175 DPRINTF(" dwSize : %ld\n", light
->dwSize
);
178 static HRESULT WINAPI
IDirect3DLightImpl_GetLight(LPDIRECT3DLIGHT iface
,
181 ICOM_THIS(IDirect3DLightImpl
,iface
);
182 TRACE("(%p)->(%p)\n", This
, lpLight
);
186 /* Copies the light structure */
187 switch (This
->type
) {
189 *((LPD3DLIGHT
)lpLight
) = *((LPD3DLIGHT
) &(This
->light
));
192 *((LPD3DLIGHT2
)lpLight
) = *((LPD3DLIGHT2
) &(This
->light
));
199 static HRESULT WINAPI
IDirect3DLightImpl_SetLight(LPDIRECT3DLIGHT iface
,
202 ICOM_THIS(IDirect3DLightImpl
,iface
);
203 TRACE("(%p)->(%p)\n", This
, lpLight
);
207 /* Stores the light */
208 switch (This
->type
) {
210 *((LPD3DLIGHT
) &(This
->light
)) = *((LPD3DLIGHT
)lpLight
);
213 *((LPD3DLIGHT2
) &(This
->light
)) = *((LPD3DLIGHT2
)lpLight
);
225 static HRESULT WINAPI
IDirect3DLightImpl_Initialize(LPDIRECT3DLIGHT iface
,
226 LPDIRECT3D lpDirect3D
)
229 ICOM_THIS(IDirect3DLightImpl
,iface
);
230 TRACE("(%p)->(%p)\n", This
, lpDirect3D
);
232 return DDERR_ALREADYINITIALIZED
;
236 /*******************************************************************************
237 * IDirect3DLight VTable
239 static ICOM_VTABLE(IDirect3DLight
) light_vtable
=
241 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
242 /*** IUnknown methods ***/
243 IDirect3DLightImpl_QueryInterface
,
244 IDirect3DLightImpl_AddRef
,
245 IDirect3DLightImpl_Release
,
246 /*** IDirect3DLight methods ***/
247 IDirect3DLightImpl_Initialize
,
248 IDirect3DLightImpl_SetLight
,
249 IDirect3DLightImpl_GetLight