2 * Copyright 2010 Christian Costa
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.
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.
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
20 #include "d3dx9_36_private.h"
24 ID3DXLine ID3DXLine_iface
;
27 IDirect3DDevice9
*device
;
28 IDirect3DStateBlock9
*state
;
31 static inline struct d3dx9_line
*impl_from_ID3DXLine(ID3DXLine
*iface
)
33 return CONTAINING_RECORD(iface
, struct d3dx9_line
, ID3DXLine_iface
);
36 static HRESULT WINAPI
d3dx9_line_QueryInterface(ID3DXLine
*iface
, REFIID riid
, void **out
)
38 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
40 if (IsEqualGUID(riid
, &IID_ID3DXLine
)
41 || IsEqualGUID(riid
, &IID_IUnknown
))
43 ID3DXLine_AddRef(iface
);
48 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
54 static ULONG WINAPI
d3dx9_line_AddRef(ID3DXLine
*iface
)
56 struct d3dx9_line
*line
= impl_from_ID3DXLine(iface
);
57 ULONG refcount
= InterlockedIncrement(&line
->ref
);
59 TRACE("%p increasing refcount to %u.\n", line
, refcount
);
64 static ULONG WINAPI
d3dx9_line_Release(ID3DXLine
*iface
)
66 struct d3dx9_line
*line
= impl_from_ID3DXLine(iface
);
67 ULONG refcount
= InterlockedDecrement(&line
->ref
);
69 TRACE("%p decreasing refcount to %u.\n", line
, refcount
);
73 IDirect3DDevice9_Release(line
->device
);
74 HeapFree(GetProcessHeap(), 0, line
);
80 static HRESULT WINAPI
d3dx9_line_GetDevice(struct ID3DXLine
*iface
, struct IDirect3DDevice9
**device
)
82 struct d3dx9_line
*line
= impl_from_ID3DXLine(iface
);
84 TRACE("iface %p, device %p.\n", iface
, line
);
87 return D3DERR_INVALIDCALL
;
89 *device
= line
->device
;
90 IDirect3DDevice9_AddRef(line
->device
);
95 static HRESULT WINAPI
d3dx9_line_Begin(ID3DXLine
*iface
)
97 struct d3dx9_line
*line
= impl_from_ID3DXLine(iface
);
98 D3DXMATRIX identity
, projection
;
101 TRACE("iface %p.\n", iface
);
104 return D3DERR_INVALIDCALL
;
106 if (FAILED(IDirect3DDevice9_CreateStateBlock(line
->device
, D3DSBT_ALL
, &line
->state
)))
107 return D3DXERR_INVALIDDATA
;
109 if (FAILED(IDirect3DDevice9_GetViewport(line
->device
, &vp
)))
112 D3DXMatrixIdentity(&identity
);
113 D3DXMatrixOrthoOffCenterLH(&projection
, 0.0, (FLOAT
)vp
.Width
, (FLOAT
)vp
.Height
, 0.0, 0.0, 1.0);
115 if (FAILED(IDirect3DDevice9_SetTransform(line
->device
, D3DTS_WORLD
, &identity
)))
117 if (FAILED(IDirect3DDevice9_SetTransform(line
->device
, D3DTS_VIEW
, &identity
)))
119 if (FAILED(IDirect3DDevice9_SetTransform(line
->device
, D3DTS_PROJECTION
, &projection
)))
122 if (FAILED(IDirect3DDevice9_SetRenderState(line
->device
, D3DRS_LIGHTING
, FALSE
)))
124 if (FAILED(IDirect3DDevice9_SetRenderState(line
->device
, D3DRS_FOGENABLE
, FALSE
)))
126 if (FAILED(IDirect3DDevice9_SetRenderState(line
->device
, D3DRS_SHADEMODE
, D3DSHADE_FLAT
)))
128 if (FAILED(IDirect3DDevice9_SetRenderState(line
->device
, D3DRS_ALPHABLENDENABLE
, TRUE
)))
130 if (FAILED(IDirect3DDevice9_SetRenderState(line
->device
, D3DRS_SRCBLEND
, D3DBLEND_SRCALPHA
)))
132 if (FAILED(IDirect3DDevice9_SetRenderState(line
->device
, D3DRS_DESTBLEND
, D3DBLEND_INVSRCALPHA
)))
138 IDirect3DStateBlock9_Apply(line
->state
);
139 IDirect3DStateBlock9_Release(line
->state
);
141 return D3DXERR_INVALIDDATA
;
144 static HRESULT WINAPI
d3dx9_line_Draw(ID3DXLine
*iface
, const D3DXVECTOR2
*vertex_list
,
145 DWORD vertex_list_count
, D3DCOLOR color
)
147 FIXME("iface %p, vertex_list %p, vertex_list_count %u, color 0x%08x stub!\n",
148 iface
, vertex_list
, vertex_list_count
, color
);
153 static HRESULT WINAPI
d3dx9_line_DrawTransform(ID3DXLine
*iface
, const D3DXVECTOR3
*vertex_list
,
154 DWORD vertex_list_count
, const D3DXMATRIX
*transform
, D3DCOLOR color
)
156 FIXME("iface %p, vertex_list %p, vertex_list_count %u, transform %p, color 0x%08x stub!\n",
157 iface
, vertex_list
, vertex_list_count
, transform
, color
);
162 static HRESULT WINAPI
d3dx9_line_SetPattern(ID3DXLine
*iface
, DWORD pattern
)
164 FIXME("iface %p, pattern 0x%08x stub!\n", iface
, pattern
);
169 static DWORD WINAPI
d3dx9_line_GetPattern(ID3DXLine
*iface
)
171 FIXME("iface %p stub!\n", iface
);
176 static HRESULT WINAPI
d3dx9_line_SetPatternScale(ID3DXLine
*iface
, float scale
)
178 FIXME("iface %p, scale %.8e stub!\n", iface
, scale
);
183 static float WINAPI
d3dx9_line_GetPatternScale(ID3DXLine
*iface
)
185 FIXME("iface %p stub!\n", iface
);
190 static HRESULT WINAPI
d3dx9_line_SetWidth(ID3DXLine
*iface
, float width
)
192 FIXME("iface %p, width %.8e stub!\n", iface
, width
);
197 static float WINAPI
d3dx9_line_GetWidth(ID3DXLine
*iface
)
199 FIXME("iface %p stub!\n", iface
);
204 static HRESULT WINAPI
d3dx9_line_SetAntialias(ID3DXLine
*iface
, BOOL antialias
)
206 FIXME("iface %p, antialias %#x stub!\n", iface
, antialias
);
211 static BOOL WINAPI
d3dx9_line_GetAntialias(ID3DXLine
*iface
)
213 FIXME("iface %p stub!\n", iface
);
218 static HRESULT WINAPI
d3dx9_line_SetGLLines(ID3DXLine
*iface
, BOOL gl_lines
)
220 FIXME("iface %p, gl_lines %#x stub!\n", iface
, gl_lines
);
225 static BOOL WINAPI
d3dx9_line_GetGLLines(ID3DXLine
*iface
)
227 FIXME("iface %p stub!\n", iface
);
232 static HRESULT WINAPI
d3dx9_line_End(ID3DXLine
*iface
)
234 struct d3dx9_line
*line
= impl_from_ID3DXLine(iface
);
238 TRACE("iface %p.\n", iface
);
241 return D3DERR_INVALIDCALL
;
243 hr
= IDirect3DStateBlock9_Apply(line
->state
);
244 IDirect3DStateBlock9_Release(line
->state
);
248 return D3DXERR_INVALIDDATA
;
253 static HRESULT WINAPI
d3dx9_line_OnLostDevice(ID3DXLine
*iface
)
255 FIXME("iface %p stub!\n", iface
);
259 static HRESULT WINAPI
d3dx9_line_OnResetDevice(ID3DXLine
*iface
)
261 FIXME("iface %p stub!\n", iface
);
266 static const struct ID3DXLineVtbl d3dx9_line_vtbl
=
268 d3dx9_line_QueryInterface
,
271 d3dx9_line_GetDevice
,
274 d3dx9_line_DrawTransform
,
275 d3dx9_line_SetPattern
,
276 d3dx9_line_GetPattern
,
277 d3dx9_line_SetPatternScale
,
278 d3dx9_line_GetPatternScale
,
281 d3dx9_line_SetAntialias
,
282 d3dx9_line_GetAntialias
,
283 d3dx9_line_SetGLLines
,
284 d3dx9_line_GetGLLines
,
286 d3dx9_line_OnLostDevice
,
287 d3dx9_line_OnResetDevice
,
290 HRESULT WINAPI
D3DXCreateLine(struct IDirect3DDevice9
*device
, struct ID3DXLine
**line
)
292 struct d3dx9_line
*object
;
294 TRACE("device %p, line %p.\n", device
, line
);
296 if (!device
|| !line
)
297 return D3DERR_INVALIDCALL
;
299 if (!(object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
))))
300 return E_OUTOFMEMORY
;
302 object
->ID3DXLine_iface
.lpVtbl
= &d3dx9_line_vtbl
;
304 object
->device
= device
;
305 IDirect3DDevice9_AddRef(device
);
307 *line
= &object
->ID3DXLine_iface
;