From: David Adam Subject: d3dx9_36 [patch 1/2, resent]: Implement D3DXCreatePolygon Message-Id: Date: Mon, 31 Oct 2011 01:45:08 +0100 Fix a possible crash when calling D3DXCreateMeshFVF. A+ David Fix a possible crash when calling D3DXCreateMeshFVF.

A+

David
From 5ea4a204acd81c560ab20fb7b00774b716340eb3 Mon Sep 17 00:00:00 2001 From: David Adam Date: Mon, 31 Oct 2011 01:29:33 +0100 Subject: Implement D3DXCreatePolygon --- dlls/d3dx9_36/d3dx9_36.spec | 2 +- dlls/d3dx9_36/mesh.c | 96 +++++++++++++++++++++++++++++++++++++++++++ include/d3dx9shape.h | 6 +++ 3 files changed, 103 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..713ba73 100644 --- a/dlls/d3dx9_36/mesh.c +++ b/dlls/d3dx9_36/mesh.c @@ -4364,6 +4364,102 @@ 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) +{ + BYTE *data; + D3DXVECTOR3 unit, *vertice; + DWORD *buffer; + FLOAT scale; + HRESULT hr; + ID3DXBuffer *adjacency_tmp; + ID3DXMesh *polygon; + UINT i, j; + WORD *index; + + TRACE("(%p, %f, %u, %p, %p): stub\n", device, length, sides, mesh, adjacency); + + if ( !device || !mesh || (length < 0.0f) || (sides == 0) ) return D3DERR_INVALIDCALL; + + hr = D3DXCreateMeshFVF((DWORD)sides, (DWORD)(sides + 1), D3DXMESH_MANAGED, D3DFVF_XYZ | D3DFVF_NORMAL, device, &polygon); + if ( FAILED(hr) ) return hr; + + hr = (polygon)->lpVtbl->LockVertexBuffer(polygon, D3DLOCK_DISCARD, (VOID **)&data); + if ( FAILED(hr) ) + { + TRACE("LockVertexBuffer failed\n"); + return hr; + } + + vertice = HeapAlloc(GetProcessHeap(), 0, 2 * (sides + 1) * sizeof(D3DXVECTOR3)); + if ( !vertice ) + { + TRACE("Not memory enough for vertex buffer\n"); + return E_OUTOFMEMORY; + } + + scale = length / sqrtf(2.0f - 2.0f * cos(2.0f * D3DX_PI / sides)); + unit.z = 0.0f; + + for (i=0; i < sides + 1; i++) + { + unit.x = cos(2.0f * D3DX_PI * (i - 1) / sides); + unit.y = sin(2.0f * D3DX_PI * (i - 1) / sides); + D3DXVec3Scale(&(vertice[2 * i]), &unit, scale); + + 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; + memcpy(data, vertice, 2 * (sides + 1) * sizeof(D3DXVECTOR3)); + (polygon)->lpVtbl->UnlockVertexBuffer(polygon); + HeapFree(GetProcessHeap(), 0, vertice); + + hr = (polygon)->lpVtbl->LockIndexBuffer(polygon, D3DLOCK_DISCARD, (VOID **)&data); + if ( FAILED(hr) ) + { + TRACE("LockIndexBuffer failed\n"); + return hr; + } + + index = HeapAlloc(GetProcessHeap(), 0, 3 * sides * sizeof(WORD)); + if ( !index ) + { + TRACE("Not memory enough for index buffer\n"); + return E_OUTOFMEMORY; + } + + 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; + memcpy(data, index, 3 * sides * sizeof(WORD)); + (polygon)->lpVtbl->UnlockIndexBuffer(polygon); + HeapFree(GetProcessHeap(), 0, index); + + *mesh = polygon; + + if(adjacency) + { + hr = D3DXCreateBuffer(3 * ((DWORD)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 { 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