From: David Adam Subject: d3dx9_36 [patch 1/2, try 5]: Implement D3DXCreatePolygon Message-Id: Date: Tue, 15 Nov 2011 09:43:52 +0100
From 01dcd3f1d8518a27f57714184e450f6df12cde0a Mon Sep 17 00:00:00 2001 From: David Adam Date: Mon, 14 Nov 2011 04:45:27 +0100 Subject: Implement D3DXCreatePolygon --- dlls/d3dx9_36/d3dx9_36.spec | 2 +- dlls/d3dx9_36/mesh.c | 80 +++++++++++++++++++++++++++++++++++++++++++ include/d3dx9shape.h | 6 +++ 3 files changed, 87 insertions(+), 1 deletions(-) diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec index b35e95d..d656ec4 100644 --- a/dlls/d3dx9_36/d3dx9_36.spec +++ b/dlls/d3dx9_36/d3dx9_36.spec @@ -76,7 +76,7 @@ @ stub D3DXCreateNPatchMesh(ptr ptr) @ stub D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) @ stub D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) -@ stub D3DXCreatePolygon(ptr long long ptr ptr) +@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) @ stub D3DXCreatePRTBuffer(long long long ptr) @ stub D3DXCreatePRTBufferTex(long long long long ptr) @ stub D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c index d1693c4..acb92de 100644 --- a/dlls/d3dx9_36/mesh.c +++ b/dlls/d3dx9_36/mesh.c @@ -4365,6 +4365,86 @@ HRESULT WINAPI D3DXCreateBox(LPDIRECT3DDEVICE9 device, FLOAT width, FLOAT height return E_NOTIMPL; } +HRESULT WINAPI D3DXCreatePolygon(LPDIRECT3DDEVICE9 device, FLOAT length, UINT sides, LPD3DXMESH *mesh, LPD3DXBUFFER *adjacency) +{ + D3DXVECTOR3 *vertice; + DWORD *buffer; + FLOAT scale; + HRESULT hr; + ID3DXBuffer *adjacency_tmp; + ID3DXMesh *polygon; + UINT i, j; + WORD *index; + + TRACE("(%p, %f, %u, %p, %p)\n", device, length, sides, mesh, adjacency); + + if (!device || !mesh || (length < 0.0f) || (sides == 0)) return D3DERR_INVALIDCALL; + + hr = D3DXCreateMeshFVF(sides, sides + 1, D3DXMESH_MANAGED, D3DFVF_XYZ | D3DFVF_NORMAL, device, &polygon); + if (FAILED(hr)) return hr; + + hr = polygon->lpVtbl->LockVertexBuffer(polygon, D3DLOCK_DISCARD, (VOID **)&vertice); + if (FAILED(hr)) + { + ERR("LockVertexBuffer failed\n"); + polygon->lpVtbl->Release(polygon); + return hr; + } + + scale = length / sqrtf(2.0f - 2.0f * cos(2.0f * D3DX_PI / sides)); + + for (i = 0; i < sides + 1; i++) + { + vertice[2 * i].x = cos(2.0f * D3DX_PI * (i - 1) / sides) * scale; + vertice[2 * i].y = sin(2.0f * D3DX_PI * (i - 1) / sides) * scale; + vertice[2 * i].z = 0.0f; + + vertice[2 * i + 1].x = 0.0f; + vertice[2 * i + 1].y = 0.0f; + vertice[2 * i + 1].z = 1.0f; + } + vertice[0].x = 0.0f; + vertice[0].y = 0.0f; + + polygon->lpVtbl->UnlockVertexBuffer(polygon); + + hr = polygon->lpVtbl->LockIndexBuffer(polygon, D3DLOCK_DISCARD, (VOID **)&index); + if (FAILED(hr)) + { + ERR("LockIndexBuffer failed\n"); + polygon->lpVtbl->Release(polygon); + return hr; + } + + for (i = 0; i < sides; i++) + for (j = 0; j < 3; j++) + index[3 * i + j] = (j == 0) ? 0: i + j; + index[3 * sides -1] = 1; + + polygon->lpVtbl->UnlockIndexBuffer(polygon); + + *mesh = polygon; + + if (adjacency) + { + hr = D3DXCreateBuffer(3 * sides * sizeof(DWORD), &adjacency_tmp); + if (FAILED(hr)) return hr; + + buffer = (DWORD *)ID3DXBuffer_GetBufferPointer(adjacency_tmp); + + for (i = 0; i < sides; i++) + { + buffer[3 * i] = i - 1; + buffer[3 * i + 1] = 0xffffffff; + buffer[3 * i + 2] = i + 1; + } + buffer[0] = sides - 1; + *adjacency = adjacency_tmp; + } + + return D3D_OK; +} + struct vertex { D3DXVECTOR3 position; diff --git a/include/d3dx9shape.h b/include/d3dx9shape.h index 690b183..51b2430 100644 --- a/include/d3dx9shape.h +++ b/include/d3dx9shape.h @@ -32,6 +32,12 @@ HRESULT WINAPI D3DXCreateBox(LPDIRECT3DDEVICE9 device, LPD3DXMESH* mesh, LPD3DXBUFFER* adjacency); +HRESULT WINAPI D3DXCreatePolygon(LPDIRECT3DDEVICE9 device, + FLOAT length, + UINT sides, + LPD3DXMESH* mesh, + LPD3DXBUFFER* adjacency); + HRESULT WINAPI D3DXCreateSphere(LPDIRECT3DDEVICE9 device, FLOAT radius, UINT slices, -- 1.7.6