Dylan Smith : d3dx9: Create compact_mesh helper function for OptimizeInplace.

Alexandre Julliard julliard at winehq.org
Wed May 11 13:02:57 CDT 2011


Module: wine
Branch: master
Commit: 4ed3930e276f59061e26cdbc6ac14cfb0030433d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4ed3930e276f59061e26cdbc6ac14cfb0030433d

Author: Dylan Smith <dylan.ah.smith at gmail.com>
Date:   Wed May 11 05:30:41 2011 -0400

d3dx9: Create compact_mesh helper function for OptimizeInplace.

---

 dlls/d3dx9_36/mesh.c |   78 +++++++++++++++++++++++++++++--------------------
 1 files changed, 46 insertions(+), 32 deletions(-)

diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c
index eca9332..95b967b 100644
--- a/dlls/d3dx9_36/mesh.c
+++ b/dlls/d3dx9_36/mesh.c
@@ -652,6 +652,48 @@ static HRESULT WINAPI ID3DXMeshImpl_Optimize(ID3DXMesh *iface, DWORD flags, CONS
     return E_NOTIMPL;
 }
 
+/* Creates a vertex_remap that removes unused vertices.
+ * Indices are updated according to the vertex_remap. */
+static HRESULT compact_mesh(ID3DXMeshImpl *This, DWORD *indices, DWORD *new_num_vertices, ID3DXBuffer **vertex_remap)
+{
+    HRESULT hr;
+    DWORD *vertex_remap_ptr;
+    DWORD num_used_vertices;
+    DWORD i;
+
+    hr = D3DXCreateBuffer(This->numvertices * sizeof(DWORD), vertex_remap);
+    if (FAILED(hr)) return hr;
+    vertex_remap_ptr = ID3DXBuffer_GetBufferPointer(*vertex_remap);
+
+    for (i = 0; i < This->numfaces * 3; i++)
+        vertex_remap_ptr[indices[i]] = 1;
+
+    /* create old->new vertex mapping */
+    num_used_vertices = 0;
+    for (i = 0; i < This->numvertices; i++) {
+        if (vertex_remap_ptr[i])
+            vertex_remap_ptr[i] = num_used_vertices++;
+        else
+            vertex_remap_ptr[i] = -1;
+    }
+    /* convert indices */
+    for (i = 0; i < This->numfaces * 3; i++)
+        indices[i] = vertex_remap_ptr[indices[i]];
+
+    /* create new->old vertex mapping */
+    num_used_vertices = 0;
+    for (i = 0; i < This->numvertices; i++) {
+        if (vertex_remap_ptr[i] != -1)
+            vertex_remap_ptr[num_used_vertices++] = i;
+    }
+    for (i = num_used_vertices; i < This->numvertices; i++)
+        vertex_remap_ptr[i] = -1;
+
+    *new_num_vertices = num_used_vertices;
+
+    return D3D_OK;
+}
+
 static HRESULT WINAPI ID3DXMeshImpl_OptimizeInplace(ID3DXMesh *iface, DWORD flags, CONST DWORD *adjacency_in, DWORD *adjacency_out,
                                                     DWORD *face_remap_out, LPD3DXBUFFER *vertex_remap_out)
 {
@@ -661,7 +703,7 @@ static HRESULT WINAPI ID3DXMeshImpl_OptimizeInplace(ID3DXMesh *iface, DWORD flag
     ID3DXBuffer *vertex_remap = NULL;
     DWORD *dword_indices = NULL;
     DWORD new_num_vertices = 0;
-    DWORD new_vertex_buffer_size = 0;
+    DWORD new_num_alloc_vertices = 0;
     IDirect3DVertexBuffer9 *vertex_buffer = NULL;
     DWORD i;
 
@@ -700,36 +742,9 @@ static HRESULT WINAPI ID3DXMeshImpl_OptimizeInplace(ID3DXMesh *iface, DWORD flag
 
     if ((flags & (D3DXMESHOPT_COMPACT | D3DXMESHOPT_IGNOREVERTS)) == D3DXMESHOPT_COMPACT)
     {
-        /* Remove unused vertices. */
-        DWORD *vertex_remap_ptr;
-
-        new_vertex_buffer_size = This->numvertices;
-        hr = D3DXCreateBuffer(This->numvertices * sizeof(DWORD), &vertex_remap);
+        new_num_alloc_vertices = This->numvertices;
+        hr = compact_mesh(This, dword_indices, &new_num_vertices, &vertex_remap);
         if (FAILED(hr)) goto cleanup;
-        vertex_remap_ptr = ID3DXBuffer_GetBufferPointer(vertex_remap);
-
-        for (i = 0; i < This->numfaces * 3; i++)
-            vertex_remap_ptr[dword_indices[i]] = 1;
-
-        /* create old->new vertex mapping */
-        for (i = 0; i < This->numvertices; i++) {
-            if (vertex_remap_ptr[i])
-                vertex_remap_ptr[i] = new_num_vertices++;
-            else
-                vertex_remap_ptr[i] = -1;
-        }
-        /* convert indices */
-        for (i = 0; i < This->numfaces * 3; i++)
-            dword_indices[i] = vertex_remap_ptr[dword_indices[i]];
-
-        /* create new->old vertex mapping */
-        new_num_vertices = 0;
-        for (i = 0; i < This->numvertices; i++) {
-            if (vertex_remap_ptr[i] != -1)
-                vertex_remap_ptr[new_num_vertices++] = i;
-        }
-        for (i = new_num_vertices; i < This->numvertices; i++)
-            vertex_remap_ptr[i] = -1;
     }
 
     if (vertex_remap)
@@ -744,8 +759,7 @@ static HRESULT WINAPI ID3DXMeshImpl_OptimizeInplace(ID3DXMesh *iface, DWORD flag
         hr = IDirect3DVertexBuffer9_GetDesc(This->vertex_buffer, &vertex_desc);
         if (FAILED(hr)) goto cleanup;
 
-        new_vertex_buffer_size *= vertex_size;
-        hr = IDirect3DDevice9_CreateVertexBuffer(This->device, new_vertex_buffer_size,
+        hr = IDirect3DDevice9_CreateVertexBuffer(This->device, new_num_alloc_vertices * vertex_size,
                 vertex_desc.Usage, This->fvf, vertex_desc.Pool, &vertex_buffer, NULL);
         if (FAILED(hr)) goto cleanup;
 




More information about the wine-cvs mailing list