On 7 June 2017 at 12:38, Nikolay Sivov nsivov@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}.