d3dx9: Implement GetBoneOffsetMatrix and SetBoneOffsetMatrix.
[wine] / dlls / d3dx9_36 / line.c
1 /*
2  * Copyright 2010 Christian Costa
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  *
18  */
19
20 #include "wine/debug.h"
21 #include "d3dx9_36_private.h"
22
23 WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
24
25 static const struct ID3DXLineVtbl ID3DXLine_Vtbl;
26
27 typedef struct ID3DXLineImpl {
28     ID3DXLine ID3DXLine_iface;
29     LONG ref;
30
31     IDirect3DDevice9 *device;
32 } ID3DXLineImpl;
33
34 static inline ID3DXLineImpl *impl_from_ID3DXLine(ID3DXLine *iface)
35 {
36     return CONTAINING_RECORD(iface, ID3DXLineImpl, ID3DXLine_iface);
37 }
38
39 /*** IUnknown methods ***/
40 static HRESULT WINAPI ID3DXLineImpl_QueryInterface(ID3DXLine* iface, REFIID riid, LPVOID* object)
41 {
42     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
43
44     TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), object);
45
46     if (IsEqualGUID(riid, &IID_IUnknown) ||
47         IsEqualGUID(riid, &IID_ID3DXLine))
48     {
49         ID3DXLine_AddRef(iface);
50         *object = This;
51         return S_OK;
52     }
53
54     ERR("Interface %s not found\n", debugstr_guid(riid));
55
56     return E_NOINTERFACE;
57 }
58
59 static ULONG WINAPI ID3DXLineImpl_AddRef(ID3DXLine* iface)
60 {
61     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
62
63     TRACE("(%p)->(): AddRef from %u\n", This, This->ref);
64
65     return InterlockedIncrement(&This->ref);
66 }
67
68 static ULONG WINAPI ID3DXLineImpl_Release(ID3DXLine* iface)
69 {
70     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
71     ULONG ref = InterlockedDecrement(&This->ref);
72
73     TRACE("(%p)->(): Release from %u\n", This, ref + 1);
74
75     if (!ref)
76     {
77         IDirect3DDevice9_Release(This->device);
78         HeapFree(GetProcessHeap(), 0, This);
79     }
80
81     return ref;
82 }
83
84 /*** ID3DXLine methods ***/
85 static HRESULT WINAPI ID3DXLineImpl_GetDevice(ID3DXLine* iface, LPDIRECT3DDEVICE9* device)
86 {
87     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
88
89     TRACE ("(%p)->(%p): relay\n", This, device);
90
91     if (device == NULL) return D3DERR_INVALIDCALL;
92
93     *device = This->device;
94     IDirect3DDevice9_AddRef(This->device);
95
96     return D3D_OK;
97 }
98
99 static HRESULT WINAPI ID3DXLineImpl_Begin(ID3DXLine* iface)
100 {
101     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
102
103     FIXME("(%p)->(): stub\n", This);
104
105     return E_NOTIMPL;
106 }
107
108 static HRESULT WINAPI ID3DXLineImpl_Draw(ID3DXLine* iface, CONST D3DXVECTOR2* vertexlist, DWORD vertexlistcount, D3DCOLOR color)
109 {
110     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
111
112     FIXME("(%p)->(%p, %u, %#x): stub\n", This, vertexlist, vertexlistcount, color);
113
114     return E_NOTIMPL;
115 }
116
117 static HRESULT WINAPI ID3DXLineImpl_DrawTransform(ID3DXLine* iface, CONST D3DXVECTOR3* vertexlist, DWORD vertexlistcount,
118                                                   CONST D3DXMATRIX* transform, D3DCOLOR color)
119 {
120     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
121
122     FIXME("(%p)->(%p, %u, %p, %#x): stub\n", This, vertexlist, vertexlistcount, transform, color);
123
124     return E_NOTIMPL;
125 }
126
127 static HRESULT WINAPI ID3DXLineImpl_SetPattern(ID3DXLine* iface, DWORD pattern)
128 {
129     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
130
131     FIXME("(%p)->(%#x): stub\n", This, pattern);
132
133     return E_NOTIMPL;
134 }
135
136 static DWORD WINAPI ID3DXLineImpl_GetPattern(ID3DXLine* iface)
137 {
138     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
139
140     FIXME("(%p)->(): stub\n", This);
141
142     return 0xFFFFFFFF;
143 }
144
145 static HRESULT WINAPI ID3DXLineImpl_SetPatternScale(ID3DXLine* iface, FLOAT scale)
146 {
147     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
148
149     FIXME("(%p)->(%f): stub\n", This, scale);
150
151     return E_NOTIMPL;
152 }
153
154 static FLOAT WINAPI ID3DXLineImpl_GetPatternScale(ID3DXLine* iface)
155 {
156     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
157
158     FIXME("(%p)->(): stub\n", This);
159
160     return 1.0f;
161 }
162
163 static HRESULT WINAPI ID3DXLineImpl_SetWidth(ID3DXLine* iface, FLOAT width)
164 {
165     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
166
167     FIXME("(%p)->(%f): stub\n", This, width);
168
169     return E_NOTIMPL;
170 }
171
172 static FLOAT WINAPI ID3DXLineImpl_GetWidth(ID3DXLine* iface)
173 {
174     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
175
176     FIXME("(%p)->(): stub\n", This);
177
178     return 1.0f;
179 }
180
181 static HRESULT WINAPI ID3DXLineImpl_SetAntialias(ID3DXLine* iface, BOOL antialias)
182 {
183     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
184
185     FIXME("(%p)->(%u): stub\n", This, antialias);
186
187     return E_NOTIMPL;
188 }
189
190 static BOOL WINAPI ID3DXLineImpl_GetAntialias(ID3DXLine* iface)
191 {
192     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
193
194     FIXME("(%p)->(): stub\n", This);
195
196     return FALSE;
197 }
198
199 static HRESULT WINAPI ID3DXLineImpl_SetGLLines(ID3DXLine* iface, BOOL gl_lines)
200 {
201     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
202
203     FIXME("(%p)->(%u): stub\n", This, gl_lines);
204
205     return E_NOTIMPL;
206 }
207
208 static BOOL WINAPI ID3DXLineImpl_GetGLLines(ID3DXLine* iface)
209 {
210     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
211
212     FIXME("(%p)->(): stub\n", This);
213
214     return FALSE;
215 }
216
217 static HRESULT WINAPI ID3DXLineImpl_End(ID3DXLine* iface)
218 {
219     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
220
221     FIXME("(%p)->(): stub\n", This);
222
223     return E_NOTIMPL;
224 }
225
226 static HRESULT WINAPI ID3DXLineImpl_OnLostDevice(ID3DXLine* iface)
227 {
228     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
229
230     FIXME("(%p)->(): stub\n", This);
231
232     return E_NOTIMPL;
233 }
234 static HRESULT WINAPI ID3DXLineImpl_OnResetDevice(ID3DXLine* iface)
235 {
236     ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
237
238     FIXME("(%p)->(): stub\n", This);
239
240     return E_NOTIMPL;
241 }
242
243 static const struct ID3DXLineVtbl ID3DXLine_Vtbl =
244 {
245     /*** IUnknown methods ***/
246     ID3DXLineImpl_QueryInterface,
247     ID3DXLineImpl_AddRef,
248     ID3DXLineImpl_Release,
249     /*** ID3DXLine methods ***/
250     ID3DXLineImpl_GetDevice,
251     ID3DXLineImpl_Begin,
252     ID3DXLineImpl_Draw,
253     ID3DXLineImpl_DrawTransform,
254     ID3DXLineImpl_SetPattern,
255     ID3DXLineImpl_GetPattern,
256     ID3DXLineImpl_SetPatternScale,
257     ID3DXLineImpl_GetPatternScale,
258     ID3DXLineImpl_SetWidth,
259     ID3DXLineImpl_GetWidth,
260     ID3DXLineImpl_SetAntialias,
261     ID3DXLineImpl_GetAntialias,
262     ID3DXLineImpl_SetGLLines,
263     ID3DXLineImpl_GetGLLines,
264     ID3DXLineImpl_End,
265     ID3DXLineImpl_OnLostDevice,
266     ID3DXLineImpl_OnResetDevice
267 };
268
269 HRESULT WINAPI D3DXCreateLine(LPDIRECT3DDEVICE9 device, LPD3DXLINE* line)
270 {
271     ID3DXLineImpl* object;
272
273     TRACE("(%p, %p)\n", device, line);
274
275     if (!device || !line)
276         return D3DERR_INVALIDCALL;
277
278     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXLineImpl));
279     if (!object)
280     {
281         ERR("Out of memory\n");
282         return E_OUTOFMEMORY;
283     }
284
285     object->ID3DXLine_iface.lpVtbl = &ID3DXLine_Vtbl;
286     object->ref = 1;
287     object->device = device;
288     IDirect3DDevice9_AddRef(device);
289
290     *line = &object->ID3DXLine_iface;
291
292     return D3D_OK;
293 }