ReactOS  0.4.14-dev-384-g5b37caa
light.c
Go to the documentation of this file.
1 /* Direct3D Light
2  * Copyright (c) 1998 / 2002 Lionel ULMER
3  * Copyright (c) 2006 Stefan DÖSINGER
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18  */
19 
20 #include "config.h"
21 #include "wine/port.h"
22 
23 #include "ddraw_private.h"
24 
26 
27 /*****************************************************************************
28  * light_update
29  *
30  * Updates the Direct3DDevice7 lighting parameters
31  *
32  *****************************************************************************/
33 static void light_update(struct d3d_light *light)
34 {
35  struct d3d_device *device;
36 
37  TRACE("light %p.\n", light);
38 
39  if (!light->active_viewport || !light->active_viewport->active_device) return;
40  device = light->active_viewport->active_device;
41 
42  IDirect3DDevice7_SetLight(&device->IDirect3DDevice7_iface, light->dwLightIndex, &light->light7);
43 }
44 
45 /*****************************************************************************
46  * light_activate
47  *
48  * Uses the Direct3DDevice7::LightEnable method to active the light
49  *
50  *****************************************************************************/
52 {
53  struct d3d_device *device;
54 
55  TRACE("light %p.\n", light);
56 
57  if (!light->active_viewport || !light->active_viewport->active_device) return;
58  device = light->active_viewport->active_device;
59 
61  if (!(light->light.dwFlags & D3DLIGHT_ACTIVE))
62  {
63  IDirect3DDevice7_LightEnable(&device->IDirect3DDevice7_iface, light->dwLightIndex, TRUE);
64  light->light.dwFlags |= D3DLIGHT_ACTIVE;
65  }
66 }
67 
68 /*****************************************************************************
69  *
70  * light_deactivate
71  *
72  * Uses the Direct3DDevice7::LightEnable method to deactivate the light
73  *
74  *****************************************************************************/
76 {
77  struct d3d_device *device;
78 
79  TRACE("light %p.\n", light);
80 
81  if (!light->active_viewport || !light->active_viewport->active_device) return;
82  device = light->active_viewport->active_device;
83 
84  if (light->light.dwFlags & D3DLIGHT_ACTIVE)
85  {
86  IDirect3DDevice7_LightEnable(&device->IDirect3DDevice7_iface, light->dwLightIndex, FALSE);
87  light->light.dwFlags &= ~D3DLIGHT_ACTIVE;
88  }
89 }
90 
91 static inline struct d3d_light *impl_from_IDirect3DLight(IDirect3DLight *iface)
92 {
93  return CONTAINING_RECORD(iface, struct d3d_light, IDirect3DLight_iface);
94 }
95 
96 /*****************************************************************************
97  * IDirect3DLight::QueryInterface
98  *
99  * Queries the object for different interfaces. Unimplemented for this
100  * object at the moment
101  *
102  * Params:
103  * riid: Interface id asked for
104  * obj: Address to return the resulting pointer at.
105  *
106  * Returns:
107  * E_NOINTERFACE, because it's a stub
108  *****************************************************************************/
109 static HRESULT WINAPI d3d_light_QueryInterface(IDirect3DLight *iface, REFIID riid, void **object)
110 {
111  FIXME("iface %p, riid %s, object %p stub!\n", iface, debugstr_guid(riid), object);
112 
113  *object = NULL;
114  return E_NOINTERFACE;
115 }
116 
117 static ULONG WINAPI d3d_light_AddRef(IDirect3DLight *iface)
118 {
119  struct d3d_light *light = impl_from_IDirect3DLight(iface);
121 
122  TRACE("%p increasing refcount to %u.\n", light, ref);
123 
124  return ref;
125 }
126 
127 static ULONG WINAPI d3d_light_Release(IDirect3DLight *iface)
128 {
129  struct d3d_light *light = impl_from_IDirect3DLight(iface);
131 
132  TRACE("%p decreasing refcount to %u.\n", light, ref);
133 
134  if (!ref)
135  {
136  heap_free(light);
137  return 0;
138  }
139  return ref;
140 }
141 
142 /*****************************************************************************
143  * IDirect3DLight Methods.
144  *****************************************************************************/
145 
146 /*****************************************************************************
147  * IDirect3DLight::Initialize
148  *
149  * Initializes the interface. This implementation is a no-op, because
150  * initialization takes place at creation time
151  *
152  * Params:
153  * Direct3D: Pointer to an IDirect3D interface.
154  *
155  * Returns:
156  * D3D_OK
157  *
158  *****************************************************************************/
159 static HRESULT WINAPI d3d_light_Initialize(IDirect3DLight *iface, IDirect3D *d3d)
160 {
161  TRACE("iface %p, d3d %p.\n", iface, d3d);
162 
163  return D3D_OK;
164 }
165 
166 static HRESULT WINAPI d3d_light_SetLight(IDirect3DLight *iface, D3DLIGHT *data)
167 {
168  static const D3DCOLORVALUE zero_value = {{0.0f}, {0.0f}, {0.0f}, {0.0f}};
169  struct d3d_light *light = impl_from_IDirect3DLight(iface);
170  DWORD flags = data->dwSize >= sizeof(D3DLIGHT2) ? ((D3DLIGHT2 *)data)->dwFlags : D3DLIGHT_ACTIVE;
171  D3DLIGHT7 *light7 = &light->light7;
172 
173  TRACE("iface %p, data %p.\n", iface, data);
174 
175  if ((!data->dltType) || (data->dltType > D3DLIGHT_PARALLELPOINT))
176  return DDERR_INVALIDPARAMS;
177 
178  /* Translate D3DLIGHT2 structure to D3DLIGHT7. */
179  light7->dltType = data->dltType;
180  light7->dcvDiffuse = data->dcvColor;
182  light7->dcvSpecular = zero_value;
183  else
184  light7->dcvSpecular = data->dcvColor;
185  light7->dcvAmbient = data->dcvColor;
186  light7->dvPosition = data->dvPosition;
187  light7->dvDirection = data->dvDirection;
188  light7->dvRange = data->dvRange;
189  light7->dvFalloff = data->dvFalloff;
190  light7->dvAttenuation0 = data->dvAttenuation0;
191  light7->dvAttenuation1 = data->dvAttenuation1;
192  light7->dvAttenuation2 = data->dvAttenuation2;
193  light7->dvTheta = data->dvTheta;
194  light7->dvPhi = data->dvPhi;
195 
197  memcpy(&light->light, data, sizeof(*data));
198  if (!(light->light.dwFlags & D3DLIGHT_ACTIVE) && flags & D3DLIGHT_ACTIVE)
200  else if (light->light.dwFlags & D3DLIGHT_ACTIVE && !(flags & D3DLIGHT_ACTIVE))
202  else if (flags & D3DLIGHT_ACTIVE)
204  light->light.dwFlags = flags;
206 
207  return D3D_OK;
208 }
209 
210 /*****************************************************************************
211  * IDirect3DLight::GetLight
212  *
213  * Returns the parameters currently assigned to the IDirect3DLight object
214  *
215  * Params:
216  * Light: Pointer to an D3DLIGHT structure to store the parameters
217  *
218  * Returns:
219  * D3D_OK on success
220  * DDERR_INVALIDPARAMS if Light is NULL
221  *****************************************************************************/
222 static HRESULT WINAPI d3d_light_GetLight(IDirect3DLight *iface, D3DLIGHT *lpLight)
223 {
224  struct d3d_light *light = impl_from_IDirect3DLight(iface);
225 
226  TRACE("iface %p, light %p.\n", iface, lpLight);
227 
229  memcpy(lpLight, &light->light, lpLight->dwSize);
231 
232  return DD_OK;
233 }
234 
235 static const struct IDirect3DLightVtbl d3d_light_vtbl =
236 {
237  /*** IUnknown Methods ***/
241  /*** IDirect3DLight Methods ***/
245 };
246 
247 void d3d_light_init(struct d3d_light *light, struct ddraw *ddraw)
248 {
249  light->IDirect3DLight_iface.lpVtbl = &d3d_light_vtbl;
250  light->ref = 1;
251  light->ddraw = ddraw;
252 }
253 
254 struct d3d_light *unsafe_impl_from_IDirect3DLight(IDirect3DLight *iface)
255 {
256  if (!iface)
257  return NULL;
258  assert(iface->lpVtbl == &d3d_light_vtbl);
259 
260  return impl_from_IDirect3DLight(iface);
261 }
D3DVALUE dvAttenuation0
Definition: d3dtypes.h:589
static HRESULT WINAPI d3d_light_GetLight(IDirect3DLight *iface, D3DLIGHT *lpLight)
Definition: light.c:222
#define REFIID
Definition: guiddef.h:118
#define TRUE
Definition: types.h:120
#define E_NOINTERFACE
Definition: winerror.h:2364
REFIID riid
Definition: precomp.h:44
static HRESULT WINAPI d3d_light_QueryInterface(IDirect3DLight *iface, REFIID riid, void **object)
Definition: light.c:109
void WINAPI wined3d_mutex_lock(void)
Definition: wined3d_main.c:368
#define assert(x)
Definition: debug.h:53
D3DVALUE dvRange
Definition: d3dtypes.h:587
struct _D3DLIGHT2 D3DLIGHT2
static struct d3d_light * impl_from_IDirect3DLight(IDirect3DLight *iface)
Definition: light.c:91
D3DCOLORVALUE dcvAmbient
Definition: d3dtypes.h:584
Definition: send.c:47
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum light
Definition: glfuncs.h:170
#define DD_OK
Definition: ddraw.h:186
static void light_update(struct d3d_light *light)
Definition: light.c:33
D3DCOLORVALUE dcvSpecular
Definition: d3dtypes.h:583
void light_activate(struct d3d_light *light)
Definition: light.c:51
Definition: devices.h:37
GLenum GLint ref
Definition: glext.h:6028
#define FIXME(fmt,...)
Definition: debug.h:110
static ULONG WINAPI d3d_light_AddRef(IDirect3DLight *iface)
Definition: light.c:117
smooth NULL
Definition: ftsmooth.c:416
struct d3d_light * unsafe_impl_from_IDirect3DLight(IDirect3DLight *iface)
Definition: light.c:254
D3DVALUE dvPhi
Definition: d3dtypes.h:593
#define debugstr_guid
Definition: kernel32.h:35
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
D3DVALUE dvTheta
Definition: d3dtypes.h:592
#define TRACE(s)
Definition: solgame.cpp:4
#define IDirect3DDevice7_LightEnable(p, a, b)
Definition: d3d.h:1387
LONG HRESULT
Definition: typedefs.h:77
#define WINAPI
Definition: msvc.h:8
unsigned long DWORD
Definition: ntddk_ex.h:95
void d3d_light_init(struct d3d_light *light, struct ddraw *ddraw)
Definition: light.c:247
D3DLIGHTTYPE dltType
Definition: d3dtypes.h:581
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLbitfield flags
Definition: glext.h:7161
D3DLIGHT7 light7
#define InterlockedDecrement
Definition: armddk.h:52
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
IDirect3DLight IDirect3DLight_iface
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
DWORD dwSize
Definition: d3dtypes.h:566
#define D3DLIGHT_NO_SPECULAR
Definition: d3dtypes.h:597
D3DVECTOR dvDirection
Definition: d3dtypes.h:586
D3DCOLORVALUE dcvDiffuse
Definition: d3dtypes.h:582
WINE_DEFAULT_DEBUG_CHANNEL(d3drm)
#define D3D_OK
Definition: d3d.h:106
D3DVALUE dvAttenuation1
Definition: d3dtypes.h:590
#define InterlockedIncrement
Definition: armddk.h:53
#define IDirect3DDevice7_SetLight(p, a, b)
Definition: d3d.h:1361
#define D3DLIGHT_ACTIVE
Definition: d3dtypes.h:596
static ULONG WINAPI d3d_light_Release(IDirect3DLight *iface)
Definition: light.c:127
D3DVALUE dvAttenuation2
Definition: d3dtypes.h:591
D3DVECTOR dvPosition
Definition: d3dtypes.h:585
D3DVALUE dvFalloff
Definition: d3dtypes.h:588
void light_deactivate(struct d3d_light *light)
Definition: light.c:75
static HRESULT WINAPI d3d_light_Initialize(IDirect3DLight *iface, IDirect3D *d3d)
Definition: light.c:159
unsigned int ULONG
Definition: retypes.h:1
static const struct IDirect3DLightVtbl d3d_light_vtbl
Definition: light.c:235
void WINAPI wined3d_mutex_unlock(void)
Definition: wined3d_main.c:373
#define DDERR_INVALIDPARAMS
Definition: ddraw.h:79
static HRESULT WINAPI d3d_light_SetLight(IDirect3DLight *iface, D3DLIGHT *data)
Definition: light.c:166
static BOOL heap_free(void *mem)
Definition: appwiz.h:75