On 7 June 2017 at 12:38, Nikolay Sivov <nsivov(a)codeweavers.com> wrote:
@@ -1165,12 +1169,13 @@ HRESULT load_mesh_data(IDirect3DRMMeshBuilder3 *iface, IDirectXFileData *pData, mesh_builder->nb_normals = *(DWORD*)ptr; nb_faces_normals = *(DWORD*)(ptr + sizeof(DWORD) + mesh_builder->nb_normals * sizeof(D3DVECTOR));
- TRACE("MeshNormals: nb_normals = %d, nb_faces_normals = %d\n", mesh_builder->nb_normals, nb_faces_normals); + TRACE("MeshNormals: nb_normals = %lu, nb_faces_normals = %d\n", mesh_builder->nb_normals, nb_faces_normals); if (nb_faces_normals != mesh_builder->nb_faces) - WARN("nb_face_normals (%d) != nb_faces (%d)\n", nb_faces_normals, mesh_builder->nb_normals); + WARN("nb_face_normals (%d) != nb_faces (%d)\n", nb_faces_normals, mesh_builder->nb_faces);
- mesh_builder->pNormals = HeapAlloc(GetProcessHeap(), 0, mesh_builder->nb_normals * sizeof(D3DVECTOR)); - memcpy(mesh_builder->pNormals, ptr + sizeof(DWORD), mesh_builder->nb_normals * sizeof(D3DVECTOR)); + d3drm_array_reserve((void **)&mesh_builder->normals, &mesh_builder->normals_size, + mesh_builder->nb_normals + 1, sizeof(*mesh_builder->normals)); That's not quite equivalent, but probably harmless.
@@ -1379,8 +1384,8 @@ HRESULT load_mesh_data(IDirect3DRMMeshBuilder3 *iface, IDirectXFileData *pData, if (!mesh_builder->nb_normals) { /* Allocate normals, one per vertex */ - mesh_builder->pNormals = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, mesh_builder->nb_vertices * sizeof(D3DVECTOR)); - if (!mesh_builder->pNormals) + if (!d3drm_array_reserve((void **)&mesh_builder->normals, &mesh_builder->normals_size, + mesh_builder->nb_normals + 1, sizeof(*mesh_builder->normals))) This one isn't quite equivalent either, and less harmless.
@@ -1445,7 +1450,7 @@ HRESULT load_mesh_data(IDirect3DRMMeshBuilder3 *iface, IDirectXFileData *pData, } *(faces_data_ptr + faces_data_size++) = vertex_idx; /* Add face normal to vertex normal */ - D3DRMVectorAdd(&mesh_builder->pNormals[vertex_idx], &mesh_builder->pNormals[vertex_idx], &face_normal); + D3DRMVectorAdd(&mesh_builder->normals[vertex_idx], &mesh_builder->normals[vertex_idx], &face_normal); In particular, note that this line depends on the initial vertex normals being {0.0f, 0.0f, 0.0f}.