David Adam : d3dx9: Improve vertices computation in D3DXCreatePolygon().

Alexandre Julliard julliard at winehq.org
Wed Mar 14 17:37:18 CDT 2018


Module: wine
Branch: master
Commit: 32ffef33339206195919023bcff112465478ad74
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=32ffef33339206195919023bcff112465478ad74

Author: David Adam <david.adam.cnrs at gmail.com>
Date:   Wed Mar 14 19:53:17 2018 +0100

d3dx9: Improve vertices computation in D3DXCreatePolygon().

Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/d3dx9_36/mesh.c       | 10 ++++++----
 dlls/d3dx9_36/tests/mesh.c | 11 +++++++----
 2 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c
index fc23745..62acd21 100644
--- a/dlls/d3dx9_36/mesh.c
+++ b/dlls/d3dx9_36/mesh.c
@@ -4565,7 +4565,7 @@ HRESULT WINAPI D3DXCreatePolygon(struct IDirect3DDevice9 *device, float length,
     struct vertex *vertices;
     WORD (*faces)[3];
     DWORD (*adjacency_buf)[3];
-    float scale;
+    float angle, scale;
     unsigned int i;
 
     TRACE("device %p, length %f, sides %u, mesh %p, adjacency %p.\n",
@@ -4593,7 +4593,9 @@ HRESULT WINAPI D3DXCreatePolygon(struct IDirect3DDevice9 *device, float length,
         return hr;
     }
 
-    scale = 0.5f * length / sinf(D3DX_PI / sides);
+    angle = D3DX_PI / sides;
+    scale = 0.5f * length / sinf(angle);
+    angle *= 2.0f;
 
     vertices[0].position.x = 0.0f;
     vertices[0].position.y = 0.0f;
@@ -4604,8 +4606,8 @@ HRESULT WINAPI D3DXCreatePolygon(struct IDirect3DDevice9 *device, float length,
 
     for (i = 0; i < sides; ++i)
     {
-        vertices[i + 1].position.x = cosf(2.0f * D3DX_PI * i / sides) * scale;
-        vertices[i + 1].position.y = sinf(2.0f * D3DX_PI * i / sides) * scale;
+        vertices[i + 1].position.x = cosf(angle * i) * scale;
+        vertices[i + 1].position.y = sinf(angle * i) * scale;
         vertices[i + 1].position.z = 0.0f;
         vertices[i + 1].normal.x = 0.0f;
         vertices[i + 1].normal.y = 0.0f;
diff --git a/dlls/d3dx9_36/tests/mesh.c b/dlls/d3dx9_36/tests/mesh.c
index 82ae90e..8fd5938 100644
--- a/dlls/d3dx9_36/tests/mesh.c
+++ b/dlls/d3dx9_36/tests/mesh.c
@@ -2683,12 +2683,14 @@ static void D3DXCreateBoxTest(void)
 static BOOL compute_polygon(struct mesh *mesh, float length, unsigned int sides)
 {
     unsigned int i;
-    float scale;
+    float angle, scale;
 
     if (!new_mesh(mesh, sides + 1, sides))
         return FALSE;
 
-    scale = 0.5f * length / sinf(D3DX_PI / sides);
+    angle = D3DX_PI / sides;
+    scale = 0.5f * length / sinf(angle);
+    angle *= 2.0f;
 
     mesh->vertices[0].position.x = 0.0f;
     mesh->vertices[0].position.y = 0.0f;
@@ -2699,8 +2701,8 @@ static BOOL compute_polygon(struct mesh *mesh, float length, unsigned int sides)
 
     for (i = 0; i < sides; ++i)
     {
-        mesh->vertices[i + 1].position.x = cosf(2.0f * D3DX_PI * i / sides) * scale;
-        mesh->vertices[i + 1].position.y = sinf(2.0f * D3DX_PI * i / sides) * scale;
+        mesh->vertices[i + 1].position.x = cosf(angle * i) * scale;
+        mesh->vertices[i + 1].position.y = sinf(angle * i) * scale;
         mesh->vertices[i + 1].position.z = 0.0f;
         mesh->vertices[i + 1].normal.x = 0.0f;
         mesh->vertices[i + 1].normal.y = 0.0f;
@@ -2807,6 +2809,7 @@ static void D3DXCreatePolygonTest(void)
     test_polygon(device, 10.0f, 5);
     test_polygon(device, 10.0f, 10);
     test_polygon(device, 20.0f, 10);
+    test_polygon(device, 20.0f, 32000);
 
     free_test_context(test_context);
 }




More information about the wine-cvs mailing list