[PATCH] d3drm: Retreive mesh name at loading time. Implement GetName and SetName.

Christian Costa titan.costa at gmail.com
Wed Apr 4 14:11:45 CDT 2012


---
 dlls/d3drm/meshbuilder.c |   61 +++++++++++++++++++++++++++++++++++++---------
 1 files changed, 49 insertions(+), 12 deletions(-)

diff --git a/dlls/d3drm/meshbuilder.c b/dlls/d3drm/meshbuilder.c
index 557a028..f9d2df5 100644
--- a/dlls/d3drm/meshbuilder.c
+++ b/dlls/d3drm/meshbuilder.c
@@ -48,6 +48,7 @@ typedef struct {
     IDirect3DRMMeshBuilder2 IDirect3DRMMeshBuilder2_iface;
     IDirect3DRMMeshBuilder3 IDirect3DRMMeshBuilder3_iface;
     LONG ref;
+    char name[128];
     DWORD nb_vertices;
     D3DVECTOR* pVertices;
     DWORD nb_normals;
@@ -408,23 +409,23 @@ static DWORD WINAPI IDirect3DRMMeshBuilder2Impl_GetAppData(IDirect3DRMMeshBuilde
 }
 
 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetName(IDirect3DRMMeshBuilder2* iface,
-                                                          LPCSTR pName)
+                                                          LPCSTR name)
 {
     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
 
-    FIXME("(%p)->(%s): stub\n", This, pName);
+    TRACE("(%p)->(%s)\n", This, name);
 
-    return E_NOTIMPL;
+    return IDirect3DRMMeshBuilder3_SetName(&This->IDirect3DRMMeshBuilder3_iface, name);
 }
 
 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetName(IDirect3DRMMeshBuilder2* iface,
-                                                          LPDWORD lpdwSize, LPSTR lpName)
+                                                          LPDWORD size, LPSTR name)
 {
     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
 
-    FIXME("(%p)->(%p,%p): stub\n", This, lpdwSize, lpName);
+    TRACE("(%p)->(%p,%p)\n", This, size, name);
 
-    return E_NOTIMPL;
+    return IDirect3DRMMeshBuilder3_GetName(&This->IDirect3DRMMeshBuilder3_iface, size, name);
 }
 
 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetClassName(IDirect3DRMMeshBuilder2* iface,
@@ -1002,23 +1003,49 @@ static DWORD WINAPI IDirect3DRMMeshBuilder3Impl_GetAppData(IDirect3DRMMeshBuilde
 }
 
 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetName(IDirect3DRMMeshBuilder3* iface,
-                                                          LPCSTR pName)
+                                                          LPCSTR name)
 {
     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
+    DWORD size;
 
-    FIXME("(%p)->(%s): stub\n", This, pName);
+    TRACE("(%p)->(%s)\n", This, name);
 
-    return E_NOTIMPL;
+    size = min(sizeof(This->name), strlen(name) + 1);
+    memcpy(This->name, name, size);
+    /* Make sure we have the terminating 0 in case of truncation */
+    This->name[size] = 0;
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetName(IDirect3DRMMeshBuilder3* iface,
-                                                          LPDWORD lpdwSize, LPSTR lpName)
+                                                          LPDWORD size, LPSTR name)
 {
     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
+    DWORD length;
 
-    FIXME("(%p)->(%p,%p): stub\n", This, lpdwSize, lpName);
+    TRACE("(%p)->(%p,%p)\n", This, size, name);
 
-    return E_NOTIMPL;
+    if (!size)
+        return E_POINTER;
+
+    length = strlen(This->name) + 1;
+
+    if (name)
+    {
+        *size = min(*size, length);
+        memcpy(name, This->name, min(*size, length));
+        /* Make sure we have the terminating 0 in case of truncation */
+        name[*size] = 0;
+        TRACE("Returning name %s\n", name);
+    }
+    else
+    {
+        *size = length;
+    }
+
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetClassName(IDirect3DRMMeshBuilder3* iface,
@@ -1052,6 +1079,16 @@ HRESULT load_mesh_data(IDirect3DRMMeshBuilder3* iface, LPDIRECTXFILEDATA pData)
 
     TRACE("(%p)->(%p)\n", This, pData);
 
+    size = sizeof(This->name);
+    hr = IDirectXFileData_GetName(pData, This->name, &size);
+    if (hr != DXFILE_OK)
+        goto end;
+
+    if (!size)
+        This->name[0] = 0;
+
+    FIXME("Mesh name is '%s'\n", This->name);
+
     hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&ptr);
     if (hr != DXFILE_OK)
         goto end;




More information about the wine-patches mailing list