d3dx9/tests: Partially test front and back faces for D3DXCreateText.

This commit is contained in:
Dylan Smith 2011-03-09 08:26:58 -05:00 committed by Alexandre Julliard
parent b06a6c84ac
commit ed3ce3c91b
1 changed files with 95 additions and 8 deletions

View File

@ -2542,7 +2542,7 @@ error:
return hr == D3D_OK; return hr == D3D_OK;
} }
static void compare_text_outline_mesh(const char *name, ID3DXMesh *d3dxmesh, struct mesh *mesh, int textlen) static void compare_text_outline_mesh(const char *name, ID3DXMesh *d3dxmesh, struct mesh *mesh, int textlen, float extrusion)
{ {
HRESULT hr; HRESULT hr;
DWORD number_of_vertices, number_of_faces; DWORD number_of_vertices, number_of_faces;
@ -2652,6 +2652,7 @@ static void compare_text_outline_mesh(const char *name, ID3DXMesh *d3dxmesh, str
{ {
int nb_outline_vertices1, nb_outline_faces1; int nb_outline_vertices1, nb_outline_faces1;
int nb_outline_vertices2, nb_outline_faces2; int nb_outline_vertices2, nb_outline_faces2;
int nb_back_vertices, nb_back_faces;
int first_vtx1, first_vtx2; int first_vtx1, first_vtx2;
int first_face1, first_face2; int first_face1, first_face2;
int j; int j;
@ -2726,21 +2727,107 @@ static void compare_text_outline_mesh(const char *name, ID3DXMesh *d3dxmesh, str
face_idx1 = first_face1 + nb_outline_faces1; face_idx1 = first_face1 + nb_outline_faces1;
face_idx2 = first_face2 + nb_outline_faces2; face_idx2 = first_face2 + nb_outline_faces2;
/* skip to the outline for the next glyph */ /* partial test on back vertices and faces */
first_vtx1 = vtx_idx1;
for (; vtx_idx1 < number_of_vertices; vtx_idx1++) { for (; vtx_idx1 < number_of_vertices; vtx_idx1++) {
if (vertices[vtx_idx1].normal.z == 0) struct vertex vtx;
break;
} if (vertices[vtx_idx1].normal.z != 1.0f)
for (; vtx_idx2 < mesh->number_of_vertices; vtx_idx2++) {
if (mesh->vertices[vtx_idx2].normal.z == 0)
break; break;
vtx.position.z = 0.0f;
vtx.normal.x = 0.0f;
vtx.normal.y = 0.0f;
vtx.normal.z = 1.0f;
ok(compare(vertices[vtx_idx1].position.z, vtx.position.z),
"Test %s, glyph %d, vertex position.z %d, result %g, expected %g\n", name, i, vtx_idx1,
vertices[vtx_idx1].position.z, vtx.position.z);
ok(compare_vec3(vertices[vtx_idx1].normal, vtx.normal),
"Test %s, glyph %d, vertex normal %d, result (%g, %g, %g), expected (%g, %g, %g)\n", name, i, vtx_idx1,
vertices[vtx_idx1].normal.x, vertices[vtx_idx1].normal.y, vertices[vtx_idx1].normal.z,
vtx.normal.x, vtx.normal.y, vtx.normal.z);
} }
nb_back_vertices = vtx_idx1 - first_vtx1;
first_face1 = face_idx1;
for (; face_idx1 < number_of_faces; face_idx1++) for (; face_idx1 < number_of_faces; face_idx1++)
{ {
const D3DXVECTOR3 *vtx1, *vtx2, *vtx3;
D3DXVECTOR3 normal;
D3DXVECTOR3 v1 = {0, 0, 0};
D3DXVECTOR3 v2 = {0, 0, 0};
D3DXVECTOR3 forward = {0.0f, 0.0f, 1.0f};
if (faces[face_idx1][0] >= vtx_idx1 || if (faces[face_idx1][0] >= vtx_idx1 ||
faces[face_idx1][1] >= vtx_idx1 || faces[face_idx1][1] >= vtx_idx1 ||
faces[face_idx1][2] >= vtx_idx1) faces[face_idx1][2] >= vtx_idx1)
break; break;
vtx1 = &vertices[faces[face_idx1][0]].position;
vtx2 = &vertices[faces[face_idx1][1]].position;
vtx3 = &vertices[faces[face_idx1][2]].position;
D3DXVec3Subtract(&v1, vtx2, vtx1);
D3DXVec3Subtract(&v2, vtx3, vtx2);
D3DXVec3Cross(&normal, &v1, &v2);
D3DXVec3Normalize(&normal, &normal);
ok(compare_vec3(normal, forward),
"Test %s, glyph %d, face %d normal, result (%g, %g, %g), expected (%g, %g, %g)\n", name, i, face_idx1,
normal.x, normal.y, normal.z, forward.x, forward.y, forward.z);
}
nb_back_faces = face_idx1 - first_face1;
/* compare front and back faces & vertices */
if (extrusion == 0.0f) {
/* Oddly there are only back faces in this case */
nb_back_vertices /= 2;
nb_back_faces /= 2;
face_idx1 -= nb_back_faces;
vtx_idx1 -= nb_back_vertices;
}
for (j = 0; j < nb_back_vertices; j++)
{
struct vertex vtx = vertices[first_vtx1];
vtx.position.z = -extrusion;
vtx.normal.x = 0.0f;
vtx.normal.y = 0.0f;
vtx.normal.z = extrusion == 0.0f ? 1.0f : -1.0f;
ok(compare_vec3(vertices[vtx_idx1].position, vtx.position),
"Test %s, glyph %d, vertex position %d, result (%g, %g, %g), expected (%g, %g, %g)\n", name, i, vtx_idx1,
vertices[vtx_idx1].position.x, vertices[vtx_idx1].position.y, vertices[vtx_idx1].position.z,
vtx.position.x, vtx.position.y, vtx.position.z);
ok(compare_vec3(vertices[vtx_idx1].normal, vtx.normal),
"Test %s, glyph %d, vertex normal %d, result (%g, %g, %g), expected (%g, %g, %g)\n", name, i, vtx_idx1,
vertices[vtx_idx1].normal.x, vertices[vtx_idx1].normal.y, vertices[vtx_idx1].normal.z,
vtx.normal.x, vtx.normal.y, vtx.normal.z);
vtx_idx1++;
first_vtx1++;
}
for (j = 0; j < nb_back_faces; j++)
{
int f1, f2;
if (extrusion == 0.0f) {
f1 = 1;
f2 = 2;
} else {
f1 = 2;
f2 = 1;
}
ok(faces[face_idx1][0] == faces[first_face1][0] + nb_back_vertices &&
faces[face_idx1][1] == faces[first_face1][f1] + nb_back_vertices &&
faces[face_idx1][2] == faces[first_face1][f2] + nb_back_vertices,
"Test %s, glyph %d, face %d, result (%d, %d, %d), expected (%d, %d, %d)\n", name, i, face_idx1,
faces[face_idx1][0], faces[face_idx1][1], faces[face_idx1][2],
faces[first_face1][0] - nb_back_faces,
faces[first_face1][f1] - nb_back_faces,
faces[first_face1][f2] - nb_back_faces);
first_face1++;
face_idx1++;
}
/* skip to the outline for the next glyph */
for (; vtx_idx2 < mesh->number_of_vertices; vtx_idx2++) {
if (mesh->vertices[vtx_idx2].normal.z == 0)
break;
} }
for (; face_idx2 < mesh->number_of_faces; face_idx2++) for (; face_idx2 < mesh->number_of_faces; face_idx2++)
{ {
@ -2820,7 +2907,7 @@ static void test_createtext(IDirect3DDevice9 *device, HDC hdc, LPCSTR text, FLOA
} }
mesh.fvf = D3DFVF_XYZ | D3DFVF_NORMAL; mesh.fvf = D3DFVF_XYZ | D3DFVF_NORMAL;
compare_text_outline_mesh(name, d3dxmesh, &mesh, strlen(text)); compare_text_outline_mesh(name, d3dxmesh, &mesh, strlen(text), extrusion);
free_mesh(&mesh); free_mesh(&mesh);