Charles Welton : d3dx9: Implement Begin and End methods.
Alexandre Julliard
julliard at winehq.org
Wed Jul 6 13:31:09 CDT 2011
Module: wine
Branch: master
Commit: 8ce0495359b4eca7f894a4aa3fcb8bf32ea70fef
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8ce0495359b4eca7f894a4aa3fcb8bf32ea70fef
Author: Charles Welton <charleswfb at gmail.com>
Date: Wed Jun 29 19:08:20 2011 -0300
d3dx9: Implement Begin and End methods.
---
dlls/d3dx9_36/line.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 69 insertions(+), 4 deletions(-)
diff --git a/dlls/d3dx9_36/line.c b/dlls/d3dx9_36/line.c
index cf49642..2a9d6e9 100644
--- a/dlls/d3dx9_36/line.c
+++ b/dlls/d3dx9_36/line.c
@@ -29,6 +29,7 @@ typedef struct ID3DXLineImpl {
LONG ref;
IDirect3DDevice9 *device;
+ IDirect3DStateBlock9 *state;
} ID3DXLineImpl;
static inline ID3DXLineImpl *impl_from_ID3DXLine(ID3DXLine *iface)
@@ -100,9 +101,62 @@ static HRESULT WINAPI ID3DXLineImpl_Begin(ID3DXLine* iface)
{
ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
- FIXME("(%p)->(): stub\n", This);
+ HRESULT hr;
+ D3DXMATRIX identity, projection;
+ D3DVIEWPORT9 vp;
- return E_NOTIMPL;
+ TRACE ("(%p)->()\n", This);
+
+ if (This->state != NULL) /* We already began. Return error. */
+ return D3DERR_INVALIDCALL;
+
+ hr = IDirect3DDevice9_CreateStateBlock(This->device, D3DSBT_ALL, &This->state);
+ if (FAILED(hr)) return D3DXERR_INVALIDDATA;
+
+ hr = IDirect3DDevice9_GetViewport(This->device, &vp);
+ if (FAILED(hr)) goto failed;
+
+ D3DXMatrixIdentity(&identity);
+ D3DXMatrixOrthoOffCenterLH(&projection,
+ 0.0, vp.Width, /* Min and max x */
+ vp.Height, 0.0, /* Min and max y. Screen y is on top so this is inverted */
+ 0.0, 1.0); /* Min and max z */
+
+ hr = IDirect3DDevice9_SetTransform(This->device, D3DTS_WORLD, &identity);
+ if (FAILED(hr)) goto failed;
+
+ hr = IDirect3DDevice9_SetTransform(This->device, D3DTS_VIEW, &identity);
+ if (FAILED(hr)) goto failed;
+
+ hr = IDirect3DDevice9_SetTransform(This->device, D3DTS_PROJECTION, &projection);
+ if (FAILED(hr)) goto failed;
+
+ /* Windows sets similar states so we do the same */
+
+ hr = IDirect3DDevice9_SetRenderState(This->device, D3DRS_LIGHTING, FALSE);
+ if (FAILED(hr)) goto failed;
+
+ hr = IDirect3DDevice9_SetRenderState(This->device, D3DRS_FOGENABLE, FALSE);
+ if (FAILED(hr)) goto failed;
+
+ hr = IDirect3DDevice9_SetRenderState(This->device, D3DRS_SHADEMODE, D3DSHADE_FLAT);
+ if (FAILED(hr)) goto failed;
+
+ hr = IDirect3DDevice9_SetRenderState(This->device, D3DRS_ALPHABLENDENABLE, TRUE);
+ if (FAILED(hr)) goto failed;
+
+ hr = IDirect3DDevice9_SetRenderState(This->device, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
+ if (FAILED(hr)) goto failed;
+
+ hr = IDirect3DDevice9_SetRenderState(This->device, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
+ if (FAILED(hr)) goto failed;
+
+ return D3D_OK;
+failed:
+ IDirect3DStateBlock9_Apply(This->state);
+ IDirect3DStateBlock9_Release(This->state);
+ This->state = NULL;
+ return D3DXERR_INVALIDDATA;
}
static HRESULT WINAPI ID3DXLineImpl_Draw(ID3DXLine* iface, CONST D3DXVECTOR2* vertexlist, DWORD vertexlistcount, D3DCOLOR color)
@@ -218,9 +272,19 @@ static HRESULT WINAPI ID3DXLineImpl_End(ID3DXLine* iface)
{
ID3DXLineImpl *This = impl_from_ID3DXLine(iface);
- FIXME("(%p)->(): stub\n", This);
+ HRESULT hr;
- return E_NOTIMPL;
+ TRACE ("(%p)->()\n", This);
+
+ if (This->state == NULL) /* We haven't begun yet. */
+ return D3DERR_INVALIDCALL;
+
+ hr = IDirect3DStateBlock9_Apply(This->state);
+ IDirect3DStateBlock9_Release(This->state);
+ This->state = NULL;
+
+ if (FAILED(hr)) return D3DXERR_INVALIDDATA;
+ else return D3D_OK;
}
static HRESULT WINAPI ID3DXLineImpl_OnLostDevice(ID3DXLine* iface)
@@ -285,6 +349,7 @@ HRESULT WINAPI D3DXCreateLine(LPDIRECT3DDEVICE9 device, LPD3DXLINE* line)
object->ID3DXLine_iface.lpVtbl = &ID3DXLine_Vtbl;
object->ref = 1;
object->device = device;
+ object->state = NULL; /* We only initialize it on Begin */
IDirect3DDevice9_AddRef(device);
*line = &object->ID3DXLine_iface;
More information about the wine-cvs
mailing list