[PATCH] d3drm: Load object only if it is top level and requested or if it is part of another object.

Christian Costa titan.costa at gmail.com
Wed Dec 5 02:52:15 CST 2012


---
 dlls/d3drm/d3drm.c |  130 ++++++++++++++++++++++++++++------------------------
 1 file changed, 70 insertions(+), 60 deletions(-)

diff --git a/dlls/d3drm/d3drm.c b/dlls/d3drm/d3drm.c
index 7261eb2..2fe4fce 100644
--- a/dlls/d3drm/d3drm.c
+++ b/dlls/d3drm/d3drm.c
@@ -1272,6 +1272,8 @@ static HRESULT load_data(IDirect3DRM3* iface, LPDIRECTXFILEDATA data_object, LPI
 
     TRACE("Found object type whose GUID = %s\n", debugstr_guid(guid));
 
+    /* Load object only if it is top level and requested or if it is part of another object */
+
     if (IsEqualGUID(guid, &TID_D3DRMMesh))
     {
         TRACE("Found TID_D3DRMMesh\n");
@@ -1285,30 +1287,34 @@ static HRESULT load_data(IDirect3DRM3* iface, LPDIRECTXFILEDATA data_object, LPI
                 break;
             }
 
-        if (requested)
+        if (requested || parent_frame)
         {
-            LPDIRECT3DRMMESHBUILDER3 meshbuilder;
+            IDirect3DRMMeshBuilder3 *meshbuilder;
 
-            TRACE("Load mesh data and notify application\n");
+            TRACE("Load mesh data\n");
 
             hr = IDirect3DRM3_CreateMeshBuilder(iface, &meshbuilder);
             if (SUCCEEDED(hr))
             {
-                LPDIRECT3DRMOBJECT object = NULL;
-
-                hr = IDirect3DRMMeshBuilder3_QueryInterface(meshbuilder, GUIDs[i], (void**)&object);
+                hr = load_mesh_data(meshbuilder, data_object);
                 if (SUCCEEDED(hr))
                 {
-                    hr = load_mesh_data(meshbuilder, data_object);
-                    if (SUCCEEDED(hr))
+                    /* Only top level objects are notified */
+                    if (!parent_frame)
                     {
-                        /* Only top level objects are notified */
-                        if (parent_frame)
-                            IDirect3DRMFrame3_AddVisual(parent_frame, (IUnknown*)meshbuilder);
-                        else
+                        IDirect3DRMObject *object;
+
+                        hr = IDirect3DRMMeshBuilder3_QueryInterface(meshbuilder, GUIDs[i], (void**)&object);
+                        if (SUCCEEDED(hr))
+                        {
                             LoadProc(object, GUIDs[i], ArgLP);
+                            IDirect3DRMObject_Release(object);
+                        }
+                    }
+                    else
+                    {
+                        IDirect3DRMFrame3_AddVisual(parent_frame, (IUnknown*)meshbuilder);
                     }
-                    IDirect3DRMObject_Release(object);
                 }
                 IDirect3DRMMeshBuilder3_Release(meshbuilder);
             }
@@ -1330,68 +1336,69 @@ static HRESULT load_data(IDirect3DRM3* iface, LPDIRECTXFILEDATA data_object, LPI
                 break;
             }
 
-        if (requested)
+        if (requested || parent_frame)
         {
-            LPDIRECT3DRMFRAME3 frame;
+            IDirect3DRMFrame3 *frame;
 
-            TRACE("Load frame data and notify application\n");
+            TRACE("Load frame data\n");
 
             hr = IDirect3DRM3_CreateFrame(iface, parent_frame, &frame);
             if (SUCCEEDED(hr))
             {
-                LPDIRECT3DRMOBJECT object;
+                IDirectXFileObject *child;
 
-                hr = IDirect3DRMFrame3_QueryInterface(frame, GUIDs[i], (void**)&object);
-                if (SUCCEEDED(hr))
+                while (SUCCEEDED(hr = IDirectXFileData_GetNextObject(data_object, &child)))
                 {
-                    LPDIRECTXFILEOBJECT child;
+                    IDirectXFileData *data;
+                    IDirectXFileDataReference *reference;
+                    IDirectXFileBinary *binary;
 
-                    while (SUCCEEDED(hr = IDirectXFileData_GetNextObject(data_object, &child)))
+                    hr = IDirectXFileObject_QueryInterface(child, &IID_IDirectXFileBinary, (void **)&binary);
+                    if (SUCCEEDED(hr))
                     {
-                        LPDIRECTXFILEDATA data;
-                        LPDIRECTXFILEDATAREFERENCE reference;
-                        LPDIRECTXFILEBINARY binary;
-
-                        hr = IDirectXFileObject_QueryInterface(child, &IID_IDirectXFileBinary, (void **)&binary);
-                        if (SUCCEEDED(hr))
-                        {
-                            FIXME("Binary Object not supported yet\n");
-                            IDirectXFileBinary_Release(binary);
-                            continue;
-                        }
-
-                        hr = IDirectXFileObject_QueryInterface(child, &IID_IDirectXFileData, (void **)&data);
-                        if (SUCCEEDED(hr))
-                        {
-                            TRACE("Found Data Object\n");
-                            hr = load_data(iface, data, GUIDs, nb_GUIDs, LoadProc, ArgLP, LoadTextureProc, ArgLTP, frame);
-                            IDirectXFileData_Release(data);
-                            continue;
-                        }
-                        hr = IDirectXFileObject_QueryInterface(child, &IID_IDirectXFileDataReference, (void **)&reference);
-                        if (SUCCEEDED(hr))
-                        {
-                            TRACE("Found Data Object Reference\n");
-                            IDirectXFileDataReference_Resolve(reference, &data);
-                            hr = load_data(iface, data, GUIDs, nb_GUIDs, LoadProc, ArgLP, LoadTextureProc, ArgLTP, frame);
-                            IDirectXFileData_Release(data);
-                            IDirectXFileDataReference_Release(reference);
-                            continue;
-                        }
+                        FIXME("Binary Object not supported yet\n");
+                        IDirectXFileBinary_Release(binary);
+                        continue;
                     }
 
-                    if (hr != DXFILEERR_NOMOREOBJECTS)
+                    hr = IDirectXFileObject_QueryInterface(child, &IID_IDirectXFileData, (void **)&data);
+                    if (SUCCEEDED(hr))
                     {
-                        IDirect3DRMObject_Release(object);
-                        IDirect3DRMFrame3_Release(frame);
-                        goto end;
+                        TRACE("Found Data Object\n");
+                        hr = load_data(iface, data, GUIDs, nb_GUIDs, LoadProc, ArgLP, LoadTextureProc, ArgLTP, frame);
+                        IDirectXFileData_Release(data);
+                        continue;
                     }
-                    hr = S_OK;
+                    hr = IDirectXFileObject_QueryInterface(child, &IID_IDirectXFileDataReference, (void **)&reference);
+                    if (SUCCEEDED(hr))
+                    {
+                        TRACE("Found Data Object Reference\n");
+                        IDirectXFileDataReference_Resolve(reference, &data);
+                        hr = load_data(iface, data, GUIDs, nb_GUIDs, LoadProc, ArgLP, LoadTextureProc, ArgLTP, frame);
+                        IDirectXFileData_Release(data);
+                        IDirectXFileDataReference_Release(reference);
+                        continue;
+                    }
+                }
 
-                    /* Only top level objects are notified */
-                    if (!parent_frame)
+                if (hr != DXFILEERR_NOMOREOBJECTS)
+                {
+                    IDirect3DRMFrame3_Release(frame);
+                    goto end;
+                }
+                hr = S_OK;
+
+                /* Only top level objects are notified */
+                if (!parent_frame)
+                {
+                    IDirect3DRMObject *object;
+
+                    hr = IDirect3DRMFrame3_QueryInterface(frame, GUIDs[i], (void**)&object);
+                    if (SUCCEEDED(hr))
+                    {
                         LoadProc(object, GUIDs[i], ArgLP);
-                    IDirect3DRMObject_Release(object);
+                        IDirect3DRMObject_Release(object);
+                    }
                 }
                 IDirect3DRMFrame3_Release(frame);
             }
@@ -1402,12 +1409,15 @@ static HRESULT load_data(IDirect3DRM3* iface, LPDIRECTXFILEDATA data_object, LPI
     }
     else if (IsEqualGUID(guid, &TID_D3DRMMaterial))
     {
-        TRACE("Found TID_D3DRMMaterial => Will be taken into account when a mesh will reference it\n");
+        TRACE("Found TID_D3DRMMaterial\n");
+
+        /* Cannot be requested so nothing to do */
     }
     else if (IsEqualGUID(guid, &TID_D3DRMFrameTransformMatrix))
     {
         TRACE("Found TID_D3DRMFrameTransformMatrix\n");
 
+        /* Cannot be requested */
         if (parent_frame)
         {
             D3DRMMATRIX4D matrix;




More information about the wine-patches mailing list